@bitgo-beta/sdk-core 8.2.1-beta.21 → 8.2.1-beta.2100

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 (892) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +43 -31
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +61 -2
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +118 -6
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.d.ts +0 -1
  49. package/dist/src/account-lib/index.d.ts.map +1 -1
  50. package/dist/src/account-lib/index.js +23 -10
  51. package/dist/src/account-lib/mpc/curves/ed25519.d.ts +4 -18
  52. package/dist/src/account-lib/mpc/curves/ed25519.d.ts.map +1 -1
  53. package/dist/src/account-lib/mpc/curves/ed25519.js +6 -60
  54. package/dist/src/account-lib/mpc/index.d.ts +4 -4
  55. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  56. package/dist/src/account-lib/mpc/index.js +11 -7
  57. package/dist/src/account-lib/mpc/shamir.d.ts +5 -37
  58. package/dist/src/account-lib/mpc/shamir.d.ts.map +1 -1
  59. package/dist/src/account-lib/mpc/shamir.js +6 -130
  60. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +40 -11
  61. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  62. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +521 -378
  63. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  64. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  65. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  66. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  67. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +73 -52
  68. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  69. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  70. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +1 -2
  71. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  73. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  74. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -4
  75. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  76. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  77. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  78. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  79. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  80. package/dist/src/account-lib/mpc/util.js +24 -1
  81. package/dist/src/account-lib/staking/index.js +6 -2
  82. package/dist/src/account-lib/staking/utils.js +3 -3
  83. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  84. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  85. package/dist/src/account-lib/util/crypto.js +69 -38
  86. package/dist/src/api/bip32path.js +2 -3
  87. package/dist/src/api/index.js +6 -2
  88. package/dist/src/api/types.d.ts +37 -0
  89. package/dist/src/api/types.d.ts.map +1 -1
  90. package/dist/src/api/types.js +8 -1
  91. package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
  92. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  93. package/dist/src/bitgo/address-book/address-book.js +150 -0
  94. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  95. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  96. package/dist/src/{openssl → bitgo/address-book}/index.js +8 -3
  97. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  98. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  99. package/dist/src/bitgo/address-book/types.js +3 -0
  100. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +139 -12
  101. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  102. package/dist/src/bitgo/baseCoin/baseCoin.js +217 -16
  103. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +366 -29
  104. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  105. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  106. package/dist/src/bitgo/baseCoin/index.js +6 -2
  107. package/dist/src/bitgo/bip32util.d.ts +3 -16
  108. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  109. package/dist/src/bitgo/bip32util.js +4 -56
  110. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  111. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  112. package/dist/src/bitgo/bitcoin.js +26 -13
  113. package/dist/src/bitgo/bitgoBase.d.ts +19 -5
  114. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  115. package/dist/src/bitgo/bitgoBase.js +1 -1
  116. package/dist/src/bitgo/coinFactory.d.ts +24 -3
  117. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  118. package/dist/src/bitgo/coinFactory.js +35 -3
  119. package/dist/src/bitgo/config.d.ts +3 -89
  120. package/dist/src/bitgo/config.d.ts.map +1 -1
  121. package/dist/src/bitgo/config.js +26 -15
  122. package/dist/src/bitgo/defi/defiVault.d.ts +171 -0
  123. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  124. package/dist/src/bitgo/defi/defiVault.js +445 -0
  125. package/dist/src/bitgo/defi/iDefiVault.d.ts +101 -0
  126. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  127. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  128. package/dist/src/bitgo/defi/index.d.ts +3 -0
  129. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  130. package/dist/src/bitgo/defi/index.js +22 -0
  131. package/dist/src/bitgo/ecdh.d.ts +0 -1
  132. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  133. package/dist/src/bitgo/ecdh.js +26 -13
  134. package/dist/src/bitgo/enterprise/enterprise.d.ts +22 -14
  135. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  136. package/dist/src/bitgo/enterprise/enterprise.js +72 -31
  137. package/dist/src/bitgo/enterprise/enterprises.d.ts +6 -0
  138. package/dist/src/bitgo/enterprise/enterprises.d.ts.map +1 -1
  139. package/dist/src/bitgo/enterprise/enterprises.js +48 -9
  140. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +9 -7
  141. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  142. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  143. package/dist/src/bitgo/enterprise/iEnterprises.d.ts +2 -0
  144. package/dist/src/bitgo/enterprise/iEnterprises.d.ts.map +1 -1
  145. package/dist/src/bitgo/enterprise/iEnterprises.js +1 -1
  146. package/dist/src/bitgo/enterprise/index.js +6 -2
  147. package/dist/src/bitgo/environments.d.ts +88 -5
  148. package/dist/src/bitgo/environments.d.ts.map +1 -1
  149. package/dist/src/bitgo/environments.js +436 -30
  150. package/dist/src/bitgo/errors.d.ts +189 -1
  151. package/dist/src/bitgo/errors.d.ts.map +1 -1
  152. package/dist/src/bitgo/errors.js +187 -3
  153. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  154. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  155. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  156. package/dist/src/bitgo/index.d.ts +6 -1
  157. package/dist/src/bitgo/index.d.ts.map +1 -1
  158. package/dist/src/bitgo/index.js +32 -11
  159. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  160. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  161. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  162. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  163. package/dist/src/bitgo/internal/index.js +6 -2
  164. package/dist/src/bitgo/internal/internal.js +5 -6
  165. package/dist/src/bitgo/internal/keycard.d.ts +13 -8
  166. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  167. package/dist/src/bitgo/internal/keycard.js +63 -48
  168. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  169. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  170. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  171. package/dist/src/bitgo/keychain/iKeychains.d.ts +189 -10
  172. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  173. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  174. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  175. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  176. package/dist/src/bitgo/keychain/index.js +7 -2
  177. package/dist/src/bitgo/keychain/keychains.d.ts +106 -13
  178. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  179. package/dist/src/bitgo/keychain/keychains.js +451 -93
  180. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +126 -91
  181. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  182. package/dist/src/bitgo/keychain/ovcJsonCodec.js +53 -32
  183. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  184. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  185. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  186. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  187. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  188. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  189. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  190. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  191. package/dist/src/bitgo/market/index.js +6 -2
  192. package/dist/src/bitgo/market/markets.js +23 -9
  193. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +7 -1
  194. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  195. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  196. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  197. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  198. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  199. package/dist/src/bitgo/pendingApproval/pendingApproval.js +251 -110
  200. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  201. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  202. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  203. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  204. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  205. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  206. package/dist/src/bitgo/proofs/index.js +6 -0
  207. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  208. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  209. package/dist/src/bitgo/proofs/types.js +80 -0
  210. package/dist/src/bitgo/recovery/index.js +6 -2
  211. package/dist/src/bitgo/recovery/initiate.d.ts +20 -4
  212. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  213. package/dist/src/bitgo/recovery/initiate.js +49 -41
  214. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +13 -0
  215. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  216. package/dist/src/bitgo/safe/derivableEd25519Pub.js +35 -0
  217. package/dist/src/bitgo/safe/iSafe.d.ts +124 -0
  218. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  219. package/dist/src/bitgo/safe/iSafe.js +3 -0
  220. package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
  221. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  222. package/dist/src/bitgo/safe/iSafes.js +3 -0
  223. package/dist/src/bitgo/safe/index.d.ts +8 -0
  224. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  225. package/dist/src/bitgo/safe/index.js +24 -0
  226. package/dist/src/bitgo/safe/recovery.d.ts +92 -0
  227. package/dist/src/bitgo/safe/recovery.d.ts.map +1 -0
  228. package/dist/src/bitgo/safe/recovery.js +148 -0
  229. package/dist/src/bitgo/safe/rootCoin.d.ts +15 -0
  230. package/dist/src/bitgo/safe/rootCoin.d.ts.map +1 -0
  231. package/dist/src/bitgo/safe/rootCoin.js +47 -0
  232. package/dist/src/bitgo/safe/safe.d.ts +88 -0
  233. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  234. package/dist/src/bitgo/safe/safe.js +409 -0
  235. package/dist/src/bitgo/safe/safes.d.ts +102 -0
  236. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  237. package/dist/src/bitgo/safe/safes.js +281 -0
  238. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  239. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  240. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  241. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  242. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  243. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  244. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  245. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  246. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  247. package/dist/src/bitgo/staking/iStakingWallet.d.ts +197 -8
  248. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  249. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  250. package/dist/src/bitgo/staking/index.d.ts +3 -0
  251. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  252. package/dist/src/bitgo/staking/index.js +9 -2
  253. package/dist/src/bitgo/staking/stakingWallet.d.ts +27 -8
  254. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  255. package/dist/src/bitgo/staking/stakingWallet.js +161 -7
  256. package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -33
  257. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  258. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  259. package/dist/src/bitgo/trading/index.d.ts +1 -15
  260. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  261. package/dist/src/bitgo/trading/index.js +7 -17
  262. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  263. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  264. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  265. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  266. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  267. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  268. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  269. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  270. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  271. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  272. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  273. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  274. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  275. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  276. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  277. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  278. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  279. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  280. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  281. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  282. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  283. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  284. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  285. package/dist/src/bitgo/trading/network/index.js +21 -0
  286. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  287. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  288. package/dist/src/bitgo/trading/network/network.js +94 -0
  289. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  290. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  291. package/dist/src/bitgo/trading/network/types.js +3 -0
  292. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  293. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  294. package/dist/src/bitgo/trading/network/utils.js +54 -0
  295. package/dist/src/bitgo/trading/tradingAccount.d.ts +23 -33
  296. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  297. package/dist/src/bitgo/trading/tradingAccount.js +58 -97
  298. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
  299. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  300. package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
  301. package/dist/src/bitgo/tss/common.d.ts +52 -6
  302. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  303. package/dist/src/bitgo/tss/common.js +144 -15
  304. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  305. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  306. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +85 -81
  307. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  308. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  309. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  310. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  311. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  312. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  313. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  314. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  315. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  316. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +19 -9
  317. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  318. package/dist/src/bitgo/tss/eddsa/eddsa.js +56 -38
  319. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  320. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  321. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  322. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  323. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  324. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  325. package/dist/src/bitgo/tss/index.d.ts +3 -2
  326. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  327. package/dist/src/bitgo/tss/index.js +26 -10
  328. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +79 -0
  329. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  330. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +179 -0
  331. package/dist/src/bitgo/tss/types.d.ts +19 -0
  332. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  333. package/dist/src/bitgo/tss/types.js +2 -2
  334. package/dist/src/bitgo/types.d.ts +3 -3
  335. package/dist/src/bitgo/types.d.ts.map +1 -1
  336. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +14 -0
  337. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  338. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +87 -10
  339. package/dist/src/bitgo/utils/codecProps.d.ts +7 -0
  340. package/dist/src/bitgo/utils/codecProps.d.ts.map +1 -0
  341. package/dist/src/bitgo/utils/codecProps.js +54 -0
  342. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  343. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  344. package/dist/src/bitgo/utils/codecs.js +59 -0
  345. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  346. package/dist/src/bitgo/utils/decode.js +30 -16
  347. package/dist/src/bitgo/utils/index.d.ts +5 -2
  348. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  349. package/dist/src/bitgo/utils/index.js +28 -11
  350. package/dist/src/bitgo/utils/messageTypes.d.ts +46 -0
  351. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  352. package/dist/src/bitgo/utils/messageTypes.js +23 -0
  353. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  354. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  355. package/dist/src/bitgo/utils/mpcUtils.js +208 -14
  356. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  357. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  358. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  359. package/dist/src/bitgo/utils/opengpgUtils.d.ts +13 -9
  360. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  361. package/dist/src/bitgo/utils/opengpgUtils.js +87 -73
  362. package/dist/src/bitgo/utils/postWithCodec.d.ts +18 -0
  363. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -0
  364. package/dist/src/bitgo/utils/postWithCodec.js +25 -0
  365. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  366. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  367. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  368. package/dist/src/bitgo/utils/siws.d.ts +17 -0
  369. package/dist/src/bitgo/utils/siws.d.ts.map +1 -0
  370. package/dist/src/bitgo/utils/siws.js +171 -0
  371. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  372. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  373. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  374. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  375. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  376. package/dist/src/bitgo/utils/triple.js +2 -3
  377. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  378. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  379. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  380. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +157 -28
  381. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  382. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +381 -43
  383. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +620 -44
  384. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  385. package/dist/src/bitgo/utils/tss/baseTypes.js +60 -10
  386. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  387. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  388. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  389. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  390. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  391. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  392. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +63 -53
  393. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  394. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +356 -327
  395. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +240 -0
  396. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  397. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1076 -0
  398. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +16 -0
  399. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  400. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +37 -0
  401. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts +69 -0
  402. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.d.ts.map +1 -0
  403. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaVrfMPCv2.js +442 -0
  404. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +5 -0
  405. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  406. package/dist/src/bitgo/utils/tss/ecdsa/index.js +11 -2
  407. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +15 -9
  408. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  409. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  410. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +125 -0
  411. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  412. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  413. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  414. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  415. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +119 -0
  416. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  417. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  418. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  419. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +59 -14
  420. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  421. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +318 -99
  422. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +260 -0
  423. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  424. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +995 -0
  425. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +11 -0
  426. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  427. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +26 -0
  428. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +42 -0
  429. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  430. package/dist/src/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +267 -0
  431. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +5 -0
  432. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  433. package/dist/src/bitgo/utils/tss/eddsa/index.js +30 -8
  434. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +15 -7
  435. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  436. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  437. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +75 -0
  438. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  439. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  440. package/dist/src/bitgo/utils/tss/index.d.ts +7 -0
  441. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  442. package/dist/src/bitgo/utils/tss/index.js +31 -10
  443. package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts +40 -0
  444. package/dist/src/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
  445. package/dist/src/bitgo/utils/tss/keyShareEnvelope.js +103 -0
  446. package/dist/src/bitgo/utils/tss/keyVerification.d.ts +45 -0
  447. package/dist/src/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
  448. package/dist/src/bitgo/utils/tss/keyVerification.js +192 -0
  449. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  450. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  451. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  452. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +42 -0
  453. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  454. package/dist/src/bitgo/utils/tss/recipientUtils.js +168 -0
  455. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
  456. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
  457. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
  458. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
  459. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
  460. package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
  461. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
  462. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  463. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
  464. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
  465. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
  466. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
  467. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  468. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  469. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  470. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
  471. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
  472. package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
  473. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  474. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  475. package/dist/src/bitgo/utils/txRequest.js +49 -0
  476. package/dist/src/bitgo/utils/util.js +24 -10
  477. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  478. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  479. package/dist/src/bitgo/utils/wallet.js +48 -0
  480. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  481. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  482. package/dist/src/bitgo/v1Wallets.js +3 -0
  483. package/dist/src/bitgo/wallet/BuildParams.d.ts +201 -0
  484. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -0
  485. package/dist/src/bitgo/wallet/BuildParams.js +202 -0
  486. package/dist/src/bitgo/wallet/iWallet.d.ts +682 -30
  487. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  488. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  489. package/dist/src/bitgo/wallet/iWallets.d.ts +325 -19
  490. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  491. package/dist/src/bitgo/wallet/iWallets.js +84 -3
  492. package/dist/src/bitgo/wallet/index.d.ts +1 -0
  493. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  494. package/dist/src/bitgo/wallet/index.js +7 -2
  495. package/dist/src/bitgo/wallet/safeKeychain.d.ts +75 -0
  496. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
  497. package/dist/src/bitgo/wallet/safeKeychain.js +151 -0
  498. package/dist/src/bitgo/wallet/wallet.d.ts +485 -29
  499. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  500. package/dist/src/bitgo/wallet/wallet.js +2723 -478
  501. package/dist/src/bitgo/wallet/wallets.d.ts +124 -9
  502. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  503. package/dist/src/bitgo/wallet/wallets.js +1398 -181
  504. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  505. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  506. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  507. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  508. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  509. package/dist/src/bitgo/walletUtil/index.js +19 -0
  510. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  511. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  512. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  513. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  514. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  515. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  516. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  517. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  518. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  519. package/dist/src/bitgo/webauthn/base64url.d.ts +16 -0
  520. package/dist/src/bitgo/webauthn/base64url.d.ts.map +1 -0
  521. package/dist/src/bitgo/webauthn/base64url.js +27 -0
  522. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts +18 -0
  523. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.d.ts.map +1 -0
  524. package/dist/src/bitgo/webauthn/deriveEnterpriseSalt.js +26 -0
  525. package/dist/src/bitgo/webauthn/derivePassword.d.ts +11 -0
  526. package/dist/src/bitgo/webauthn/derivePassword.d.ts.map +1 -0
  527. package/dist/src/bitgo/webauthn/derivePassword.js +16 -0
  528. package/dist/src/bitgo/webauthn/index.d.ts +5 -0
  529. package/dist/src/bitgo/webauthn/index.d.ts.map +1 -0
  530. package/dist/src/bitgo/webauthn/index.js +21 -0
  531. package/dist/src/bitgo/webauthn/types.d.ts +18 -0
  532. package/dist/src/bitgo/webauthn/types.d.ts.map +1 -0
  533. package/dist/src/bitgo/webauthn/types.js +3 -0
  534. package/dist/src/bitgo/webhook/index.js +6 -2
  535. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  536. package/dist/src/coins/fiat.d.ts +45 -0
  537. package/dist/src/coins/fiat.d.ts.map +1 -0
  538. package/dist/src/coins/fiat.js +94 -0
  539. package/dist/src/coins/index.d.ts +1 -6
  540. package/dist/src/coins/index.d.ts.map +1 -1
  541. package/dist/src/coins/index.js +7 -8
  542. package/dist/src/coins/ofc.d.ts +21 -2
  543. package/dist/src/coins/ofc.d.ts.map +1 -1
  544. package/dist/src/coins/ofc.js +29 -3
  545. package/dist/src/coins/ofcToken.d.ts +15 -4
  546. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  547. package/dist/src/coins/ofcToken.js +43 -5
  548. package/dist/src/coins/susd.d.ts +3 -2
  549. package/dist/src/coins/susd.d.ts.map +1 -1
  550. package/dist/src/coins/susd.js +5 -1
  551. package/dist/src/common.js +27 -13
  552. package/dist/src/index.d.ts +13 -1
  553. package/dist/src/index.d.ts.map +1 -1
  554. package/dist/src/index.js +42 -11
  555. package/dist/src/lightning.d.ts +20 -0
  556. package/dist/src/lightning.d.ts.map +1 -0
  557. package/dist/src/lightning.js +13 -0
  558. package/dist/src/units.js +5 -6
  559. package/dist/test/node.utils.d.ts +2 -0
  560. package/dist/test/node.utils.d.ts.map +1 -0
  561. package/dist/test/node.utils.js +5 -0
  562. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  563. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  564. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  565. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  566. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  567. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  568. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  569. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  570. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  571. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  572. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  573. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  574. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -0
  575. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
  576. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +279 -0
  577. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts +3 -0
  578. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts.map +1 -0
  579. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.js +24 -0
  580. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  581. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  582. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  583. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  584. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  585. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  586. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  587. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  588. package/dist/test/unit/bitgo/defi/defiVault.js +863 -0
  589. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  590. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  591. package/dist/test/unit/bitgo/environment.js +38 -0
  592. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  593. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  594. package/dist/test/unit/bitgo/errors.js +262 -0
  595. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  596. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  597. package/dist/test/unit/bitgo/keychain/keychains.js +426 -0
  598. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  599. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  600. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  601. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
  602. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  603. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +133 -0
  604. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +72 -0
  605. package/dist/test/unit/bitgo/safe/recovery.d.ts +2 -0
  606. package/dist/test/unit/bitgo/safe/recovery.d.ts.map +1 -0
  607. package/dist/test/unit/bitgo/safe/recovery.js +313 -0
  608. package/dist/test/unit/bitgo/safe/rootCoin.d.ts +2 -0
  609. package/dist/test/unit/bitgo/safe/rootCoin.d.ts.map +1 -0
  610. package/dist/test/unit/bitgo/safe/rootCoin.js +13 -0
  611. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  612. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  613. package/dist/test/unit/bitgo/safe/safe.js +585 -0
  614. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts +2 -0
  615. package/dist/test/unit/bitgo/safe/safeDerivation.d.ts.map +1 -0
  616. package/dist/test/unit/bitgo/safe/safeDerivation.js +75 -0
  617. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  618. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  619. package/dist/test/unit/bitgo/safe/safes.js +376 -0
  620. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  621. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  622. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  623. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  624. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  625. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  626. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  627. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  628. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  629. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
  630. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  631. package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
  632. package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
  633. package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
  634. package/dist/test/unit/bitgo/tss/common.js +77 -0
  635. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  636. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  637. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +249 -0
  638. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.d.ts +2 -0
  639. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -0
  640. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +66 -0
  641. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  642. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  643. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  644. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts +2 -0
  645. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.d.ts.map +1 -0
  646. package/dist/test/unit/bitgo/utils/mpcUtils.unwrap.js +109 -0
  647. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
  648. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
  649. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
  650. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  651. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  652. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  653. package/dist/test/unit/bitgo/utils/postWithCodec.d.ts +2 -0
  654. package/dist/test/unit/bitgo/utils/postWithCodec.d.ts.map +1 -0
  655. package/dist/test/unit/bitgo/utils/postWithCodec.js +73 -0
  656. package/dist/test/unit/bitgo/utils/siws.d.ts +2 -0
  657. package/dist/test/unit/bitgo/utils/siws.d.ts.map +1 -0
  658. package/dist/test/unit/bitgo/utils/siws.js +206 -0
  659. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  660. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  661. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  662. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  663. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  664. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  665. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  666. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  667. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  668. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  669. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  670. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1068 -0
  671. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  672. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  673. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  674. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  675. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  676. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  677. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  678. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  679. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +2410 -0
  680. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts +2 -0
  681. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.d.ts.map +1 -0
  682. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaVrfMPCv2.js +549 -0
  683. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  684. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  685. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +376 -0
  686. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts +2 -0
  687. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.d.ts.map +1 -0
  688. package/dist/test/unit/bitgo/utils/tss/keyShareEnvelope.js +83 -0
  689. package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts +2 -0
  690. package/dist/test/unit/bitgo/utils/tss/keyVerification.d.ts.map +1 -0
  691. package/dist/test/unit/bitgo/utils/tss/keyVerification.js +229 -0
  692. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  693. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  694. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  695. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  696. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  697. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +462 -0
  698. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  699. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  700. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
  701. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
  702. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
  703. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
  704. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
  705. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
  706. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
  707. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  708. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  709. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  710. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  711. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  712. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  713. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  714. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  715. package/dist/test/unit/bitgo/wallet/BuildParams.js +154 -0
  716. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.d.ts +2 -0
  717. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.d.ts.map +1 -0
  718. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +114 -0
  719. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  720. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  721. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  722. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  723. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  724. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  725. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  726. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  727. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  728. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  729. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  730. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  731. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  732. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  733. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  734. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  735. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  736. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  737. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  738. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  739. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  740. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
  741. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
  742. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +671 -0
  743. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
  744. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
  745. package/dist/test/unit/bitgo/wallet/safeShareWallet.js +303 -0
  746. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  747. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  748. package/dist/test/unit/bitgo/wallet/tokenApproval.js +210 -0
  749. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  750. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  751. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  752. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  753. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  754. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
  755. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  756. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  757. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  758. package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts +2 -0
  759. package/dist/test/unit/bitgo/wallet/walletVerifyKey.d.ts.map +1 -0
  760. package/dist/test/unit/bitgo/wallet/walletVerifyKey.js +160 -0
  761. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  762. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  763. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +304 -0
  764. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  765. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  766. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  767. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  768. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  769. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +853 -0
  770. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  771. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  772. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  773. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  774. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  775. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  776. package/dist/test/unit/coins/ofc.d.ts +2 -0
  777. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  778. package/dist/test/unit/coins/ofc.js +124 -0
  779. package/dist/test/unit/lightning.d.ts +2 -0
  780. package/dist/test/unit/lightning.d.ts.map +1 -0
  781. package/dist/test/unit/lightning.js +23 -0
  782. package/dist/test/unit/units.d.ts +2 -0
  783. package/dist/test/unit/units.d.ts.map +1 -0
  784. package/dist/test/unit/units.js +98 -0
  785. package/dist/tsconfig.tsbuildinfo +1 -8340
  786. package/package.json +31 -24
  787. package/.eslintignore +0 -5
  788. package/CHANGELOG.md +0 -662
  789. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  790. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  791. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  792. package/dist/src/account-lib/mpc/hdTree.d.ts +0 -31
  793. package/dist/src/account-lib/mpc/hdTree.d.ts.map +0 -1
  794. package/dist/src/account-lib/mpc/hdTree.js +0 -141
  795. package/dist/src/account-lib/mpc/types.d.ts +0 -5
  796. package/dist/src/account-lib/mpc/types.d.ts.map +0 -1
  797. package/dist/src/account-lib/mpc/types.js +0 -3
  798. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +0 -49
  799. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +0 -1
  800. package/dist/src/account-lib/util/ed25519KeyDeriver.js +0 -87
  801. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  802. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  803. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  804. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  805. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  806. package/dist/src/bitgo/lightning/index.js +0 -17
  807. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  808. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  809. package/dist/src/bitgo/lightning/lightning.js +0 -111
  810. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  811. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  812. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  813. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  814. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  815. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  816. package/dist/src/bitgo/trading/affirmation.d.ts +0 -35
  817. package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
  818. package/dist/src/bitgo/trading/affirmation.js +0 -53
  819. package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
  820. package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
  821. package/dist/src/bitgo/trading/affirmations.js +0 -45
  822. package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
  823. package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
  824. package/dist/src/bitgo/trading/iAffirmation.js +0 -13
  825. package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
  826. package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
  827. package/dist/src/bitgo/trading/iAffirmations.js +0 -3
  828. package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
  829. package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
  830. package/dist/src/bitgo/trading/iSettlement.js +0 -17
  831. package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
  832. package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
  833. package/dist/src/bitgo/trading/iSettlements.js +0 -3
  834. package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
  835. package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
  836. package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
  837. package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
  838. package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
  839. package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
  840. package/dist/src/bitgo/trading/lock.d.ts +0 -16
  841. package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
  842. package/dist/src/bitgo/trading/lock.js +0 -12
  843. package/dist/src/bitgo/trading/payload.d.ts +0 -22
  844. package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
  845. package/dist/src/bitgo/trading/payload.js +0 -3
  846. package/dist/src/bitgo/trading/settlement.d.ts +0 -16
  847. package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
  848. package/dist/src/bitgo/trading/settlement.js +0 -21
  849. package/dist/src/bitgo/trading/settlements.d.ts +0 -32
  850. package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
  851. package/dist/src/bitgo/trading/settlements.js +0 -61
  852. package/dist/src/bitgo/trading/trade.d.ts +0 -29
  853. package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
  854. package/dist/src/bitgo/trading/trade.js +0 -11
  855. package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
  856. package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
  857. package/dist/src/bitgo/trading/tradingPartner.js +0 -31
  858. package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
  859. package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
  860. package/dist/src/bitgo/trading/tradingPartners.js +0 -32
  861. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  862. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  863. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  864. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  865. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  866. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  867. package/dist/src/coins/fiateur.d.ts +0 -31
  868. package/dist/src/coins/fiateur.d.ts.map +0 -1
  869. package/dist/src/coins/fiateur.js +0 -57
  870. package/dist/src/coins/fiatgbp.d.ts +0 -31
  871. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  872. package/dist/src/coins/fiatgbp.js +0 -57
  873. package/dist/src/coins/fiatusd.d.ts +0 -31
  874. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  875. package/dist/src/coins/fiatusd.js +0 -57
  876. package/dist/src/coins/tfiateur.d.ts +0 -11
  877. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  878. package/dist/src/coins/tfiateur.js +0 -17
  879. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  880. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  881. package/dist/src/coins/tfiatgbp.js +0 -17
  882. package/dist/src/coins/tfiatusd.d.ts +0 -11
  883. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  884. package/dist/src/coins/tfiatusd.js +0 -17
  885. package/dist/src/openssl/index.d.ts +0 -2
  886. package/dist/src/openssl/index.d.ts.map +0 -1
  887. package/dist/src/openssl/openssl.d.ts +0 -12
  888. package/dist/src/openssl/openssl.d.ts.map +0 -1
  889. package/dist/src/openssl/openssl.js +0 -48
  890. package/dist/src/openssl/opensslbytes.d.ts +0 -4
  891. package/dist/src/openssl/opensslbytes.d.ts.map +0 -1
  892. package/dist/src/openssl/opensslbytes.js +0 -20
@@ -0,0 +1,863 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const assert_1 = __importDefault(require("assert"));
8
+ require("should");
9
+ const statics_1 = require("@bitgo-beta/statics");
10
+ const public_types_1 = require("@bitgo/public-types");
11
+ const src_1 = require("../../../../src");
12
+ describe('DefiVault', function () {
13
+ let wallet;
14
+ let defiVault;
15
+ let mockBitGo;
16
+ let mockBaseCoin;
17
+ // Helper to create a chainable request mock
18
+ function mockRequest(result) {
19
+ return {
20
+ send: sinon_1.default.stub().returnsThis(),
21
+ set: sinon_1.default.stub().returnsThis(),
22
+ query: sinon_1.default.stub().returnsThis(),
23
+ result: sinon_1.default.stub().resolves(result),
24
+ };
25
+ }
26
+ function makeConcreteVault(id) {
27
+ return {
28
+ id,
29
+ name: 'Concrete BTC Vault',
30
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
31
+ status: 'active',
32
+ coin: 'btc',
33
+ assetToken: 'btc',
34
+ shareToken: 'cbtc',
35
+ riskManager: 'manager-1',
36
+ custodyType: 'qualified',
37
+ vaultContractAddress: '0xVaultContract',
38
+ };
39
+ }
40
+ function makeMorphoVault(id) {
41
+ return {
42
+ id,
43
+ name: 'Morpho USDC Vault',
44
+ protocol: public_types_1.VaultProtocol.MORPHO,
45
+ status: 'active',
46
+ coin: 'eth',
47
+ assetToken: 'usdc',
48
+ shareToken: 'musdc',
49
+ riskManager: 'manager-2',
50
+ custodyType: 'qualified',
51
+ vaultContractAddress: '0xMorphoVault',
52
+ };
53
+ }
54
+ function makeAaveVault(id) {
55
+ return {
56
+ id,
57
+ name: 'Aave V3 USDC Vault',
58
+ protocol: public_types_1.VaultProtocol.AAVE_V3,
59
+ status: 'active',
60
+ coin: 'eth',
61
+ assetToken: 'usdc',
62
+ shareToken: 'stataUSDC',
63
+ riskManager: 'manager-3',
64
+ custodyType: 'qualified',
65
+ vaultContractAddress: '0xAaveVault',
66
+ };
67
+ }
68
+ // A vault response whose `composition[]` no longer matches the strict
69
+ // GetVaultResponse codec — mirrors the prod incident where a display-only
70
+ // nested field was narrowed/removed server-side. The deposit dispatch path
71
+ // must not hard-fail on it because it only reads `protocol`.
72
+ function makeConcreteVaultWithStaleComposition(id) {
73
+ return {
74
+ ...makeConcreteVault(id),
75
+ composition: [{ asset: 'btc', apy: 'not-a-number' /* stale shape */ }],
76
+ };
77
+ }
78
+ beforeEach(function () {
79
+ mockBitGo = {
80
+ post: sinon_1.default.stub(),
81
+ get: sinon_1.default.stub(),
82
+ del: sinon_1.default.stub(),
83
+ url: sinon_1.default.stub().callsFake((path, version) => `https://bitgo.com/api/v${version}${path}`),
84
+ microservicesUrl: sinon_1.default.stub().callsFake((path) => `https://bitgo.com${path}`),
85
+ setRequestTracer: sinon_1.default.stub(),
86
+ };
87
+ mockBaseCoin = {
88
+ getFamily: sinon_1.default.stub().returns('eth'),
89
+ getConfig: sinon_1.default.stub().returns({ features: [statics_1.CoinFeature.EVM_COIN] }),
90
+ url: sinon_1.default.stub(),
91
+ keychains: sinon_1.default.stub(),
92
+ supportsTss: sinon_1.default.stub().returns(true),
93
+ getMPCAlgorithm: sinon_1.default.stub(),
94
+ };
95
+ const mockWalletData = {
96
+ id: 'test-wallet-id',
97
+ coin: 'eth',
98
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
99
+ enterprise: 'test-enterprise-id',
100
+ };
101
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
102
+ defiVault = wallet.defi;
103
+ });
104
+ afterEach(function () {
105
+ sinon_1.default.restore();
106
+ });
107
+ describe('getVaultConfig', function () {
108
+ it('should fetch vault config for a given vaultId', async function () {
109
+ const vaultConfig = {
110
+ id: 'vlt-concrete-1',
111
+ name: 'Concrete BTC Vault',
112
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
113
+ status: 'active',
114
+ coin: 'btc',
115
+ assetToken: 'btc',
116
+ shareToken: 'cbtc',
117
+ riskManager: 'manager-1',
118
+ custodyType: 'qualified',
119
+ vaultContractAddress: '0xVaultContract',
120
+ concreteConfig: {
121
+ sourceWalletId: 'src-wallet',
122
+ escrowWalletId: 'escrow-wallet',
123
+ escrowDepositAddress: '1ExampleBtcAddress',
124
+ positionWalletId: 'pos-wallet',
125
+ positionBaseAddress: '1PositionAddress',
126
+ },
127
+ };
128
+ const req = mockRequest(vaultConfig);
129
+ mockBitGo.get.returns(req);
130
+ const result = await defiVault.getVaultConfig({ vaultId: 'vlt-concrete-1' });
131
+ result.should.deepEqual(vaultConfig);
132
+ mockBitGo.get.calledWith('https://bitgo.com/api/defi-service/v1/vaults/vlt-concrete-1').should.be.true();
133
+ req.set.calledWith('enterprise-id', 'test-enterprise-id').should.be.true();
134
+ });
135
+ it('should throw if vaultId is missing', async function () {
136
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: '' }), {
137
+ message: 'vaultId is required',
138
+ });
139
+ });
140
+ it('should propagate errors from the API (e.g. 404)', async function () {
141
+ const req = mockRequest(null);
142
+ req.result.rejects(new Error('Not Found'));
143
+ mockBitGo.get.returns(req);
144
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: 'vlt-not-found' }), {
145
+ message: 'Not Found',
146
+ });
147
+ });
148
+ });
149
+ describe('getVaultProtocol', function () {
150
+ it('should fetch only the protocol for a given vaultId', async function () {
151
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-morpho-1')));
152
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-morpho-1' });
153
+ protocol.should.equal(public_types_1.VaultProtocol.MORPHO);
154
+ mockBitGo.get.calledWith('https://bitgo.com/api/defi-service/v1/vaults/vlt-morpho-1').should.be.true();
155
+ });
156
+ it('should return CONCRETE_BTCCX for a concrete vault', async function () {
157
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-concrete-1')));
158
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-concrete-1' });
159
+ protocol.should.equal(public_types_1.VaultProtocol.CONCRETE_BTCCX);
160
+ });
161
+ it('should tolerate a stale/invalid composition[] field the full GetVaultResponse codec would reject', async function () {
162
+ // The dispatch codec reads only `protocol`, so a display-only nested
163
+ // field going stale server-side must not break this call.
164
+ mockBitGo.get.returns(mockRequest(makeConcreteVaultWithStaleComposition('vlt-stale-1')));
165
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-stale-1' });
166
+ protocol.should.equal(public_types_1.VaultProtocol.CONCRETE_BTCCX);
167
+ });
168
+ it('should throw if vaultId is missing', async function () {
169
+ await assert_1.default.rejects(() => defiVault.getVaultProtocol({ vaultId: '' }), {
170
+ message: 'vaultId is required',
171
+ });
172
+ });
173
+ it('should propagate errors from the API (e.g. 404)', async function () {
174
+ const req = mockRequest(null);
175
+ req.result.rejects(new Error('Not Found'));
176
+ mockBitGo.get.returns(req);
177
+ await assert_1.default.rejects(() => defiVault.getVaultProtocol({ vaultId: 'vlt-not-found' }), {
178
+ message: 'Not Found',
179
+ });
180
+ });
181
+ });
182
+ describe('depositToVault', function () {
183
+ describe('concrete_btccx provider', function () {
184
+ it('should call sendMany once with defi-deposit type and no recipients', async function () {
185
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-1')));
186
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
187
+ pendingApproval: {
188
+ id: 'pa-uuid-123',
189
+ state: 'awaitingSignature',
190
+ },
191
+ });
192
+ const result = await defiVault.depositToVault({
193
+ vaultId: 'vlt-btc-1',
194
+ amount: '5000000',
195
+ });
196
+ // Returns ConcreteDepositResult shape
197
+ result.pendingApprovalId.should.equal('pa-uuid-123');
198
+ result.state.should.equal('awaitingSignature');
199
+ // Only one sendMany call — no second deposit sendMany
200
+ sendManyStub.calledOnce.should.be.true();
201
+ const callArgs = sendManyStub.firstCall.args[0];
202
+ callArgs.type.should.equal('defi-deposit');
203
+ callArgs.defiParams.vaultId.should.equal('vlt-btc-1');
204
+ callArgs.defiParams.amount.should.equal('5000000');
205
+ callArgs.defiParams.actionType.should.equal('defi-deposit');
206
+ // No recipients key at all
207
+ assert_1.default.strictEqual(callArgs.recipients, undefined);
208
+ });
209
+ it('should pass walletPassphrase when provided', async function () {
210
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-2')));
211
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
212
+ pendingApproval: { id: 'pa-uuid-456', state: 'awaitingSignature' },
213
+ });
214
+ await defiVault.depositToVault({
215
+ vaultId: 'vlt-btc-2',
216
+ amount: '1000000',
217
+ walletPassphrase: 'hunter2',
218
+ });
219
+ const callArgs = sendManyStub.firstCall.args[0];
220
+ callArgs.walletPassphrase.should.equal('hunter2');
221
+ });
222
+ it('should default state to awaitingSignature when absent from pendingApproval', async function () {
223
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-3')));
224
+ sinon_1.default.stub(wallet, 'sendMany').resolves({
225
+ pendingApproval: { id: 'pa-no-state' },
226
+ });
227
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-btc-3', amount: '1000000' });
228
+ result.state.should.equal('awaitingSignature');
229
+ });
230
+ it('should tolerate a stale/invalid composition[] field that the full GetVaultResponse codec would reject', async function () {
231
+ // Regression guard for the cross-repo codec-drift incident: the
232
+ // deposit dispatch path reads only `protocol`, so a display-only
233
+ // nested field going stale server-side must not break deposits.
234
+ mockBitGo.get.returns(mockRequest(makeConcreteVaultWithStaleComposition('vlt-btc-stale')));
235
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
236
+ pendingApproval: { id: 'pa-stale', state: 'awaitingSignature' },
237
+ });
238
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-btc-stale', amount: '1000000' });
239
+ result.pendingApprovalId.should.equal('pa-stale');
240
+ sendManyStub.calledOnce.should.be.true();
241
+ });
242
+ it('should throw when sendMany returns no pendingApproval', async function () {
243
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-4')));
244
+ sinon_1.default.stub(wallet, 'sendMany').resolves({ txRequest: { txRequestId: 'unexpected' } });
245
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-btc-4', amount: '1000000' }), {
246
+ message: 'defi-deposit sendMany response: unknown; unknown',
247
+ });
248
+ });
249
+ });
250
+ describe('morpho provider', function () {
251
+ it('should call sendMany for approve and deposit on happy path', async function () {
252
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
253
+ const operationId = 'op-uuid-123';
254
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
255
+ // WP writes operationId into the built tx's coinSpecific (full apiVersion),
256
+ // not into the intent — mirror that real shape here.
257
+ sendManyStub.onFirstCall().resolves({
258
+ txRequest: {
259
+ txRequestId: 'txreq-approve-1',
260
+ intent: { intentType: 'defi-approve' },
261
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
262
+ },
263
+ });
264
+ sendManyStub.onSecondCall().resolves({
265
+ txRequest: {
266
+ txRequestId: 'txreq-deposit-1',
267
+ intent: { intentType: 'defi-deposit' },
268
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
269
+ },
270
+ });
271
+ const result = await defiVault.depositToVault({
272
+ vaultId: 'vlt-galaxy-usdc',
273
+ amount: '1000000',
274
+ });
275
+ result.operationId.should.equal(operationId);
276
+ result.txRequestIds.approve.should.equal('txreq-approve-1');
277
+ result.txRequestIds.deposit.should.equal('txreq-deposit-1');
278
+ // Verify sendMany was called with correct params for approve
279
+ sendManyStub.calledTwice.should.be.true();
280
+ const approveArgs = sendManyStub.firstCall.args[0];
281
+ approveArgs.type.should.equal('defiApprove');
282
+ approveArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
283
+ approveArgs.defiParams.amount.should.equal('1000000');
284
+ // Verify sendMany was called with correct params for deposit
285
+ const depositArgs = sendManyStub.secondCall.args[0];
286
+ depositArgs.type.should.equal('defiDeposit');
287
+ depositArgs.defiParams.operationId.should.equal(operationId);
288
+ });
289
+ it('should extract operationId from the lite apiVersion coinSpecific', async function () {
290
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
291
+ const operationId = 'op-uuid-lite';
292
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
293
+ sendManyStub.onFirstCall().resolves({
294
+ txRequest: {
295
+ txRequestId: 'txreq-approve-lite',
296
+ intent: { intentType: 'defi-approve' },
297
+ unsignedTxs: [{ coinSpecific: { operationId } }],
298
+ },
299
+ });
300
+ sendManyStub.onSecondCall().resolves({
301
+ txRequest: { txRequestId: 'txreq-deposit-lite' },
302
+ });
303
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
304
+ result.operationId.should.equal(operationId);
305
+ const depositArgs = sendManyStub.secondCall.args[0];
306
+ depositArgs.defiParams.operationId.should.equal(operationId);
307
+ });
308
+ it('should fall back to intent.operationId for forward-compat', async function () {
309
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
310
+ const operationId = 'op-uuid-intent';
311
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
312
+ sendManyStub.onFirstCall().resolves({
313
+ txRequest: {
314
+ txRequestId: 'txreq-approve-intent',
315
+ intent: { intentType: 'defi-approve', operationId },
316
+ },
317
+ });
318
+ sendManyStub.onSecondCall().resolves({
319
+ txRequest: { txRequestId: 'txreq-deposit-intent' },
320
+ });
321
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
322
+ result.operationId.should.equal(operationId);
323
+ });
324
+ it('should throw when operationId is absent from the approve txRequest', async function () {
325
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
326
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
327
+ sendManyStub.onFirstCall().resolves({
328
+ txRequest: {
329
+ txRequestId: 'txreq-approve-missing',
330
+ intent: { intentType: 'defi-approve' },
331
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
332
+ },
333
+ });
334
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
335
+ message: 'operationId not found in approve txRequest response',
336
+ });
337
+ // Deposit sendMany must not be issued when the operationId is missing
338
+ sendManyStub.calledOnce.should.be.true();
339
+ });
340
+ // TODO(CGD-1709): Re-enable when active operation pre-flight check is restored
341
+ xit('should reject when an active operation already exists', async function () {
342
+ const preflightReq = mockRequest({
343
+ items: [{ operationId: 'existing-op-id', state: 'APPROVE_TX_REQUESTED' }],
344
+ });
345
+ mockBitGo.get.returns(preflightReq);
346
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), (err) => {
347
+ (err instanceof src_1.ActiveOperationExistsError).should.be.true();
348
+ err.operationId.should.equal('existing-op-id');
349
+ return true;
350
+ });
351
+ });
352
+ it('should propagate deposit sendMany failure without cleanup', async function () {
353
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
354
+ const operationId = 'op-uuid-456';
355
+ // Mock sendMany: approve succeeds, deposit fails
356
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
357
+ sendManyStub.onFirstCall().resolves({
358
+ txRequest: {
359
+ txRequestId: 'txreq-approve-2',
360
+ intent: { intentType: 'defi-approve' },
361
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
362
+ },
363
+ });
364
+ sendManyStub.onSecondCall().rejects(new Error('deposit creation failed'));
365
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
366
+ message: 'deposit creation failed',
367
+ });
368
+ // SDK does not attempt cleanup — reconciler handles orphaned approvals
369
+ mockBitGo.del.called.should.be.false();
370
+ });
371
+ it('should throw if vaultId is missing', async function () {
372
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
373
+ message: 'vaultId is required',
374
+ });
375
+ });
376
+ it('should throw if amount is missing', async function () {
377
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
378
+ message: 'amount is required',
379
+ });
380
+ });
381
+ });
382
+ describe('aave_v3 provider', function () {
383
+ it('should call sendMany for approve and deposit on happy path', async function () {
384
+ mockBitGo.get.returns(mockRequest(makeAaveVault('vlt-aave-usdc')));
385
+ const operationId = 'op-aave-123';
386
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
387
+ sendManyStub.onFirstCall().resolves({
388
+ txRequest: {
389
+ txRequestId: 'txreq-aave-approve-1',
390
+ intent: { intentType: 'defi-approve' },
391
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
392
+ },
393
+ });
394
+ sendManyStub.onSecondCall().resolves({
395
+ txRequest: {
396
+ txRequestId: 'txreq-aave-deposit-1',
397
+ intent: { intentType: 'defi-deposit' },
398
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
399
+ },
400
+ });
401
+ const result = await defiVault.depositToVault({
402
+ vaultId: 'vlt-aave-usdc',
403
+ amount: '1000000',
404
+ });
405
+ result.operationId.should.equal(operationId);
406
+ result.txRequestIds.approve.should.equal('txreq-aave-approve-1');
407
+ result.txRequestIds.deposit.should.equal('txreq-aave-deposit-1');
408
+ sendManyStub.calledTwice.should.be.true();
409
+ const approveArgs = sendManyStub.firstCall.args[0];
410
+ approveArgs.type.should.equal('defiApprove');
411
+ approveArgs.defiParams.should.deepEqual({ vaultId: 'vlt-aave-usdc', amount: '1000000' });
412
+ const depositArgs = sendManyStub.secondCall.args[0];
413
+ depositArgs.type.should.equal('defiDeposit');
414
+ depositArgs.defiParams.should.deepEqual({
415
+ vaultId: 'vlt-aave-usdc',
416
+ amount: '1000000',
417
+ operationId,
418
+ });
419
+ });
420
+ it('should extract operationId from the lite apiVersion coinSpecific', async function () {
421
+ mockBitGo.get.returns(mockRequest(makeAaveVault('vlt-aave-usdc')));
422
+ const operationId = 'op-aave-lite';
423
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
424
+ sendManyStub.onFirstCall().resolves({
425
+ txRequest: {
426
+ txRequestId: 'txreq-aave-approve-lite',
427
+ unsignedTxs: [{ coinSpecific: { operationId } }],
428
+ },
429
+ });
430
+ sendManyStub.onSecondCall().resolves({
431
+ txRequest: { txRequestId: 'txreq-aave-deposit-lite' },
432
+ });
433
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-aave-usdc', amount: '1000000' });
434
+ result.operationId.should.equal(operationId);
435
+ result.txRequestIds.approve.should.equal('txreq-aave-approve-lite');
436
+ result.txRequestIds.deposit.should.equal('txreq-aave-deposit-lite');
437
+ });
438
+ it('should throw when operationId is absent from the approve txRequest', async function () {
439
+ mockBitGo.get.returns(mockRequest(makeAaveVault('vlt-aave-usdc')));
440
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
441
+ sendManyStub.resolves({
442
+ txRequest: {
443
+ txRequestId: 'txreq-aave-approve-missing',
444
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
445
+ },
446
+ });
447
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-aave-usdc', amount: '1000000' }), {
448
+ message: 'operationId not found in approve txRequest response',
449
+ });
450
+ sendManyStub.calledOnce.should.be.true();
451
+ });
452
+ it('should propagate deposit sendMany failure without cleanup', async function () {
453
+ mockBitGo.get.returns(mockRequest(makeAaveVault('vlt-aave-usdc')));
454
+ const operationId = 'op-aave-failure';
455
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
456
+ sendManyStub.onFirstCall().resolves({
457
+ txRequest: {
458
+ txRequestId: 'txreq-aave-approve-failure',
459
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
460
+ },
461
+ });
462
+ sendManyStub.onSecondCall().rejects(new Error('Aave deposit creation failed'));
463
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-aave-usdc', amount: '1000000' }), {
464
+ message: 'Aave deposit creation failed',
465
+ });
466
+ mockBitGo.del.called.should.be.false();
467
+ });
468
+ });
469
+ it('should throw if vaultId is missing', async function () {
470
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
471
+ message: 'vaultId is required',
472
+ });
473
+ });
474
+ it('should throw if amount is missing', async function () {
475
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-1')));
476
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
477
+ message: 'amount is required',
478
+ });
479
+ });
480
+ });
481
+ describe('resumeDeposit', function () {
482
+ it('should issue the deposit sendMany for a partial operation', async function () {
483
+ const operation = {
484
+ operationId: 'op-resume-1',
485
+ walletId: 'test-wallet-id',
486
+ vaultId: 'vlt-galaxy-usdc',
487
+ type: 'DEPOSIT',
488
+ assetAmount: '1000000',
489
+ state: 'APPROVE_TX_REQUESTED',
490
+ txRequestId: 'txreq-approve-existing',
491
+ associatedTxRequestId: undefined,
492
+ createdAt: '2026-05-14T07:12:00Z',
493
+ updatedAt: '2026-05-14T07:12:00Z',
494
+ };
495
+ // getOperation call
496
+ const getOpReq = mockRequest(operation);
497
+ mockBitGo.get.returns(getOpReq);
498
+ // deposit sendMany
499
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
500
+ sendManyStub.resolves({
501
+ txRequest: {
502
+ txRequestId: 'txreq-deposit-resume',
503
+ intent: { intentType: 'defi-deposit', operationId: 'op-resume-1' },
504
+ },
505
+ });
506
+ const result = await defiVault.resumeDeposit({ operationId: 'op-resume-1' });
507
+ result.operationId.should.equal('op-resume-1');
508
+ result.txRequestIds.approve.should.equal('txreq-approve-existing');
509
+ result.txRequestIds.deposit.should.equal('txreq-deposit-resume');
510
+ // Verify sendMany was called with correct defiParams
511
+ const depositArgs = sendManyStub.firstCall.args[0];
512
+ depositArgs.type.should.equal('defiDeposit');
513
+ depositArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
514
+ depositArgs.defiParams.amount.should.equal('1000000');
515
+ depositArgs.defiParams.operationId.should.equal('op-resume-1');
516
+ });
517
+ it('should throw if deposit txRequest already exists', async function () {
518
+ const operation = {
519
+ operationId: 'op-already-done',
520
+ walletId: 'test-wallet-id',
521
+ vaultId: 'vlt-galaxy-usdc',
522
+ type: 'DEPOSIT',
523
+ assetAmount: '1000000',
524
+ state: 'DEPOSIT_TX_REQUESTED',
525
+ txRequestId: 'txreq-approve-x',
526
+ associatedTxRequestId: 'txreq-deposit-x',
527
+ createdAt: '2026-05-14T07:12:00Z',
528
+ updatedAt: '2026-05-14T07:12:00Z',
529
+ };
530
+ const getOpReq = mockRequest(operation);
531
+ mockBitGo.get.returns(getOpReq);
532
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: 'op-already-done' }), {
533
+ message: 'Deposit txRequest already exists for this operation; nothing to resume',
534
+ });
535
+ });
536
+ it('should throw if operationId is missing', async function () {
537
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: '' }), { message: 'operationId is required' });
538
+ });
539
+ });
540
+ describe('getOperation', function () {
541
+ it('should fetch an operation by ID', async function () {
542
+ const operation = {
543
+ operationId: 'op-get-1',
544
+ walletId: 'test-wallet-id',
545
+ vaultId: 'vlt-galaxy-usdc',
546
+ type: 'DEPOSIT',
547
+ assetAmount: '1000000',
548
+ state: 'COMPLETED',
549
+ txRequestId: 'txreq-1',
550
+ associatedTxRequestId: 'txreq-2',
551
+ createdAt: '2026-05-14T07:12:00Z',
552
+ updatedAt: '2026-05-14T07:18:00Z',
553
+ };
554
+ const req = mockRequest(operation);
555
+ mockBitGo.get.returns(req);
556
+ const result = await defiVault.getOperation({ operationId: 'op-get-1' });
557
+ result.should.deepEqual(operation);
558
+ });
559
+ it('should throw if operationId is missing', async function () {
560
+ await assert_1.default.rejects(() => defiVault.getOperation({ operationId: '' }), { message: 'operationId is required' });
561
+ });
562
+ });
563
+ describe('listOperations', function () {
564
+ it('should list operations for a vault', async function () {
565
+ const listResult = {
566
+ items: [
567
+ {
568
+ operationId: 'op-1',
569
+ walletId: 'test-wallet-id',
570
+ vaultId: 'vlt-galaxy-usdc',
571
+ type: 'DEPOSIT',
572
+ assetAmount: '1000000',
573
+ state: 'COMPLETED',
574
+ createdAt: '2026-05-14T07:12:00Z',
575
+ updatedAt: '2026-05-14T07:18:00Z',
576
+ },
577
+ ],
578
+ nextCursor: 'cursor-abc',
579
+ };
580
+ const req = mockRequest(listResult);
581
+ mockBitGo.get.returns(req);
582
+ const result = await defiVault.listOperations({
583
+ vaultId: 'vlt-galaxy-usdc',
584
+ state: 'COMPLETED',
585
+ limit: 10,
586
+ });
587
+ result.items.length.should.equal(1);
588
+ result.nextCursor.should.equal('cursor-abc');
589
+ // Verify query params
590
+ const queryArgs = req.query.firstCall.args[0];
591
+ queryArgs.vaultId.should.equal('vlt-galaxy-usdc');
592
+ queryArgs.state.should.equal('COMPLETED');
593
+ queryArgs.limit.should.equal(10);
594
+ });
595
+ it('should throw if vaultId is missing', async function () {
596
+ await assert_1.default.rejects(() => defiVault.listOperations({ vaultId: '' }), { message: 'vaultId is required' });
597
+ });
598
+ });
599
+ describe('withdrawFromVault', function () {
600
+ it('should call sendMany with defiWithdraw and return operationId + txRequestId', async function () {
601
+ const operationId = 'op-withdraw-1';
602
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
603
+ sendManyStub.resolves({
604
+ txRequest: {
605
+ txRequestId: 'txreq-withdraw-1',
606
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
607
+ },
608
+ });
609
+ const result = await defiVault.withdrawFromVault({
610
+ vaultId: 'vlt-galaxy-usdc',
611
+ amount: '500000',
612
+ });
613
+ result.operationId.should.equal(operationId);
614
+ result.txRequestId.should.equal('txreq-withdraw-1');
615
+ sendManyStub.calledOnce.should.be.true();
616
+ const args = sendManyStub.firstCall.args[0];
617
+ args.type.should.equal('defiWithdraw');
618
+ args.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
619
+ args.defiParams.amount.should.equal('500000');
620
+ });
621
+ it('should extract operationId from lite apiVersion coinSpecific', async function () {
622
+ const operationId = 'op-withdraw-lite';
623
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
624
+ sendManyStub.resolves({
625
+ txRequest: {
626
+ txRequestId: 'txreq-withdraw-lite',
627
+ unsignedTxs: [{ coinSpecific: { operationId } }],
628
+ },
629
+ });
630
+ const result = await defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' });
631
+ result.operationId.should.equal(operationId);
632
+ result.txRequestId.should.equal('txreq-withdraw-lite');
633
+ });
634
+ it('should throw when operationId is absent from the withdraw txRequest response', async function () {
635
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
636
+ sendManyStub.resolves({
637
+ txRequest: {
638
+ txRequestId: 'txreq-withdraw-missing',
639
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
640
+ },
641
+ });
642
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' }), {
643
+ message: 'operationId not found in withdraw txRequest response',
644
+ });
645
+ });
646
+ it('should pass walletPassphrase when provided', async function () {
647
+ const operationId = 'op-withdraw-opts';
648
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
649
+ sendManyStub.resolves({
650
+ txRequest: {
651
+ txRequestId: 'txreq-withdraw-opts',
652
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
653
+ },
654
+ });
655
+ await defiVault.withdrawFromVault({
656
+ vaultId: 'vlt-galaxy-usdc',
657
+ amount: '500000',
658
+ walletPassphrase: 'test-passphrase',
659
+ });
660
+ const args = sendManyStub.firstCall.args[0];
661
+ args.walletPassphrase.should.equal('test-passphrase');
662
+ });
663
+ it('should throw if vaultId is missing', async function () {
664
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: '', amount: '500000' }), {
665
+ message: 'vaultId is required',
666
+ });
667
+ });
668
+ it('should throw if amount is missing', async function () {
669
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-1', amount: '' }), {
670
+ message: 'amount is required',
671
+ });
672
+ });
673
+ describe('prebuildTransactionTxRequests defiWithdraw defiParams validation', function () {
674
+ it('should throw when defiParams is missing', async function () {
675
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({ type: 'defiWithdraw' }), /defiWithdraw\.defiParams/);
676
+ });
677
+ it('should throw when vaultId is not a string', async function () {
678
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
679
+ type: 'defiWithdraw',
680
+ defiParams: { vaultId: 123, amount: '500000' },
681
+ }), /defiWithdraw\.defiParams/);
682
+ });
683
+ it('should throw when amount is not a string', async function () {
684
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
685
+ type: 'defiWithdraw',
686
+ defiParams: { vaultId: 'vlt-1', amount: 500000 },
687
+ }), /defiWithdraw\.defiParams/);
688
+ });
689
+ });
690
+ });
691
+ // wrap and unwrap are the same orchestrator with a different sendMany type, so
692
+ // the suite is generated over both to keep the two from drifting apart.
693
+ [
694
+ ['wrap', 'wrapNative'],
695
+ ['unwrap', 'unwrapNative'],
696
+ ].forEach(function ([method, sendManyType]) {
697
+ describe(method, function () {
698
+ it(`should call sendMany once with ${sendManyType} type and return txRequestId`, async function () {
699
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
700
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-1` } });
701
+ const result = await defiVault[method]({
702
+ vaultId: 'vlt-galaxy-weth',
703
+ amount: '1000000000000000000',
704
+ });
705
+ result.txRequestId.should.equal(`txreq-${method}-1`);
706
+ sendManyStub.calledOnce.should.be.true();
707
+ const args = sendManyStub.firstCall.args[0];
708
+ args.type.should.equal(sendManyType);
709
+ args.defiParams.should.deepEqual({
710
+ vaultId: 'vlt-galaxy-weth',
711
+ amount: '1000000000000000000',
712
+ });
713
+ });
714
+ it('should extract txRequestId from the lite sendMany response shape', async function () {
715
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
716
+ sendManyStub.resolves({ txRequestId: `txreq-${method}-lite` });
717
+ const result = await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
718
+ result.txRequestId.should.equal(`txreq-${method}-lite`);
719
+ });
720
+ it('should throw when txRequestId is absent from the sendMany response', async function () {
721
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
722
+ sendManyStub.resolves({ txRequest: {} });
723
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' }), {
724
+ message: 'txRequestId not found in sendMany response',
725
+ });
726
+ });
727
+ it('should leave operationId undefined in v1', async function () {
728
+ // No operation is minted for wrap/unwrap until M5. Assert it stays absent
729
+ // even when the response happens to carry one, so nobody "fixes" this by
730
+ // wiring up extractOperationId.
731
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
732
+ sendManyStub.resolves({
733
+ txRequest: {
734
+ txRequestId: `txreq-${method}-noop`,
735
+ transactions: [{ unsignedTx: { coinSpecific: { operationId: 'op-should-be-ignored' } } }],
736
+ },
737
+ });
738
+ const result = await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
739
+ assert_1.default.strictEqual(result.operationId, undefined);
740
+ });
741
+ it('should forward walletPassphrase when provided', async function () {
742
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
743
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-hot` } });
744
+ await defiVault[method]({
745
+ vaultId: 'vlt-galaxy-weth',
746
+ amount: '5000',
747
+ walletPassphrase: 'test-passphrase',
748
+ });
749
+ const args = sendManyStub.firstCall.args[0];
750
+ args.walletPassphrase.should.equal('test-passphrase');
751
+ });
752
+ it('should omit walletPassphrase entirely when absent (custody path)', async function () {
753
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
754
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-custody` } });
755
+ await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
756
+ const args = sendManyStub.firstCall.args[0];
757
+ args.should.not.have.property('walletPassphrase');
758
+ });
759
+ it('should throw if vaultId is missing, without any network call', async function () {
760
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
761
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: '', amount: '5000' }), {
762
+ message: 'vaultId is required',
763
+ });
764
+ sendManyStub.called.should.be.false();
765
+ });
766
+ it('should throw if amount is missing, without any network call', async function () {
767
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
768
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '' }), {
769
+ message: 'amount must be a positive unsigned decimal integer string',
770
+ });
771
+ sendManyStub.called.should.be.false();
772
+ });
773
+ describe('amount boundary validation', function () {
774
+ // The downstream BigIntFromString codec accepts all of these via JS's BigInt() constructor,
775
+ // so the client-side guard is the only thing standing between a malformed/malicious amount
776
+ // and a value-moving WETH9 deposit()/withdraw() call.
777
+ const rejectedAmounts = [
778
+ ['-1', 'negative'],
779
+ ['0', 'zero'],
780
+ ['0xabc', 'hexadecimal'],
781
+ ['1.5', 'decimal point'],
782
+ ['1e18', 'scientific notation'],
783
+ ['+100', 'explicit sign'],
784
+ [' 100', 'leading whitespace'],
785
+ ['100 ', 'trailing whitespace'],
786
+ ['abc', 'non-numeric'],
787
+ ];
788
+ rejectedAmounts.forEach(([amount, why]) => {
789
+ it(`should reject a ${why} amount (${JSON.stringify(amount)}), without any network call`, async function () {
790
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
791
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount }), {
792
+ message: 'amount must be a positive unsigned decimal integer string',
793
+ });
794
+ sendManyStub.called.should.be.false();
795
+ });
796
+ });
797
+ ['1', '1000000000000000000', '007'].forEach((amount) => {
798
+ it(`should accept amount ${JSON.stringify(amount)} and forward it verbatim`, async function () {
799
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
800
+ sendManyStub.resolves({ txRequest: { txRequestId: 'txreq-boundary' } });
801
+ await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount });
802
+ const args = sendManyStub.firstCall.args[0];
803
+ args.defiParams.amount.should.equal(amount);
804
+ });
805
+ });
806
+ });
807
+ describe('vaultId trimming', function () {
808
+ it('should throw for a whitespace-only vaultId, without any network call', async function () {
809
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
810
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: ' ', amount: '5000' }), {
811
+ message: 'vaultId is required',
812
+ });
813
+ sendManyStub.called.should.be.false();
814
+ });
815
+ it('should trim surrounding whitespace from vaultId before calling sendMany', async function () {
816
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
817
+ sendManyStub.resolves({ txRequest: { txRequestId: 'txreq-trim' } });
818
+ await defiVault[method]({ vaultId: ' vlt-galaxy-weth ', amount: '5000' });
819
+ const args = sendManyStub.firstCall.args[0];
820
+ args.defiParams.vaultId.should.equal('vlt-galaxy-weth');
821
+ });
822
+ });
823
+ it('should throw a clear client-side error for a non-EVM coin, without any network call', async function () {
824
+ mockBaseCoin.getFamily.returns('btc');
825
+ mockBaseCoin.getConfig.returns({ features: [] });
826
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
827
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' }), {
828
+ message: 'wrap/unwrap is not supported for btc wallets',
829
+ });
830
+ sendManyStub.called.should.be.false();
831
+ });
832
+ describe(`prebuildTransactionTxRequests ${sendManyType} defiParams validation`, function () {
833
+ it('should throw when defiParams is missing', async function () {
834
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({ type: sendManyType }), new RegExp(`${sendManyType}\\.defiParams`));
835
+ });
836
+ it('should throw when vaultId is not a string', async function () {
837
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
838
+ type: sendManyType,
839
+ defiParams: { vaultId: 123, amount: '5000' },
840
+ }), new RegExp(`${sendManyType}\\.defiParams`));
841
+ });
842
+ it('should throw when amount is not a numeric string', async function () {
843
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
844
+ type: sendManyType,
845
+ defiParams: { vaultId: 'vlt-1', amount: 5000 },
846
+ }), new RegExp(`${sendManyType}\\.defiParams`));
847
+ });
848
+ });
849
+ });
850
+ });
851
+ describe('wallet.defi getter', function () {
852
+ it('should return a DefiVault instance', function () {
853
+ const defi = wallet.defi;
854
+ (defi instanceof src_1.DefiVault).should.be.true();
855
+ });
856
+ it('should return the same instance on subsequent calls', function () {
857
+ const defi1 = wallet.defi;
858
+ const defi2 = wallet.defi;
859
+ (defi1 === defi2).should.be.true();
860
+ });
861
+ });
862
+ });
863
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsaURBQWtEO0FBQ2xELHNEQUFvRDtBQUNwRCx5Q0FBZ0Y7QUFFaEYsUUFBUSxDQUFDLFdBQVcsRUFBRTtJQUNwQixJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBRXRCLDRDQUE0QztJQUM1QyxTQUFTLFdBQVcsQ0FBQyxNQUFXO1FBQzlCLE9BQU87WUFDTCxJQUFJLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNoQyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUMvQixLQUFLLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxNQUFNLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQVU7UUFDbkMsT0FBTztZQUNMLEVBQUU7WUFDRixJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLFFBQVEsRUFBRSw0QkFBYSxDQUFDLGNBQWM7WUFDdEMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsTUFBTTtZQUNsQixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixvQkFBb0IsRUFBRSxpQkFBaUI7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGVB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ckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IENvaW5GZWF0dXJlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBWYXVsdFByb3RvY29sIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvciwgRGVmaVZhdWx0LCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnRGVmaVZhdWx0JywgZnVuY3Rpb24gKCkge1xuICBsZXQgd2FsbGV0OiBXYWxsZXQ7XG4gIGxldCBkZWZpVmF1bHQ6IERlZmlWYXVsdDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG5cbiAgLy8gSGVscGVyIHRvIGNyZWF0ZSBhIGNoYWluYWJsZSByZXF1ZXN0IG1vY2tcbiAgZnVuY3Rpb24gbW9ja1JlcXVlc3QocmVzdWx0OiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICBzZXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzdWx0KSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUNvbmNyZXRlVmF1bHQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6ICdDb25jcmV0ZSBCVEMgVmF1bHQnLFxuICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuQ09OQ1JFVEVfQlRDQ1gsXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBhc3NldFRva2VuOiAnYnRjJyxcbiAgICAgIHNoYXJlVG9rZW46ICdjYnRjJyxcbiAgICAgIHJpc2tNYW5hZ2VyOiAnbWFuYWdlci0xJyxcbiAgICAgIGN1c3RvZHlUeXBlOiAncXVhbGlmaWVkJyxcbiAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhWYXVsdENvbnRyYWN0JyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1vcnBob1ZhdWx0KGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiAnTW9ycGhvIFVTREMgVmF1bHQnLFxuICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuTU9SUEhPLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGNvaW46ICdldGgnLFxuICAgICAgYXNzZXRUb2tlbjogJ3VzZGMnLFxuICAgICAgc2hhcmVUb2tlbjogJ211c2RjJyxcbiAgICAgIHJpc2tNYW5hZ2VyOiAnbWFuYWdlci0yJyxcbiAgICAgIGN1c3RvZHlUeXBlOiAncXVhbGlmaWVkJyxcbiAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhNb3JwaG9WYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VBYXZlVmF1bHQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6ICdBYXZlIFYzIFVTREMgVmF1bHQnLFxuICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuQUFWRV9WMyxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGFzc2V0VG9rZW46ICd1c2RjJyxcbiAgICAgIHNoYXJlVG9rZW46ICdzdGF0YVVTREMnLFxuICAgICAgcmlza01hbmFnZXI6ICdtYW5hZ2VyLTMnLFxuICAgICAgY3VzdG9keVR5cGU6ICdxdWFsaWZpZWQnLFxuICAgICAgdmF1bHRDb250cmFjdEFkZHJlc3M6ICcweEFhdmVWYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgdmF1bHQgcmVzcG9uc2Ugd2hvc2UgYGNvbXBvc2l0aW9uW11gIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBzdHJpY3RcbiAgLy8gR2V0VmF1bHRSZXNwb25zZSBjb2RlYyDigJQgbWlycm9ycyB0aGUgcHJvZCBpbmNpZGVudCB3aGVyZSBhIGRpc3BsYXktb25seVxuICAvLyBuZXN0ZWQgZmllbGQgd2FzIG5hcnJvd2VkL3JlbW92ZWQgc2VydmVyLXNpZGUuIFRoZSBkZXBvc2l0IGRpc3BhdGNoIHBhdGhcbiAgLy8gbXVzdCBub3QgaGFyZC1mYWlsIG9uIGl0IGJlY2F1c2UgaXQgb25seSByZWFkcyBgcHJvdG9jb2xgLlxuICBmdW5jdGlvbiBtYWtlQ29uY3JldGVWYXVsdFdpdGhTdGFsZUNvbXBvc2l0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFrZUNvbmNyZXRlVmF1bHQoaWQpLFxuICAgICAgY29tcG9zaXRpb246IFt7IGFzc2V0OiAnYnRjJywgYXB5OiAnbm90LWEtbnVtYmVyJyAvKiBzdGFsZSBzaGFwZSAqLyB9XSxcbiAgICB9O1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICBkZWw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpID0+IGBodHRwczovL2JpdGdvLmNvbS9hcGkvdiR7dmVyc2lvbn0ke3BhdGh9YCksXG4gICAgICBtaWNyb3NlcnZpY2VzVXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IGBodHRwczovL2JpdGdvLmNvbSR7cGF0aH1gKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnZXRoJyksXG4gICAgICBnZXRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZmVhdHVyZXM6IFtDb2luRmVhdHVyZS5FVk1fQ09JTl0gfSksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICAgIGVudGVycHJpc2U6ICd0ZXN0LWVudGVycHJpc2UtaWQnLFxuICAgIH07XG5cbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luLCBtb2NrV2FsbGV0RGF0YSk7XG4gICAgZGVmaVZhdWx0ID0gd2FsbGV0LmRlZmk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0VmF1bHRDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmZXRjaCB2YXVsdCBjb25maWcgZm9yIGEgZ2l2ZW4gdmF1bHRJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhdWx0Q29uZmlnID0ge1xuICAgICAgICBpZDogJ3ZsdC1jb25jcmV0ZS0xJyxcbiAgICAgICAgbmFtZTogJ0NvbmNyZXRlIEJUQyBWYXVsdCcsXG4gICAgICAgIHByb3RvY29sOiBWYXVsdFByb3RvY29sLkNPTkNSRVRFX0JUQ0NYLFxuICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgYXNzZXRUb2tlbjogJ2J0YycsXG4gICAgICAgIHNoYXJlVG9rZW46ICdjYnRjJyxcbiAgICAgICAgcmlza01hbmFnZXI6ICdtYW5hZ2VyLTEnLFxuICAgICAgICBjdXN0b2R5VHlwZTogJ3F1YWxpZmllZCcsXG4gICAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhWYXVsdENvbnRyYWN0JyxcbiAgICAgICAgY29uY3JldGVDb25maWc6IHtcbiAgICAgICAgICBzb3VyY2VXYWxsZXRJZDogJ3NyYy13YWxsZXQnLFxuICAgICAgICAgIGVzY3Jvd1dhbGxldElkOiAnZXNjcm93LXdhbGxldCcsXG4gICAgICAgICAgZXNjcm93RGVwb3NpdEFkZHJlc3M6ICcxRXhhbXBsZUJ0Y0FkZHJlc3MnLFxuICAgICAgICAgIHBvc2l0aW9uV2FsbGV0SWQ6ICdwb3Mtd2FsbGV0JyxcbiAgICAgICAgICBwb3NpdGlvbkJhc2VBZGRyZXNzOiAnMVBvc2l0aW9uQWRkcmVzcycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdCh2YXVsdENvbmZpZyk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmdldFZhdWx0Q29uZmlnKHsgdmF1bHRJZDogJ3ZsdC1jb25jcmV0ZS0xJyB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwodmF1bHRDb25maWcpO1xuICAgICAgbW9ja0JpdEdvLmdldC5jYWxsZWRXaXRoKCdodHRwczovL2JpdGdvLmNvbS9hcGkvZGVmaS1zZXJ2aWNlL3YxL3ZhdWx0cy92bHQtY29uY3JldGUtMScpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICByZXEuc2V0LmNhbGxlZFdpdGgoJ2VudGVycHJpc2UtaWQnLCAndGVzdC1lbnRlcnByaXNlLWlkJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmdldFZhdWx0Q29uZmlnKHsgdmF1bHRJZDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSB0aGUgQVBJIChlLmcuIDQwNCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChudWxsKTtcbiAgICAgIHJlcS5yZXN1bHQucmVqZWN0cyhuZXcgRXJyb3IoJ05vdCBGb3VuZCcpKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0VmF1bHRDb25maWcoeyB2YXVsdElkOiAndmx0LW5vdC1mb3VuZCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ05vdCBGb3VuZCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFZhdWx0UHJvdG9jb2wnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmZXRjaCBvbmx5IHRoZSBwcm90b2NvbCBmb3IgYSBnaXZlbiB2YXVsdElkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LW1vcnBoby0xJykpKTtcblxuICAgICAgY29uc3QgcHJvdG9jb2wgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtbW9ycGhvLTEnIH0pO1xuXG4gICAgICBwcm90b2NvbC5zaG91bGQuZXF1YWwoVmF1bHRQcm90b2NvbC5NT1JQSE8pO1xuICAgICAgbW9ja0JpdEdvLmdldC5jYWxsZWRXaXRoKCdodHRwczovL2JpdGdvLmNvbS9hcGkvZGVmaS1zZXJ2aWNlL3YxL3ZhdWx0cy92bHQtbW9ycGhvLTEnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gQ09OQ1JFVEVfQlRDQ1ggZm9yIGEgY29uY3JldGUgdmF1bHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHQoJ3ZsdC1jb25jcmV0ZS0xJykpKTtcblxuICAgICAgY29uc3QgcHJvdG9jb2wgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtY29uY3JldGUtMScgfSk7XG5cbiAgICAgIHByb3RvY29sLnNob3VsZC5lcXVhbChWYXVsdFByb3RvY29sLkNPTkNSRVRFX0JUQ0NYKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdG9sZXJhdGUgYSBzdGFsZS9pbnZhbGlkIGNvbXBvc2l0aW9uW10gZmllbGQgdGhlIGZ1bGwgR2V0VmF1bHRSZXNwb25zZSBjb2RlYyB3b3VsZCByZWplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgZGlzcGF0Y2ggY29kZWMgcmVhZHMgb25seSBgcHJvdG9jb2xgLCBzbyBhIGRpc3BsYXktb25seSBuZXN0ZWRcbiAgICAgIC8vIGZpZWxkIGdvaW5nIHN0YWxlIHNlcnZlci1zaWRlIG11c3Qgbm90IGJyZWFrIHRoaXMgY2FsbC5cbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQ29uY3JldGVWYXVsdFdpdGhTdGFsZUNvbXBvc2l0aW9uKCd2bHQtc3RhbGUtMScpKSk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gYXdhaXQgZGVmaVZhdWx0LmdldFZhdWx0UHJvdG9jb2woeyB2YXVsdElkOiAndmx0LXN0YWxlLTEnIH0pO1xuXG4gICAgICBwcm90b2NvbC5zaG91bGQuZXF1YWwoVmF1bHRQcm90b2NvbC5DT05DUkVURV9CVENDWCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRWYXVsdFByb3RvY29sKHsgdmF1bHRJZDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSB0aGUgQVBJIChlLmcuIDQwNCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChudWxsKTtcbiAgICAgIHJlcS5yZXN1bHQucmVqZWN0cyhuZXcgRXJyb3IoJ05vdCBGb3VuZCcpKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtbm90LWZvdW5kJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnTm90IEZvdW5kJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVwb3NpdFRvVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ2NvbmNyZXRlX2J0Y2N4IHByb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55IG9uY2Ugd2l0aCBkZWZpLWRlcG9zaXQgdHlwZSBhbmQgbm8gcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTEnKSkpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7XG4gICAgICAgICAgICBpZDogJ3BhLXV1aWQtMTIzJyxcbiAgICAgICAgICAgIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMScsXG4gICAgICAgICAgYW1vdW50OiAnNTAwMDAwMCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldHVybnMgQ29uY3JldGVEZXBvc2l0UmVzdWx0IHNoYXBlXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5wZW5kaW5nQXBwcm92YWxJZC5zaG91bGQuZXF1YWwoJ3BhLXV1aWQtMTIzJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5zdGF0ZS5zaG91bGQuZXF1YWwoJ2F3YWl0aW5nU2lnbmF0dXJlJyk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgc2VuZE1hbnkgY2FsbCDigJQgbm8gc2Vjb25kIGRlcG9zaXQgc2VuZE1hbnlcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIGNhbGxBcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1idGMtMScpO1xuICAgICAgICBjYWxsQXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMDAwMDAnKTtcbiAgICAgICAgY2FsbEFyZ3MuZGVmaVBhcmFtcy5hY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMga2V5IGF0IGFsbFxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbEFyZ3MucmVjaXBpZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgd2FsbGV0UGFzc3BocmFzZSB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHQoJ3ZsdC1idGMtMicpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpLnJlc29sdmVzKHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHsgaWQ6ICdwYS11dWlkLTQ1NicsIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMicsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2h1bnRlcjInLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgnaHVudGVyMicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVmYXVsdCBzdGF0ZSB0byBhd2FpdGluZ1NpZ25hdHVyZSB3aGVuIGFic2VudCBmcm9tIHBlbmRpbmdBcHByb3ZhbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTMnKSkpO1xuXG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7IGlkOiAncGEtbm8tc3RhdGUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnN0YXRlLnNob3VsZC5lcXVhbCgnYXdhaXRpbmdTaWduYXR1cmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRvbGVyYXRlIGEgc3RhbGUvaW52YWxpZCBjb21wb3NpdGlvbltdIGZpZWxkIHRoYXQgdGhlIGZ1bGwgR2V0VmF1bHRSZXNwb25zZSBjb2RlYyB3b3VsZCByZWplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlZ3Jlc3Npb24gZ3VhcmQgZm9yIHRoZSBjcm9zcy1yZXBvIGNvZGVjLWRyaWZ0IGluY2lkZW50OiB0aGVcbiAgICAgICAgLy8gZGVwb3NpdCBkaXNwYXRjaCBwYXRoIHJlYWRzIG9ubHkgYHByb3RvY29sYCwgc28gYSBkaXNwbGF5LW9ubHlcbiAgICAgICAgLy8gbmVzdGVkIGZpZWxkIGdvaW5nIHN0YWxlIHNlcnZlci1zaWRlIG11c3Qgbm90IGJyZWFrIGRlcG9zaXRzLlxuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHRXaXRoU3RhbGVDb21wb3NpdGlvbigndmx0LWJ0Yy1zdGFsZScpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpLnJlc29sdmVzKHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHsgaWQ6ICdwYS1zdGFsZScsIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLXN0YWxlJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnBlbmRpbmdBcHByb3ZhbElkLnNob3VsZC5lcXVhbCgncGEtc3RhbGUnKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gc2VuZE1hbnkgcmV0dXJucyBubyBwZW5kaW5nQXBwcm92YWwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQ29uY3JldGVWYXVsdCgndmx0LWJ0Yy00JykpKTtcblxuICAgICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55JykucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd1bmV4cGVjdGVkJyB9IH0pO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTQnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZWZpLWRlcG9zaXQgc2VuZE1hbnkgcmVzcG9uc2U6IHVua25vd247IHVua25vd24nLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vcnBobyBwcm92aWRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgY2FsbCBzZW5kTWFueSBmb3IgYXBwcm92ZSBhbmQgZGVwb3NpdCBvbiBoYXBweSBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZU1vcnBob1ZhdWx0KCd2bHQtZ2FsYXh5LXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtMTIzJztcblxuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIC8vIFdQIHdyaXRlcyBvcGVyYXRpb25JZCBpbnRvIHRoZSBidWlsdCB0eCdzIGNvaW5TcGVjaWZpYyAoZnVsbCBhcGlWZXJzaW9uKSxcbiAgICAgICAgLy8gbm90IGludG8gdGhlIGludGVudCDigJQgbWlycm9yIHRoYXQgcmVhbCBzaGFwZSBoZXJlLlxuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMScsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LTEnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnIH0sXG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICAocmVzdWx0IGFzIGFueSkub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnR4UmVxdWVzdElkcy5hcHByb3ZlLnNob3VsZC5lcXVhbCgndHhyZXEtYXBwcm92ZS0xJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtMScpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBwYXJhbXMgZm9yIGFwcHJvdmVcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFwcHJvdmVBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpQXBwcm92ZScpO1xuICAgICAgICBhcHByb3ZlQXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgICAgYXBwcm92ZUFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHBhcmFtcyBmb3IgZGVwb3NpdFxuICAgICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4dHJhY3Qgb3BlcmF0aW9uSWQgZnJvbSB0aGUgbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWxpdGUnO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLWxpdGUnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWFwcHJvdmUnIH0sXG4gICAgICAgICAgICB1bnNpZ25lZFR4czogW3sgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC1saXRlJyB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGRlcG9zaXRBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuc2Vjb25kQ2FsbC5hcmdzWzBdO1xuICAgICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWxsIGJhY2sgdG8gaW50ZW50Lm9wZXJhdGlvbklkIGZvciBmb3J3YXJkLWNvbXBhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWludGVudCc7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtaW50ZW50JyxcbiAgICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uU2Vjb25kQ2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LWludGVudCcgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pO1xuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBvcGVyYXRpb25JZCBpcyBhYnNlbnQgZnJvbSB0aGUgYXBwcm92ZSB0eFJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtbWlzc2luZycsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHt9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiBhcHByb3ZlIHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlcG9zaXQgc2VuZE1hbnkgbXVzdCBub3QgYmUgaXNzdWVkIHdoZW4gdGhlIG9wZXJhdGlvbklkIGlzIG1pc3NpbmdcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUT0RPKENHRC0xNzA5KTogUmUtZW5hYmxlIHdoZW4gYWN0aXZlIG9wZXJhdGlvbiBwcmUtZmxpZ2h0IGNoZWNrIGlzIHJlc3RvcmVkXG4gICAgICB4aXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBhbiBhY3RpdmUgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwcmVmbGlnaHRSZXEgPSBtb2NrUmVxdWVzdCh7XG4gICAgICAgICAgaXRlbXM6IFt7IG9wZXJhdGlvbklkOiAnZXhpc3Rpbmctb3AtaWQnLCBzdGF0ZTogJ0FQUFJPVkVfVFhfUkVRVUVTVEVEJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhwcmVmbGlnaHRSZXEpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSxcbiAgICAgICAgICAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgKGVyciBpbnN0YW5jZW9mIEFjdGl2ZU9wZXJhdGlvbkV4aXN0c0Vycm9yKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICAgICAgKGVyciBhcyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcikub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdleGlzdGluZy1vcC1pZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvcGFnYXRlIGRlcG9zaXQgc2VuZE1hbnkgZmFpbHVyZSB3aXRob3V0IGNsZWFudXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3AtdXVpZC00NTYnO1xuXG4gICAgICAgIC8vIE1vY2sgc2VuZE1hbnk6IGFwcHJvdmUgc3VjY2VlZHMsIGRlcG9zaXQgZmFpbHNcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMicsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ2RlcG9zaXQgY3JlYXRpb24gZmFpbGVkJykpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNESyBkb2VzIG5vdCBhdHRlbXB0IGNsZWFudXAg4oCUIHJlY29uY2lsZXIgaGFuZGxlcyBvcnBoYW5lZCBhcHByb3ZhbHNcbiAgICAgICAgbW9ja0JpdEdvLmRlbC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC0xJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2FhdmVfdjMgcHJvdmlkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIGNhbGwgc2VuZE1hbnkgZm9yIGFwcHJvdmUgYW5kIGRlcG9zaXQgb24gaGFwcHkgcGF0aCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VBYXZlVmF1bHQoJ3ZsdC1hYXZlLXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLWFhdmUtMTIzJztcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFhdmUtYXBwcm92ZS0xJyxcbiAgICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJyB9LFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzogeyBvcGVyYXRpb25JZCB9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFhdmUtZGVwb3NpdC0xJyxcbiAgICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1kZXBvc2l0JyB9LFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzogeyBvcGVyYXRpb25JZCB9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHtcbiAgICAgICAgICB2YXVsdElkOiAndmx0LWFhdmUtdXNkYycsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgICAocmVzdWx0IGFzIGFueSkudHhSZXF1ZXN0SWRzLmFwcHJvdmUuc2hvdWxkLmVxdWFsKCd0eHJlcS1hYXZlLWFwcHJvdmUtMScpO1xuICAgICAgICAocmVzdWx0IGFzIGFueSkudHhSZXF1ZXN0SWRzLmRlcG9zaXQuc2hvdWxkLmVxdWFsKCd0eHJlcS1hYXZlLWRlcG9zaXQtMScpO1xuICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkVHdpY2Uuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgICBjb25zdCBhcHByb3ZlQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBhcHByb3ZlQXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaUFwcHJvdmUnKTtcbiAgICAgICAgYXBwcm92ZUFyZ3MuZGVmaVBhcmFtcy5zaG91bGQuZGVlcEVxdWFsKHsgdmF1bHRJZDogJ3ZsdC1hYXZlLXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KTtcblxuICAgICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1hYXZlLXVzZGMnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgIG9wZXJhdGlvbklkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4dHJhY3Qgb3BlcmF0aW9uSWQgZnJvbSB0aGUgbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VBYXZlVmF1bHQoJ3ZsdC1hYXZlLXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLWFhdmUtbGl0ZSc7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hYXZlLWFwcHJvdmUtbGl0ZScsXG4gICAgICAgICAgICB1bnNpZ25lZFR4czogW3sgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiAndHhyZXEtYWF2ZS1kZXBvc2l0LWxpdGUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYWF2ZS11c2RjJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuYXBwcm92ZS5zaG91bGQuZXF1YWwoJ3R4cmVxLWFhdmUtYXBwcm92ZS1saXRlJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWFhdmUtZGVwb3NpdC1saXRlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIG9wZXJhdGlvbklkIGlzIGFic2VudCBmcm9tIHRoZSBhcHByb3ZlIHR4UmVxdWVzdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VBYXZlVmF1bHQoJ3ZsdC1hYXZlLXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYWF2ZS1hcHByb3ZlLW1pc3NpbmcnLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzoge30gfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LWFhdmUtdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiBhcHByb3ZlIHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvcGFnYXRlIGRlcG9zaXQgc2VuZE1hbnkgZmFpbHVyZSB3aXRob3V0IGNsZWFudXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQWF2ZVZhdWx0KCd2bHQtYWF2ZS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC1hYXZlLWZhaWx1cmUnO1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vbkZpcnN0Q2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYWF2ZS1hcHByb3ZlLWZhaWx1cmUnLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzogeyBvcGVyYXRpb25JZCB9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZWplY3RzKG5ldyBFcnJvcignQWF2ZSBkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcpKTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LWFhdmUtdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ0FhdmUgZGVwb3NpdCBjcmVhdGlvbiBmYWlsZWQnLFxuICAgICAgICB9KTtcbiAgICAgICAgbW9ja0JpdEdvLmRlbC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC0xJykpKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC0xJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnYW1vdW50IGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVzdW1lRGVwb3NpdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGlzc3VlIHRoZSBkZXBvc2l0IHNlbmRNYW55IGZvciBhIHBhcnRpYWwgb3BlcmF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICBvcGVyYXRpb25JZDogJ29wLXJlc3VtZS0xJyxcbiAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICB0eXBlOiAnREVQT1NJVCcsXG4gICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgIHN0YXRlOiAnQVBQUk9WRV9UWF9SRVFVRVNURUQnLFxuICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtZXhpc3RpbmcnLFxuICAgICAgICBhc3NvY2lhdGVkVHhSZXF1ZXN0SWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICB9O1xuXG4gICAgICAvLyBnZXRPcGVyYXRpb24gY2FsbFxuICAgICAgY29uc3QgZ2V0T3BSZXEgPSBtb2NrUmVxdWVzdChvcGVyYXRpb24pO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKGdldE9wUmVxKTtcblxuICAgICAgLy8gZGVwb3NpdCBzZW5kTWFueVxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LXJlc3VtZScsXG4gICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnLCBvcGVyYXRpb25JZDogJ29wLXJlc3VtZS0xJyB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5yZXN1bWVEZXBvc2l0KHsgb3BlcmF0aW9uSWQ6ICdvcC1yZXN1bWUtMScgfSk7XG5cbiAgICAgIChyZXN1bHQgYXMgYW55KS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wLXJlc3VtZS0xJyk7XG4gICAgICAocmVzdWx0IGFzIGFueSkudHhSZXF1ZXN0SWRzLmFwcHJvdmUuc2hvdWxkLmVxdWFsKCd0eHJlcS1hcHByb3ZlLWV4aXN0aW5nJyk7XG4gICAgICAocmVzdWx0IGFzIGFueSkudHhSZXF1ZXN0SWRzLmRlcG9zaXQuc2hvdWxkLmVxdWFsKCd0eHJlcS1kZXBvc2l0LXJlc3VtZScpO1xuXG4gICAgICAvLyBWZXJpZnkgc2VuZE1hbnkgd2FzIGNhbGxlZCB3aXRoIGNvcnJlY3QgZGVmaVBhcmFtc1xuICAgICAgY29uc3QgZGVwb3NpdEFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGRlcG9zaXRBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpRGVwb3NpdCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy52YXVsdElkLnNob3VsZC5lcXVhbCgndmx0LWdhbGF4eS11c2RjJyk7XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdvcC1yZXN1bWUtMScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBkZXBvc2l0IHR4UmVxdWVzdCBhbHJlYWR5IGV4aXN0cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC1hbHJlYWR5LWRvbmUnLFxuICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgc3RhdGU6ICdERVBPU0lUX1RYX1JFUVVFU1RFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS14JyxcbiAgICAgICAgYXNzb2NpYXRlZFR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC14JyxcbiAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBnZXRPcFJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoZ2V0T3BSZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQucmVzdW1lRGVwb3NpdCh7IG9wZXJhdGlvbklkOiAnb3AtYWxyZWFkeS1kb25lJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnRGVwb3NpdCB0eFJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgb3BlcmF0aW9uOyBub3RoaW5nIHRvIHJlc3VtZScsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0aW9uSWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5yZXN1bWVEZXBvc2l0KHsgb3BlcmF0aW9uSWQ6ICcnIH0pLCB7IG1lc3NhZ2U6ICdvcGVyYXRpb25JZCBpcyByZXF1aXJlZCcgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRPcGVyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmZXRjaCBhbiBvcGVyYXRpb24gYnkgSUQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIG9wZXJhdGlvbklkOiAnb3AtZ2V0LTEnLFxuICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgc3RhdGU6ICdDT01QTEVURUQnLFxuICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLTEnLFxuICAgICAgICBhc3NvY2lhdGVkVHhSZXF1ZXN0SWQ6ICd0eHJlcS0yJyxcbiAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjE4OjAwWicsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChvcGVyYXRpb24pO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHJlcSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5nZXRPcGVyYXRpb24oeyBvcGVyYXRpb25JZDogJ29wLWdldC0xJyB9KTtcbiAgICAgIHJlc3VsdC5zaG91bGQuZGVlcEVxdWFsKG9wZXJhdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIG9wZXJhdGlvbklkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQ6ICcnIH0pLCB7IG1lc3NhZ2U6ICdvcGVyYXRpb25JZCBpcyByZXF1aXJlZCcgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsaXN0T3BlcmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGxpc3Qgb3BlcmF0aW9ucyBmb3IgYSB2YXVsdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGxpc3RSZXN1bHQgPSB7XG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC0xJyxcbiAgICAgICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgICAgICB0eXBlOiAnREVQT1NJVCcsXG4gICAgICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICAgICAgc3RhdGU6ICdDT01QTEVURUQnLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxMjowMFonLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiAnMjAyNi0wNS0xNFQwNzoxODowMFonLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIG5leHRDdXJzb3I6ICdjdXJzb3ItYWJjJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KGxpc3RSZXN1bHQpO1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKHJlcSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5saXN0T3BlcmF0aW9ucyh7XG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQuaXRlbXMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgIHJlc3VsdC5uZXh0Q3Vyc29yIS5zaG91bGQuZXF1YWwoJ2N1cnNvci1hYmMnKTtcblxuICAgICAgLy8gVmVyaWZ5IHF1ZXJ5IHBhcmFtc1xuICAgICAgY29uc3QgcXVlcnlBcmdzID0gcmVxLnF1ZXJ5LmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgcXVlcnlBcmdzLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIHF1ZXJ5QXJncy5zdGF0ZS5zaG91bGQuZXF1YWwoJ0NPTVBMRVRFRCcpO1xuICAgICAgcXVlcnlBcmdzLmxpbWl0LnNob3VsZC5lcXVhbCgxMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5saXN0T3BlcmF0aW9ucyh7IHZhdWx0SWQ6ICcnIH0pLCB7IG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGhkcmF3RnJvbVZhdWx0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY2FsbCBzZW5kTWFueSB3aXRoIGRlZmlXaXRoZHJhdyBhbmQgcmV0dXJuIG9wZXJhdGlvbklkICsgdHhSZXF1ZXN0SWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC13aXRoZHJhdy0xJztcblxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS13aXRoZHJhdy0xJyxcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoe1xuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHQub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgIHJlc3VsdC50eFJlcXVlc3RJZC5zaG91bGQuZXF1YWwoJ3R4cmVxLXdpdGhkcmF3LTEnKTtcblxuICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlXaXRoZHJhdycpO1xuICAgICAgYXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKCc1MDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBvcGVyYXRpb25JZCBmcm9tIGxpdGUgYXBpVmVyc2lvbiBjb2luU3BlY2lmaWMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC13aXRoZHJhdy1saXRlJztcblxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS13aXRoZHJhdy1saXRlJyxcbiAgICAgICAgICB1bnNpZ25lZFR4czogW3sgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LndpdGhkcmF3RnJvbVZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzUwMDAwMCcgfSk7XG5cbiAgICAgIHJlc3VsdC5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkLnNob3VsZC5lcXVhbCgndHhyZXEtd2l0aGRyYXctbGl0ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIG9wZXJhdGlvbklkIGlzIGFic2VudCBmcm9tIHRoZSB3aXRoZHJhdyB0eFJlcXVlc3QgcmVzcG9uc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLXdpdGhkcmF3LW1pc3NpbmcnLFxuICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHt9IH0gfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LndpdGhkcmF3RnJvbVZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzUwMDAwMCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiB3aXRoZHJhdyB0eFJlcXVlc3QgcmVzcG9uc2UnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3Mgd2FsbGV0UGFzc3BocmFzZSB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3Atd2l0aGRyYXctb3B0cyc7XG5cbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtd2l0aGRyYXctb3B0cycsXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzogeyBvcGVyYXRpb25JZCB9IH0gfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgZGVmaVZhdWx0LndpdGhkcmF3RnJvbVZhdWx0KHtcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIGFtb3VudDogJzUwMDAwMCcsXG4gICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICd0ZXN0LXBhc3NwaHJhc2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgIGFyZ3Mud2FsbGV0UGFzc3BocmFzZS5zaG91bGQuZXF1YWwoJ3Rlc3QtcGFzc3BocmFzZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAnJywgYW1vdW50OiAnNTAwMDAwJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW1vdW50IGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6ICcnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgncHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMgZGVmaVdpdGhkcmF3IGRlZmlQYXJhbXMgdmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBkZWZpUGFyYW1zIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+ICh3YWxsZXQgYXMgYW55KS5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyh7IHR5cGU6ICdkZWZpV2l0aGRyYXcnIH0pLFxuICAgICAgICAgIC9kZWZpV2l0aGRyYXdcXC5kZWZpUGFyYW1zL1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB2YXVsdElkIGlzIG5vdCBhIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICh3YWxsZXQgYXMgYW55KS5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyh7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZpV2l0aGRyYXcnLFxuICAgICAgICAgICAgICBkZWZpUGFyYW1zOiB7IHZhdWx0SWQ6IDEyMywgYW1vdW50OiAnNTAwMDAwJyB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL2RlZmlXaXRoZHJhd1xcLmRlZmlQYXJhbXMvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGFtb3VudCBpcyBub3QgYSBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAod2FsbGV0IGFzIGFueSkucHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoe1xuICAgICAgICAgICAgICB0eXBlOiAnZGVmaVdpdGhkcmF3JyxcbiAgICAgICAgICAgICAgZGVmaVBhcmFtczogeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6IDUwMDAwMCB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgL2RlZmlXaXRoZHJhd1xcLmRlZmlQYXJhbXMvXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gd3JhcCBhbmQgdW53cmFwIGFyZSB0aGUgc2FtZSBvcmNoZXN0cmF0b3Igd2l0aCBhIGRpZmZlcmVudCBzZW5kTWFueSB0eXBlLCBzb1xuICAvLyB0aGUgc3VpdGUgaXMgZ2VuZXJhdGVkIG92ZXIgYm90aCB0byBrZWVwIHRoZSB0d28gZnJvbSBkcmlmdGluZyBhcGFydC5cbiAgKFxuICAgIFtcbiAgICAgIFsnd3JhcCcsICd3cmFwTmF0aXZlJ10sXG4gICAgICBbJ3Vud3JhcCcsICd1bndyYXBOYXRpdmUnXSxcbiAgICBdIGFzIGNvbnN0XG4gICkuZm9yRWFjaChmdW5jdGlvbiAoW21ldGhvZCwgc2VuZE1hbnlUeXBlXSkge1xuICAgIGRlc2NyaWJlKG1ldGhvZCwgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoYHNob3VsZCBjYWxsIHNlbmRNYW55IG9uY2Ugd2l0aCAke3NlbmRNYW55VHlwZX0gdHlwZSBhbmQgcmV0dXJuIHR4UmVxdWVzdElkYCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdDogeyB0eFJlcXVlc3RJZDogYHR4cmVxLSR7bWV0aG9kfS0xYCB9IH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdFttZXRob2RdKHtcbiAgICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJyxcbiAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzdWx0LnR4UmVxdWVzdElkLnNob3VsZC5lcXVhbChgdHhyZXEtJHttZXRob2R9LTFgKTtcblxuICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFyZ3MudHlwZS5zaG91bGQuZXF1YWwoc2VuZE1hbnlUeXBlKTtcbiAgICAgICAgYXJncy5kZWZpUGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4dHJhY3QgdHhSZXF1ZXN0SWQgZnJvbSB0aGUgbGl0ZSBzZW5kTWFueSByZXNwb25zZSBzaGFwZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoeyB0eFJlcXVlc3RJZDogYHR4cmVxLSR7bWV0aG9kfS1saXRlYCB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLCBhbW91bnQ6ICc1MDAwJyB9KTtcblxuICAgICAgICByZXN1bHQudHhSZXF1ZXN0SWQuc2hvdWxkLmVxdWFsKGB0eHJlcS0ke21ldGhvZH0tbGl0ZWApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiB0eFJlcXVlc3RJZCBpcyBhYnNlbnQgZnJvbSB0aGUgc2VuZE1hbnkgcmVzcG9uc2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHsgdHhSZXF1ZXN0OiB7fSB9KTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLCBhbW91bnQ6ICc1MDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd0eFJlcXVlc3RJZCBub3QgZm91bmQgaW4gc2VuZE1hbnkgcmVzcG9uc2UnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGxlYXZlIG9wZXJhdGlvbklkIHVuZGVmaW5lZCBpbiB2MScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gTm8gb3BlcmF0aW9uIGlzIG1pbnRlZCBmb3Igd3JhcC91bndyYXAgdW50aWwgTTUuIEFzc2VydCBpdCBzdGF5cyBhYnNlbnRcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRoZSByZXNwb25zZSBoYXBwZW5zIHRvIGNhcnJ5IG9uZSwgc28gbm9ib2R5IFwiZml4ZXNcIiB0aGlzIGJ5XG4gICAgICAgIC8vIHdpcmluZyB1cCBleHRyYWN0T3BlcmF0aW9uSWQuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHR4UmVxdWVzdElkOiBgdHhyZXEtJHttZXRob2R9LW5vb3BgLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzogeyBvcGVyYXRpb25JZDogJ29wLXNob3VsZC1iZS1pZ25vcmVkJyB9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50OiAnNTAwMCcgfSk7XG5cbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdC5vcGVyYXRpb25JZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZvcndhcmQgd2FsbGV0UGFzc3BocmFzZSB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdDogeyB0eFJlcXVlc3RJZDogYHR4cmVxLSR7bWV0aG9kfS1ob3RgIH0gfSk7XG5cbiAgICAgICAgYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLFxuICAgICAgICAgIGFtb3VudDogJzUwMDAnLFxuICAgICAgICAgIHdhbGxldFBhc3NwaHJhc2U6ICd0ZXN0LXBhc3NwaHJhc2UnLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFyZ3Mud2FsbGV0UGFzc3BocmFzZS5zaG91bGQuZXF1YWwoJ3Rlc3QtcGFzc3BocmFzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgb21pdCB3YWxsZXRQYXNzcGhyYXNlIGVudGlyZWx5IHdoZW4gYWJzZW50IChjdXN0b2R5IHBhdGgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdDogeyB0eFJlcXVlc3RJZDogYHR4cmVxLSR7bWV0aG9kfS1jdXN0b2R5YCB9IH0pO1xuXG4gICAgICAgIGF3YWl0IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsIGFtb3VudDogJzUwMDAnIH0pO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgICAgYXJncy5zaG91bGQubm90LmhhdmUucHJvcGVydHkoJ3dhbGxldFBhc3NwaHJhc2UnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZywgd2l0aG91dCBhbnkgbmV0d29yayBjYWxsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAnJywgYW1vdW50OiAnNTAwMCcgfSksIHtcbiAgICAgICAgICBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcsXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgYW1vdW50IGlzIG1pc3NpbmcsIHdpdGhvdXQgYW55IG5ldHdvcmsgY2FsbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsIGFtb3VudDogJycgfSksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgc3RyaW5nJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2Ftb3VudCBib3VuZGFyeSB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGUgZG93bnN0cmVhbSBCaWdJbnRGcm9tU3RyaW5nIGNvZGVjIGFjY2VwdHMgYWxsIG9mIHRoZXNlIHZpYSBKUydzIEJpZ0ludCgpIGNvbnN0cnVjdG9yLFxuICAgICAgICAvLyBzbyB0aGUgY2xpZW50LXNpZGUgZ3VhcmQgaXMgdGhlIG9ubHkgdGhpbmcgc3RhbmRpbmcgYmV0d2VlbiBhIG1hbGZvcm1lZC9tYWxpY2lvdXMgYW1vdW50XG4gICAgICAgIC8vIGFuZCBhIHZhbHVlLW1vdmluZyBXRVRIOSBkZXBvc2l0KCkvd2l0aGRyYXcoKSBjYWxsLlxuICAgICAgICBjb25zdCByZWplY3RlZEFtb3VudHMgPSBbXG4gICAgICAgICAgWyctMScsICduZWdhdGl2ZSddLFxuICAgICAgICAgIFsnMCcsICd6ZXJvJ10sXG4gICAgICAgICAgWycweGFiYycsICdoZXhhZGVjaW1hbCddLFxuICAgICAgICAgIFsnMS41JywgJ2RlY2ltYWwgcG9pbnQnXSxcbiAgICAgICAgICBbJzFlMTgnLCAnc2NpZW50aWZpYyBub3RhdGlvbiddLFxuICAgICAgICAgIFsnKzEwMCcsICdleHBsaWNpdCBzaWduJ10sXG4gICAgICAgICAgWycgMTAwJywgJ2xlYWRpbmcgd2hpdGVzcGFjZSddLFxuICAgICAgICAgIFsnMTAwICcsICd0cmFpbGluZyB3aGl0ZXNwYWNlJ10sXG4gICAgICAgICAgWydhYmMnLCAnbm9uLW51bWVyaWMnXSxcbiAgICAgICAgXSBhcyBjb25zdDtcbiAgICAgICAgcmVqZWN0ZWRBbW91bnRzLmZvckVhY2goKFthbW91bnQsIHdoeV0pID0+IHtcbiAgICAgICAgICBpdChgc2hvdWxkIHJlamVjdCBhICR7d2h5fSBhbW91bnQgKCR7SlNPTi5zdHJpbmdpZnkoYW1vdW50KX0pLCB3aXRob3V0IGFueSBuZXR3b3JrIGNhbGxgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG5cbiAgICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsIGFtb3VudCB9KSwge1xuICAgICAgICAgICAgICBtZXNzYWdlOiAnYW1vdW50IG11c3QgYmUgYSBwb3NpdGl2ZSB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgc3RyaW5nJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgWycxJywgJzEwMDAwMDAwMDAwMDAwMDAwMDAnLCAnMDA3J10uZm9yRWFjaCgoYW1vdW50KSA9PiB7XG4gICAgICAgICAgaXQoYHNob3VsZCBhY2NlcHQgYW1vdW50ICR7SlNPTi5zdHJpbmdpZnkoYW1vdW50KX0gYW5kIGZvcndhcmQgaXQgdmVyYmF0aW1gLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1ib3VuZGFyeScgfSB9KTtcblxuICAgICAgICAgICAgYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50IH0pO1xuXG4gICAgICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgICAgICBhcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbChhbW91bnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgndmF1bHRJZCB0cmltbWluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgYSB3aGl0ZXNwYWNlLW9ubHkgdmF1bHRJZCwgd2l0aG91dCBhbnkgbmV0d29yayBjYWxsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcblxuICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJyAgICcsIGFtb3VudDogJzUwMDAnIH0pLCB7XG4gICAgICAgICAgICBtZXNzYWdlOiAndmF1bHRJZCBpcyByZXF1aXJlZCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0cmltIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgZnJvbSB2YXVsdElkIGJlZm9yZSBjYWxsaW5nIHNlbmRNYW55JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd0eHJlcS10cmltJyB9IH0pO1xuXG4gICAgICAgICAgYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAnICB2bHQtZ2FsYXh5LXdldGggICcsIGFtb3VudDogJzUwMDAnIH0pO1xuXG4gICAgICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICAgIGFyZ3MuZGVmaVBhcmFtcy52YXVsdElkLnNob3VsZC5lcXVhbCgndmx0LWdhbGF4eS13ZXRoJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgYSBjbGVhciBjbGllbnQtc2lkZSBlcnJvciBmb3IgYSBub24tRVZNIGNvaW4sIHdpdGhvdXQgYW55IG5ldHdvcmsgY2FsbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0Jhc2VDb2luLmdldEZhbWlseS5yZXR1cm5zKCdidGMnKTtcbiAgICAgICAgbW9ja0Jhc2VDb2luLmdldENvbmZpZy5yZXR1cm5zKHsgZmVhdHVyZXM6IFtdIH0pO1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50OiAnNTAwMCcgfSksIHtcbiAgICAgICAgICBtZXNzYWdlOiAnd3JhcC91bndyYXAgaXMgbm90IHN1cHBvcnRlZCBmb3IgYnRjIHdhbGxldHMnLFxuICAgICAgICB9KTtcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZShgcHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMgJHtzZW5kTWFueVR5cGV9IGRlZmlQYXJhbXMgdmFsaWRhdGlvbmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGRlZmlQYXJhbXMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICAgICgpID0+ICh3YWxsZXQgYXMgYW55KS5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyh7IHR5cGU6IHNlbmRNYW55VHlwZSB9KSxcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoYCR7c2VuZE1hbnlUeXBlfVxcXFwuZGVmaVBhcmFtc2ApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHZhdWx0SWQgaXMgbm90IGEgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBzZW5kTWFueVR5cGUsXG4gICAgICAgICAgICAgICAgZGVmaVBhcmFtczogeyB2YXVsdElkOiAxMjMsIGFtb3VudDogJzUwMDAnIH0sXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgJHtzZW5kTWFueVR5cGV9XFxcXC5kZWZpUGFyYW1zYClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIG5vdCBhIG51bWVyaWMgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBzZW5kTWFueVR5cGUsXG4gICAgICAgICAgICAgICAgZGVmaVBhcmFtczogeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6IDUwMDAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgUmVnRXhwKGAke3NlbmRNYW55VHlwZX1cXFxcLmRlZmlQYXJhbXNgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3YWxsZXQuZGVmaSBnZXR0ZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBEZWZpVmF1bHQgaW5zdGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkZWZpID0gd2FsbGV0LmRlZmk7XG4gICAgICAoZGVmaSBpbnN0YW5jZW9mIERlZmlWYXVsdCkuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9uIHN1YnNlcXVlbnQgY2FsbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkZWZpMSA9IHdhbGxldC5kZWZpO1xuICAgICAgY29uc3QgZGVmaTIgPSB3YWxsZXQuZGVmaTtcbiAgICAgIChkZWZpMSA9PT0gZGVmaTIpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=