@bitgo-beta/sdk-core 8.2.1-beta.190 → 8.2.1-beta.1900

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 (643) 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 +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +53 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +97 -10
  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.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +31 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +150 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +110 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +169 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +270 -27
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +7 -3
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/defi/defiVault.d.ts +87 -0
  118. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  119. package/dist/src/bitgo/defi/defiVault.js +225 -0
  120. package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
  121. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  122. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  123. package/dist/src/bitgo/defi/index.d.ts +3 -0
  124. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  125. package/dist/src/bitgo/defi/index.js +22 -0
  126. package/dist/src/bitgo/ecdh.d.ts +0 -1
  127. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  128. package/dist/src/bitgo/ecdh.js +26 -13
  129. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -4
  130. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/enterprise.js +39 -21
  132. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  133. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -3
  134. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  135. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  136. package/dist/src/bitgo/enterprise/index.js +6 -2
  137. package/dist/src/bitgo/environments.d.ts +69 -5
  138. package/dist/src/bitgo/environments.d.ts.map +1 -1
  139. package/dist/src/bitgo/environments.js +417 -40
  140. package/dist/src/bitgo/errors.d.ts +175 -0
  141. package/dist/src/bitgo/errors.d.ts.map +1 -1
  142. package/dist/src/bitgo/errors.js +166 -2
  143. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  144. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  145. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  146. package/dist/src/bitgo/index.d.ts +4 -1
  147. package/dist/src/bitgo/index.d.ts.map +1 -1
  148. package/dist/src/bitgo/index.js +30 -11
  149. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  150. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  151. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  152. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  153. package/dist/src/bitgo/internal/index.js +6 -2
  154. package/dist/src/bitgo/internal/internal.js +5 -6
  155. package/dist/src/bitgo/internal/keycard.d.ts +12 -8
  156. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  157. package/dist/src/bitgo/internal/keycard.js +60 -48
  158. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  159. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  160. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  161. package/dist/src/bitgo/keychain/iKeychains.d.ts +95 -10
  162. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  163. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  164. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  165. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  166. package/dist/src/bitgo/keychain/index.js +7 -2
  167. package/dist/src/bitgo/keychain/keychains.d.ts +39 -7
  168. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  169. package/dist/src/bitgo/keychain/keychains.js +227 -52
  170. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  171. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  172. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  173. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  174. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  175. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  176. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  177. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  178. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  179. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  180. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  181. package/dist/src/bitgo/market/index.js +6 -2
  182. package/dist/src/bitgo/market/markets.js +23 -9
  183. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  184. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  186. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  187. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  188. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  189. package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
  190. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  191. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  192. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  193. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  194. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  195. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  196. package/dist/src/bitgo/proofs/index.js +6 -0
  197. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  198. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  199. package/dist/src/bitgo/proofs/types.js +80 -0
  200. package/dist/src/bitgo/recovery/index.js +6 -2
  201. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  202. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  203. package/dist/src/bitgo/recovery/initiate.js +49 -41
  204. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  205. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  206. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  207. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  208. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  209. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  210. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  211. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  212. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  213. package/dist/src/bitgo/staking/iStakingWallet.d.ts +178 -7
  214. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  215. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  216. package/dist/src/bitgo/staking/index.d.ts +3 -0
  217. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  218. package/dist/src/bitgo/staking/index.js +9 -2
  219. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  220. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  221. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  222. package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
  223. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  224. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  225. package/dist/src/bitgo/trading/index.d.ts +1 -0
  226. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  227. package/dist/src/bitgo/trading/index.js +7 -2
  228. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  229. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  230. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  231. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  232. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  233. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  234. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  235. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  236. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  237. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  238. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  239. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  240. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  241. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  242. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  243. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  244. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  245. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  246. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  247. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  248. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  249. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  250. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  251. package/dist/src/bitgo/trading/network/index.js +21 -0
  252. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  253. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  254. package/dist/src/bitgo/trading/network/network.js +99 -0
  255. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  256. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  257. package/dist/src/bitgo/trading/network/types.js +3 -0
  258. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  259. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  260. package/dist/src/bitgo/trading/network/utils.js +54 -0
  261. package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
  262. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  263. package/dist/src/bitgo/trading/tradingAccount.js +64 -7
  264. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  265. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  266. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  267. package/dist/src/bitgo/tss/common.d.ts +40 -6
  268. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  269. package/dist/src/bitgo/tss/common.js +122 -17
  270. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  271. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  272. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  273. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  274. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  275. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  276. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  277. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  278. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  279. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  280. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  281. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  282. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  283. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  284. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  285. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  286. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  287. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  288. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  289. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  290. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  291. package/dist/src/bitgo/tss/index.d.ts +3 -2
  292. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  293. package/dist/src/bitgo/tss/index.js +26 -10
  294. package/dist/src/bitgo/tss/types.d.ts +3 -3
  295. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  296. package/dist/src/bitgo/tss/types.js +2 -2
  297. package/dist/src/bitgo/types.d.ts +3 -3
  298. package/dist/src/bitgo/types.d.ts.map +1 -1
  299. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  300. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  301. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  302. package/dist/src/bitgo/utils/codecProps.js +24 -11
  303. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  304. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  305. package/dist/src/bitgo/utils/codecs.js +59 -0
  306. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  307. package/dist/src/bitgo/utils/decode.js +30 -16
  308. package/dist/src/bitgo/utils/index.d.ts +4 -2
  309. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  310. package/dist/src/bitgo/utils/index.js +27 -11
  311. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  312. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  313. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  314. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  315. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/mpcUtils.js +153 -14
  317. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  318. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  319. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  320. package/dist/src/bitgo/utils/opengpgUtils.d.ts +10 -7
  321. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  322. package/dist/src/bitgo/utils/opengpgUtils.js +75 -62
  323. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  324. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  325. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  326. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  328. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  329. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  330. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  331. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  332. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/triple.js +2 -3
  334. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  335. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  336. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  337. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +97 -18
  338. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  339. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +307 -46
  340. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +414 -46
  341. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  342. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  343. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  345. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  346. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  347. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  348. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  349. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +24 -51
  350. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  351. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +172 -246
  352. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +215 -0
  353. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  354. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1049 -0
  355. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  356. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  357. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  358. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  359. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  360. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  361. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  362. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  363. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  364. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  367. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  368. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  369. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  370. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  371. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  372. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  373. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +37 -11
  374. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  375. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  376. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +137 -0
  377. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  378. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +643 -0
  379. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  380. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  381. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
  382. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  383. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  384. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  385. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  386. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  387. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  388. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  391. package/dist/src/bitgo/utils/tss/index.d.ts +3 -0
  392. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  393. package/dist/src/bitgo/utils/tss/index.js +26 -9
  394. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  395. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  396. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  397. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +33 -0
  398. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  399. package/dist/src/bitgo/utils/tss/recipientUtils.js +117 -0
  400. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  401. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  402. package/dist/src/bitgo/utils/txRequest.js +49 -0
  403. package/dist/src/bitgo/utils/util.js +24 -10
  404. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  405. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  406. package/dist/src/bitgo/utils/wallet.js +48 -0
  407. package/dist/src/bitgo/wallet/BuildParams.d.ts +50 -1
  408. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  409. package/dist/src/bitgo/wallet/BuildParams.js +58 -11
  410. package/dist/src/bitgo/wallet/iWallet.d.ts +496 -23
  411. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  412. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  413. package/dist/src/bitgo/wallet/iWallets.d.ts +298 -16
  414. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  415. package/dist/src/bitgo/wallet/iWallets.js +63 -3
  416. package/dist/src/bitgo/wallet/index.js +6 -2
  417. package/dist/src/bitgo/wallet/wallet.d.ts +350 -27
  418. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  419. package/dist/src/bitgo/wallet/wallet.js +1934 -360
  420. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  421. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  422. package/dist/src/bitgo/wallet/wallets.js +1144 -155
  423. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  424. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  425. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  426. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  427. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  428. package/dist/src/bitgo/walletUtil/index.js +19 -0
  429. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  430. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  431. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  432. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  433. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  434. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  435. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  436. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  437. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  438. package/dist/src/bitgo/webhook/index.js +6 -2
  439. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  440. package/dist/src/coins/fiat.d.ts +45 -0
  441. package/dist/src/coins/fiat.d.ts.map +1 -0
  442. package/dist/src/coins/fiat.js +94 -0
  443. package/dist/src/coins/index.d.ts +1 -6
  444. package/dist/src/coins/index.d.ts.map +1 -1
  445. package/dist/src/coins/index.js +7 -8
  446. package/dist/src/coins/ofc.d.ts +21 -2
  447. package/dist/src/coins/ofc.d.ts.map +1 -1
  448. package/dist/src/coins/ofc.js +29 -3
  449. package/dist/src/coins/ofcToken.d.ts +15 -4
  450. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  451. package/dist/src/coins/ofcToken.js +43 -5
  452. package/dist/src/coins/susd.d.ts +3 -2
  453. package/dist/src/coins/susd.d.ts.map +1 -1
  454. package/dist/src/coins/susd.js +5 -1
  455. package/dist/src/common.js +27 -13
  456. package/dist/src/index.d.ts +7 -1
  457. package/dist/src/index.d.ts.map +1 -1
  458. package/dist/src/index.js +32 -11
  459. package/dist/src/lightning.d.ts +20 -0
  460. package/dist/src/lightning.d.ts.map +1 -0
  461. package/dist/src/lightning.js +13 -0
  462. package/dist/src/units.js +5 -6
  463. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  464. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  465. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  466. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  467. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  468. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  469. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  470. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  471. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  472. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  473. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  474. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  475. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  476. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  477. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  478. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  479. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  480. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  481. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  482. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  483. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  484. package/dist/test/unit/bitgo/defi/defiVault.js +338 -0
  485. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  486. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  487. package/dist/test/unit/bitgo/environment.js +38 -0
  488. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  489. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  490. package/dist/test/unit/bitgo/errors.js +262 -0
  491. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  492. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  493. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  494. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  495. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  496. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  497. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  498. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  499. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  500. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  501. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  502. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  503. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  504. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  505. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  506. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  507. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  508. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  509. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  510. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  511. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  512. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  513. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +399 -0
  514. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  515. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  516. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  517. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  518. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  519. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  520. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  521. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  522. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  523. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  524. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  525. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  526. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  527. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  528. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1279 -0
  529. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  530. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  531. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  532. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  533. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  534. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  535. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  536. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  537. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +171 -0
  538. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  539. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  540. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  541. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  542. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  543. package/dist/test/unit/bitgo/wallet/BuildParams.js +97 -0
  544. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
  545. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  546. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  547. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  548. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  549. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  550. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  551. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  552. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  553. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  554. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  555. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  556. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  557. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  558. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  559. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  560. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  561. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  562. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  563. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  564. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  565. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  566. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  567. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  568. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  569. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  570. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  571. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  572. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  573. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  574. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  575. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  576. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  577. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  578. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  579. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  580. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +670 -0
  581. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  582. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  583. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  584. package/dist/test/unit/coins/ofc.d.ts +2 -0
  585. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  586. package/dist/test/unit/coins/ofc.js +124 -0
  587. package/dist/test/unit/lightning.d.ts +2 -0
  588. package/dist/test/unit/lightning.d.ts.map +1 -0
  589. package/dist/test/unit/lightning.js +23 -0
  590. package/dist/test/unit/units.d.ts.map +1 -1
  591. package/dist/test/unit/units.js +64 -64
  592. package/dist/tsconfig.tsbuildinfo +1 -1
  593. package/package.json +24 -21
  594. package/.eslintignore +0 -5
  595. package/CHANGELOG.md +0 -1568
  596. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  597. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  598. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  599. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  600. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  601. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  602. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  603. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  604. package/dist/src/bitgo/lightning/index.js +0 -17
  605. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  606. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  607. package/dist/src/bitgo/lightning/lightning.js +0 -111
  608. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  609. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  610. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  611. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  612. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  613. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  614. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  615. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  616. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  617. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  618. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  619. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  620. package/dist/src/coins/fiateur.d.ts +0 -31
  621. package/dist/src/coins/fiateur.d.ts.map +0 -1
  622. package/dist/src/coins/fiateur.js +0 -57
  623. package/dist/src/coins/fiatgbp.d.ts +0 -31
  624. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  625. package/dist/src/coins/fiatgbp.js +0 -57
  626. package/dist/src/coins/fiatusd.d.ts +0 -31
  627. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  628. package/dist/src/coins/fiatusd.js +0 -57
  629. package/dist/src/coins/tfiateur.d.ts +0 -11
  630. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  631. package/dist/src/coins/tfiateur.js +0 -17
  632. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  633. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  634. package/dist/src/coins/tfiatgbp.js +0 -17
  635. package/dist/src/coins/tfiatusd.d.ts +0 -11
  636. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  637. package/dist/src/coins/tfiatusd.js +0 -17
  638. package/dist/src/openssl/index.d.ts +0 -5
  639. package/dist/src/openssl/index.d.ts.map +0 -1
  640. package/dist/src/openssl/index.js +0 -9
  641. package/dist/test/unit/openssl.d.ts +0 -2
  642. package/dist/test/unit/openssl.d.ts.map +0 -1
  643. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,18 +15,60 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
20
37
  };
21
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.txParamsFromIntent = txParamsFromIntent;
40
+ const openpgp = __importStar(require("openpgp"));
22
41
  const openpgp_1 = require("openpgp");
42
+ const keychain_1 = require("../../keychain");
23
43
  const tss_1 = require("../../tss");
24
44
  const mpcUtils_1 = require("../mpcUtils");
25
45
  const _ = __importStar(require("lodash"));
46
+ const util_1 = require("../util");
47
+ const bitgoPubKeys_1 = require("../../tss/bitgoPubKeys");
48
+ const opengpgUtils_1 = require("../opengpgUtils");
49
+ const assert_1 = __importDefault(require("assert"));
50
+ const messageTypes_1 = require("../messageTypes");
51
+ /**
52
+ * Derives txParams from the persisted intent on a TxRequest for EdDSA MPCv2 signing paths
53
+ * where no SDK-local buildParams is available (PA path and UI re-sign path).
54
+ * Native coin transfers (where symbol equals the chain name) are excluded from tokenName.
55
+ */
56
+ function txParamsFromIntent(intent, chainName) {
57
+ if (typeof intent !== 'object' || intent === null || !('recipients' in intent)) {
58
+ return undefined;
59
+ }
60
+ const { recipients } = intent;
61
+ if (!recipients?.length) {
62
+ return undefined;
63
+ }
64
+ return {
65
+ recipients: recipients.map((r) => ({
66
+ address: r.address.address,
67
+ amount: String(r.amount.value),
68
+ ...(r.amount.symbol && r.amount.symbol !== chainName && { tokenName: r.amount.symbol }),
69
+ })),
70
+ };
71
+ }
26
72
  /**
27
73
  * BaseTssUtil class which different signature schemes have to extend
28
74
  */
@@ -37,6 +83,86 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
37
83
  }
38
84
  return this._wallet;
39
85
  }
86
+ async setBitgoGpgPubKey(bitgo) {
87
+ const { mpcV1, mpcV2, eddsaMpcV2 } = await (0, opengpgUtils_1.getBitgoGpgPubKey)(bitgo);
88
+ // Do not unset the MPCv1 key if it is already set. This is to avoid unsetting if extra constants api calls fail.
89
+ if (mpcV1 !== undefined) {
90
+ this.bitgoPublicGpgKey = mpcV1;
91
+ }
92
+ // Do not unset the MPCv2 key if it is already set
93
+ if (mpcV2 !== undefined) {
94
+ this.bitgoMPCv2PublicGpgKey = mpcV2;
95
+ }
96
+ // Do not unset the EdDSA MPCv2 key if it is already set
97
+ if (eddsaMpcV2 !== undefined) {
98
+ this.bitgoEddsaMpcv2PublicGpgKey = eddsaMpcV2;
99
+ }
100
+ }
101
+ async pickBitgoPubGpgKeyForSigning(isMpcv2, reqId, enterpriseId, isEddsaMpcv2) {
102
+ let bitgoGpgPubKey;
103
+ try {
104
+ const bitgoKeyChain = await this.baseCoin.keychains().get({ id: this.wallet.keyIds()[keychain_1.KeyIndices.BITGO], reqId });
105
+ if (!bitgoKeyChain || !bitgoKeyChain.hsmType) {
106
+ throw new Error('Missing Bitgo GPG Pub Key Type.');
107
+ }
108
+ bitgoGpgPubKey = await openpgp.readKey({
109
+ armoredKey: (0, bitgoPubKeys_1.getBitgoMpcGpgPubKey)(this.bitgo.getEnv(), bitgoKeyChain.hsmType === 'nitro' ? 'nitro' : 'onprem', isEddsaMpcv2 ? 'eddsaMpcv2' : isMpcv2 ? 'mpcv2' : 'mpcv1'),
110
+ });
111
+ }
112
+ catch (e) {
113
+ if (!(0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
114
+ console.warn(`Unable to get BitGo GPG key based on key data with error: ${e}. Fetching BitGo GPG key based on feature flags.`);
115
+ // First try to get the key based on feature flags, if that fails, fallback to the default key from constants api.
116
+ bitgoGpgPubKey = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(enterpriseId, isMpcv2, reqId)
117
+ .then(async ({ mpcv2PublicKey, eddsaMpcv2PublicKey }) => {
118
+ if (isEddsaMpcv2) {
119
+ return eddsaMpcv2PublicKey ?? (await this.getBitgoEddsaMpcv2PublicGpgKey());
120
+ }
121
+ return (mpcv2PublicKey ?? (isMpcv2 ? await this.getBitgoMpcv2PublicGpgKey() : await this.getBitgoPublicGpgKey()));
122
+ })
123
+ .catch(async () => {
124
+ if (isEddsaMpcv2) {
125
+ return this.getBitgoEddsaMpcv2PublicGpgKey();
126
+ }
127
+ return isMpcv2 ? await this.getBitgoMpcv2PublicGpgKey() : await this.getBitgoPublicGpgKey();
128
+ });
129
+ }
130
+ else {
131
+ throw new Error(`Environment "${this.bitgo.getEnv()}" requires a BitGo GPG Pub Key Config in BitGoJS for TSS. Error thrown while getting the key from config: ${e}`);
132
+ }
133
+ }
134
+ return bitgoGpgPubKey;
135
+ }
136
+ async getBitgoPublicGpgKey() {
137
+ if (!this.bitgoPublicGpgKey) {
138
+ // retry getting bitgo's gpg key
139
+ await this.setBitgoGpgPubKey(this.bitgo);
140
+ if (!this.bitgoPublicGpgKey) {
141
+ throw new Error("Failed to get Bitgo's gpg key");
142
+ }
143
+ }
144
+ return this.bitgoPublicGpgKey;
145
+ }
146
+ async getBitgoMpcv2PublicGpgKey() {
147
+ if (!this.bitgoMPCv2PublicGpgKey) {
148
+ // retry getting bitgo's gpg key
149
+ await this.setBitgoGpgPubKey(this.bitgo);
150
+ if (!this.bitgoMPCv2PublicGpgKey) {
151
+ throw new Error("Failed to get Bitgo's gpg key");
152
+ }
153
+ }
154
+ return this.bitgoMPCv2PublicGpgKey;
155
+ }
156
+ async getBitgoEddsaMpcv2PublicGpgKey() {
157
+ if (!this.bitgoEddsaMpcv2PublicGpgKey) {
158
+ // retry getting bitgo's gpg key
159
+ await this.setBitgoGpgPubKey(this.bitgo);
160
+ if (!this.bitgoEddsaMpcv2PublicGpgKey) {
161
+ throw new Error("Failed to get Bitgo's EdDSA MPCv2 gpg key");
162
+ }
163
+ }
164
+ return this.bitgoEddsaMpcv2PublicGpgKey;
165
+ }
40
166
  async createBitgoHeldBackupKeyShare(userGpgKey, enterprise) {
41
167
  const keyResponse = await this.bitgo
42
168
  .post(this.baseCoin.url('/krs/backupkeys'))
@@ -98,6 +224,22 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
98
224
  signEcdsaTssUsingExternalSigner(params, requestType, externalSignerPaillierModulusGetter, externalSignerKShareGenerator, externalSignerMuDeltaShareGenerator, externalSignerSShareGenerator) {
99
225
  throw new Error('Method not implemented.');
100
226
  }
227
+ /**
228
+ * Signs a transaction using TSS MPCv2 for ECDSA and through utilization of custom share generators
229
+ *
230
+ * @param {TSSParams | TSSParamsForMessage} params - params object that represents parameters to sign a transaction or a message.
231
+ * @param {CustomMPCv2SigningRound1GeneratingFunction} externalSignerMPCv2SigningRound1Generator - a function that creates MPCv2 Round 1 shares in the ECDSA TSS MPCv2 flow.
232
+ * @param {CustomMPCv2SigningRound2GeneratingFunction} externalSignerMPCv2SigningRound2Generator - a function that creates MPCv2 Round 2 shares in the ECDSA TSS MPCv2 flow.
233
+ * @param {CustomMPCv2SigningRound3GeneratingFunction} externalSignerMPCv2SigningRound3Generator - a function that creates MPCv2 Round 3 shares in the ECDSA TSS MPCv2 flow.
234
+ * @param {RequestType} requestType - the type of the request to sign (transaction or message).
235
+ * @returns {Promise<TxRequest>} - a signed tx request
236
+ */
237
+ signEcdsaMPCv2TssUsingExternalSigner(params, externalSignerMPCv2SigningRound1Generator, externalSignerMPCv2SigningRound2Generator, externalSignerMPCv2SigningRound3Generator, requestType) {
238
+ throw new Error('Method not implemented.');
239
+ }
240
+ signEddsaMPCv2TssUsingExternalSigner(params, externalSignerEddsaMPCv2SigningRound1Generator, externalSignerEddsaMPCv2SigningRound2Generator, externalSignerEddsaMPCv2SigningRound3Generator, requestType) {
241
+ throw new Error('Method not implemented.');
242
+ }
101
243
  /**
102
244
  * Create an Commitment (User to BitGo) share from an unsigned transaction and private user signing material
103
245
  * EDDSA only
@@ -156,6 +298,8 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
156
298
  apiVersion: apiVersion,
157
299
  preview,
158
300
  };
301
+ const reqTracer = params.reqId || new util_1.RequestTracer();
302
+ this.bitgo.setRequestTracer(reqTracer);
159
303
  const unsignedTx = (await this.bitgo
160
304
  .post(this.bitgo.url('/wallet/' + this.wallet.id() + '/txrequests', 2))
161
305
  .send(whitelistedParams)
@@ -164,24 +308,46 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
164
308
  }
165
309
  /**
166
310
  * Create a tx request from params for message signing
311
+ * @deprecated Use createSignMessageRequest instead
167
312
  *
168
313
  * @param params
169
314
  * @param apiVersion
170
315
  * @param preview
171
316
  */
172
317
  async createTxRequestWithIntentForMessageSigning(params, apiVersion = 'full', preview) {
173
- var _a, _b;
174
318
  const intentOptions = {
175
319
  custodianMessageId: params.custodianMessageId,
176
320
  intentType: params.intentType,
177
321
  sequenceId: params.sequenceId,
178
322
  comment: params.comment,
179
- memo: (_a = params.memo) === null || _a === void 0 ? void 0 : _a.value,
323
+ memo: params.memo?.value,
180
324
  isTss: params.isTss,
181
325
  messageRaw: params.messageRaw,
182
- messageEncoded: (_b = params.messageEncoded) !== null && _b !== void 0 ? _b : '',
326
+ messageEncoded: params.messageEncoded ?? '',
183
327
  };
184
- return this.createTxRequestBase(intentOptions, apiVersion, preview);
328
+ return this.createTxRequestBase(intentOptions, apiVersion, preview, params.reqId);
329
+ }
330
+ /**
331
+ * Create a sign message request
332
+ *
333
+ * @param params - the parameters for the sign message request
334
+ * @param apiVersion - the API version to use, defaults to 'full'
335
+ */
336
+ async buildSignMessageRequest(params, apiVersion = 'full') {
337
+ (0, assert_1.default)(params.intentType === 'signMessage', 'Intent type must be signMessage for createMsgRequestWithSignMessageIntent');
338
+ const intent = {
339
+ custodianMessageId: params.custodianMessageId,
340
+ intentType: params.intentType,
341
+ sequenceId: params.sequenceId,
342
+ comment: params.comment,
343
+ memo: params.memo?.value,
344
+ isTss: params.isTss,
345
+ messageRaw: params.messageRaw,
346
+ messageStandardType: params.messageStandardType ?? messageTypes_1.MessageStandardType.UNKNOWN,
347
+ messageEncoded: params.messageEncoded ?? '',
348
+ signerAddress: params.signerAddress,
349
+ };
350
+ return this.buildSignMessageRequestBase(intent, apiVersion, params.reqId);
185
351
  }
186
352
  /**
187
353
  * Create a tx request from params for type data signing
@@ -191,25 +357,24 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
191
357
  * @param preview
192
358
  */
193
359
  async createTxRequestWithIntentForTypedDataSigning(params, apiVersion = 'full', preview) {
194
- var _a, _b;
195
360
  const intentOptions = {
196
361
  custodianMessageId: params.custodianMessageId,
197
362
  intentType: params.intentType,
198
363
  sequenceId: params.sequenceId,
199
364
  comment: params.comment,
200
- memo: (_a = params.memo) === null || _a === void 0 ? void 0 : _a.value,
365
+ memo: params.memo?.value,
201
366
  isTss: params.isTss,
202
367
  messageRaw: params.typedDataRaw,
203
- messageEncoded: (_b = params.typedDataEncoded) !== null && _b !== void 0 ? _b : '',
368
+ messageEncoded: params.typedDataEncoded ?? '',
204
369
  };
205
- return this.createTxRequestBase(intentOptions, apiVersion, preview);
370
+ return this.createTxRequestBase(intentOptions, apiVersion, preview, params.reqId);
206
371
  }
207
372
  /**
208
373
  * Calls Bitgo API to create tx request.
209
374
  *
210
375
  * @private
211
376
  */
212
- async createTxRequestBase(intentOptions, apiVersion, preview) {
377
+ async createTxRequestBase(intentOptions, apiVersion, preview, reqId) {
213
378
  const whitelistedParams = {
214
379
  intent: {
215
380
  ...intentOptions,
@@ -217,18 +382,42 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
217
382
  apiVersion,
218
383
  preview,
219
384
  };
385
+ const reqTracer = reqId || new util_1.RequestTracer();
386
+ this.bitgo.setRequestTracer(reqTracer);
220
387
  return this.bitgo
221
388
  .post(this.bitgo.url(`/wallet/${this.wallet.id()}/txrequests`, 2))
222
389
  .send(whitelistedParams)
223
390
  .result();
224
391
  }
392
+ /**
393
+ * Calls Bitgo API to create msg request.
394
+ *
395
+ * @private
396
+ */
397
+ async buildSignMessageRequestBase(intent, apiVersion, reqId) {
398
+ const whitelistedParams = {
399
+ intent: {
400
+ ...intent,
401
+ },
402
+ apiVersion,
403
+ };
404
+ const reqTracer = reqId || new util_1.RequestTracer();
405
+ this.bitgo.setRequestTracer(reqTracer);
406
+ return this.bitgo
407
+ .post(this.bitgo.url(`/wallet/${this.wallet.id()}/msgrequests`, 2))
408
+ .send(whitelistedParams)
409
+ .result();
410
+ }
225
411
  /**
226
412
  * Call delete signature shares for a txRequest, the endpoint delete the signatures and return them
227
413
  *
228
414
  * @param {string} txRequestId tx id reference to delete signature shares
415
+ * @param {IRequestTracer} reqId - the request tracer request id
229
416
  * @returns {SignatureShareRecord[]}
230
417
  */
231
- async deleteSignatureShares(txRequestId) {
418
+ async deleteSignatureShares(txRequestId, reqId) {
419
+ const reqTracer = reqId || new util_1.RequestTracer();
420
+ this.bitgo.setRequestTracer(reqTracer);
232
421
  return this.bitgo
233
422
  .del(this.bitgo.url(`/wallet/${this.wallet.id()}/txrequests/${txRequestId}/signatureshares`, 2))
234
423
  .send()
@@ -238,10 +427,13 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
238
427
  * Initialize the send procedure once Bitgo has the User To Bitgo GShare
239
428
  *
240
429
  * @param {String} txRequestId - the txRequest Id
430
+ * @param {IRequestTracer} reqId - the request tracer request id
241
431
  * @returns {Promise<any>}
242
432
  */
243
433
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
244
- async sendTxRequest(txRequestId) {
434
+ async sendTxRequest(txRequestId, reqId) {
435
+ const reqTracer = reqId || new util_1.RequestTracer();
436
+ this.bitgo.setRequestTracer(reqTracer);
245
437
  return this.bitgo
246
438
  .post(this.baseCoin.url('/wallet/' + this.wallet.id() + '/tx/send'))
247
439
  .send({ txRequestId })
@@ -258,61 +450,71 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
258
450
  * @returns {Promise<any>}
259
451
  */
260
452
  async recreateTxRequest(txRequestId, decryptedPrv, reqId) {
261
- await this.deleteSignatureShares(txRequestId);
453
+ await this.deleteSignatureShares(txRequestId, reqId);
262
454
  // after delete signatures shares get the tx without them
263
- const txRequest = await tss_1.getTxRequest(this.bitgo, this.wallet.id(), txRequestId);
264
- return await this.signTxRequest({ txRequest, prv: decryptedPrv, reqId });
455
+ const txRequest = await this.getTxRequest(txRequestId, reqId);
456
+ // EdDSA MPCv2 re-verifies the transaction against txParams.recipients before DSG starts.
457
+ // On the PA path there is no SDK-local buildParams, so derive txParams from the persisted
458
+ // intent. Other TSS variants either skip recipient verification or already work without txParams.
459
+ const txParams = this.wallet.multisigTypeVersion() === 'MPCv2' && this.baseCoin.getMPCAlgorithm() === 'eddsa'
460
+ ? txParamsFromIntent(txRequest.intent, this.baseCoin.getChain())
461
+ : undefined;
462
+ return await this.signTxRequest({ txRequest, prv: decryptedPrv, reqId, txParams });
265
463
  }
266
464
  /**
267
465
  * Gets the latest Tx Request by id
268
466
  *
269
467
  * @param {String} txRequestId - the txRequest Id
468
+ * @param {IRequestTracer} reqId - request tracer request id
270
469
  * @returns {Promise<TxRequest>}
271
470
  */
272
- async getTxRequest(txRequestId) {
273
- return tss_1.getTxRequest(this.bitgo, this.wallet.id(), txRequestId);
471
+ async getTxRequest(txRequestId, reqId) {
472
+ return (0, tss_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequestId, reqId);
274
473
  }
275
474
  /**
276
- * Checks whether the third party backup provider is valid/supported
277
- * @param backupProvider - the backup provider client selected
278
- */
279
- isValidThirdPartyBackupProvider(backupProvider) {
280
- // As of now, BitGo is the only supported KRS provider for TSS
281
- return !!(backupProvider && backupProvider === 'BitGoTrustAsKrs');
282
- }
283
- /**
284
- * It gets the appropriate BitGo GPG public key for key creation based on a
475
+ * It gets the appropriate BitGo GPG public keys for key creation based on a
285
476
  * combination of coin and the feature flags on the user and their enterprise if set.
477
+ * Returns both the default MPCv2 key and the EdDSA-specific MPCv2 key (if present).
286
478
  * @param enterpriseId - enterprise under which user wants to create the wallet
479
+ * @param isMPCv2 - true to get the MPCv2 GPG public key, defaults to false
480
+ * @param reqId - request tracer request id
287
481
  */
288
- async getBitgoGpgPubkeyBasedOnFeatureFlags(enterpriseId) {
482
+ async getBitgoGpgPubkeyBasedOnFeatureFlags(enterpriseId, isMPCv2 = false, reqId) {
483
+ const reqTracer = reqId || new util_1.RequestTracer();
484
+ this.bitgo.setRequestTracer(reqTracer);
289
485
  const response = await this.bitgo
290
486
  .get(this.baseCoin.url('/tss/pubkey'))
291
487
  .query({ enterpriseId })
488
+ .retry(3)
292
489
  .result();
293
- const bitgoPublicKeyStr = response.publicKey;
294
- return openpgp_1.readKey({ armoredKey: bitgoPublicKeyStr });
490
+ const mpcv2PublicKey = await (0, openpgp_1.readKey)({
491
+ armoredKey: (isMPCv2 ? response.mpcv2PublicKey : response.publicKey),
492
+ });
493
+ const eddsaMpcv2PublicKey = response.eddsaMpcv2PublicKey
494
+ ? await (0, openpgp_1.readKey)({ armoredKey: response.eddsaMpcv2PublicKey })
495
+ : undefined;
496
+ return { mpcv2PublicKey, eddsaMpcv2PublicKey };
295
497
  }
296
498
  /**
297
499
  * Returns supported TxRequest versions for this wallet
500
+ * @deprecated Whenever needed, use apiVersion 'full' for TSS wallets
298
501
  */
299
502
  supportedTxRequestVersions() {
300
- var _a, _b, _c, _d;
301
- const walletType = (_a = this._wallet) === null || _a === void 0 ? void 0 : _a.type();
302
- const supportedWalletTypes = ['custodial', 'cold', 'hot'];
303
- if (!walletType || ((_b = this._wallet) === null || _b === void 0 ? void 0 : _b.multisigType()) !== 'tss' || !supportedWalletTypes.includes(walletType)) {
503
+ if (!this._wallet || this._wallet.type() === 'trading' || this._wallet.multisigType() !== 'tss') {
304
504
  return [];
305
505
  }
306
- else if (((_c = this._wallet) === null || _c === void 0 ? void 0 : _c.baseCoin.getMPCAlgorithm()) === 'ecdsa') {
506
+ else if (this._wallet.baseCoin.getMPCAlgorithm() === 'ecdsa') {
307
507
  return ['full'];
308
508
  }
309
- else if (walletType === 'custodial' || walletType === 'cold') {
310
- return ['full'];
311
- }
312
- else if (((_d = this._wallet) === null || _d === void 0 ? void 0 : _d.baseCoin.getMPCAlgorithm()) === 'eddsa' && walletType === 'hot') {
509
+ else if (this._wallet.baseCoin.getMPCAlgorithm() === 'eddsa' && this._wallet.type() === 'hot') {
510
+ if (this._wallet.multisigTypeVersion() === 'MPCv2') {
511
+ return ['full'];
512
+ }
313
513
  return ['lite', 'full'];
314
514
  }
315
- return [];
515
+ else {
516
+ return ['full'];
517
+ }
316
518
  }
317
519
  /**
318
520
  * Returns true if the txRequest is using apiVersion == full and is pending approval
@@ -323,6 +525,65 @@ class BaseTssUtils extends mpcUtils_1.MpcUtils {
323
525
  const { apiVersion, state } = txRequest;
324
526
  return apiVersion === 'full' && 'pendingApproval' === state;
325
527
  }
528
+ /**
529
+ * Get the signable hex, derivation path, and serialized tx hex from a full single-transaction request.
530
+ * @param {TxRequest} txRequest - the transaction request object
531
+ * @returns {{ signableHex: string; derivationPath: string; serializedTxHex: string | undefined }} - the signable hex, derivation path, and serialized tx hex
532
+ */
533
+ getSignableHexAndDerivationPath(txRequest, missingTransactionsMessage = 'createOfflineShare requires exactly one transaction in txRequest') {
534
+ (0, assert_1.default)(txRequest.transactions && txRequest.transactions.length === 1, missingTransactionsMessage);
535
+ const unsignedTx = txRequest.transactions[0].unsignedTx;
536
+ (0, assert_1.default)(unsignedTx, 'Missing unsignedTx in transactions');
537
+ (0, assert_1.default)(unsignedTx.signableHex, 'Missing signableHex in unsignedTx');
538
+ (0, assert_1.default)(unsignedTx.derivationPath, 'Missing derivationPath in unsignedTx');
539
+ return {
540
+ signableHex: unsignedTx.signableHex,
541
+ derivationPath: unsignedTx.derivationPath,
542
+ serializedTxHex: unsignedTx.serializedTxHex,
543
+ };
544
+ }
545
+ /**
546
+ * Gets the BitGo and user GPG keys from the BitGo public GPG key and the encrypted user GPG private key.
547
+ * @param {string} bitgoPublicGpgKey - the BitGo public GPG key
548
+ * @param {string} encryptedUserGpgPrvKey - the encrypted user GPG private key
549
+ * @param {string} walletPassphrase - the wallet passphrase
550
+ * @param {string} adata - the additional data to validate the GPG keys
551
+ * @param {string} userGpgKeyDomainSeparator - the domain separator expected in the encrypted GPG key adata
552
+ * @returns {Promise<{ bitgoGpgKey: openpgp.Key; userGpgPrvKey: openpgp.PrivateKey }>} - the BitGo and user GPG keys
553
+ */
554
+ async getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, userGpgKeyDomainSeparator) {
555
+ const bitgoGpgKey = await openpgp.readKey({ armoredKey: bitgoPublicGpgKey });
556
+ const decryptedGpgPrvKey = await this.bitgo.decrypt({
557
+ input: encryptedUserGpgPrvKey,
558
+ password: walletPassphrase,
559
+ });
560
+ if (adata) {
561
+ this.validateAdata(adata, encryptedUserGpgPrvKey, userGpgKeyDomainSeparator);
562
+ }
563
+ const userGpgPrvKey = await openpgp.readPrivateKey({ armoredKey: decryptedGpgPrvKey });
564
+ return { bitgoGpgKey, userGpgPrvKey };
565
+ }
566
+ /**
567
+ * Validates encryption additional authenticated data against the ciphertext envelope.
568
+ * @param adata string
569
+ * @param cyphertext string
570
+ * @param roundDomainSeparator string
571
+ * @throws {Error} if the adata or cyphertext is invalid
572
+ */
573
+ validateAdata(adata, cyphertext, roundDomainSeparator) {
574
+ let cypherJson;
575
+ try {
576
+ cypherJson = JSON.parse(cyphertext);
577
+ }
578
+ catch (e) {
579
+ throw new Error('Failed to parse cyphertext to JSON, got: ' + cyphertext);
580
+ }
581
+ // using decodeURIComponent to handle special characters
582
+ if (decodeURIComponent(cypherJson.adata) !== decodeURIComponent(`${roundDomainSeparator}:${adata}`) &&
583
+ decodeURIComponent(cypherJson.adata) !== decodeURIComponent(adata)) {
584
+ throw new Error('Adata does not match cyphertext adata');
585
+ }
586
+ }
326
587
  }
327
588
  exports.default = BaseTssUtils;
328
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZVRTU1V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9iYXNlVFNTVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EscUNBQTBEO0FBSTFELG1DQUF5QztBQUV6QywwQ0FBdUM7QUFDdkMsMENBQTRCO0FBOEI1Qjs7R0FFRztBQUNILE1BQXFCLFlBQXVCLFNBQVEsbUJBQVE7SUFHMUQsWUFBWSxLQUFnQixFQUFFLFFBQW1CLEVBQUUsTUFBZ0I7UUFDakUsS0FBSyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyw2QkFBNkIsQ0FDakMsVUFBcUMsRUFDckMsVUFBOEI7UUFFOUIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSzthQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUMxQyxJQUFJLENBQUM7WUFDSixVQUFVO1lBQ1YsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLFNBQVM7U0FDdkMsQ0FBQzthQUNELE1BQU0sRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQzVEO1FBQ0QsT0FBTztZQUNMLEVBQUUs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QixNQUFNLFVBQVUsR0FBRyxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLElBQUksRUFBRSxDQUFDO1FBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLFlBQVksRUFBRSxNQUFLLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2RyxPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU0sSUFBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsUUFBUSxDQUFDLGVBQWUsRUFBRSxNQUFLLE9BQU8sRUFBRTtZQUMvRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakI7YUFBTSxJQUFJLFVBQVUsS0FBSyxXQUFXLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5RCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakI7YUFBTSxJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxRQUFRLENBQUMsZUFBZSxFQUFFLE1BQUssT0FBTyxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDdkYsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN6QjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCw4QkFBOEIsQ0FBQyxTQUFvQjtRQUNqRCxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUN4QyxPQUFPLFVBQVUsS0FBSyxNQUFNLElBQUksaUJBQWlCLEtBQUssS0FBSyxDQUFDO0lBQzlELENBQUM7Q0FDRjtBQWpZRCwrQkFpWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uLy4uLy4uL2FwaSc7XG5pbXBvcnQgeyBLZXksIHJlYWRLZXksIFNlcmlhbGl6ZWRLZXlQYWlyIH0gZnJvbSAnb3BlbnBncCc7XG5pbXBvcnQgeyBJQmFzZUNvaW4sIEtleWNoYWluc1RyaXBsZXQgfSBmcm9tICcuLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgS2V5Y2hhaW4gfSBmcm9tICcuLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi90c3MnO1xuaW1wb3J0IHsgSVdhbGxldCwgQmFja3VwUHJvdmlkZXIgfSBmcm9tICcuLi8uLi93YWxsZXQnO1xuaW1wb3J0IHsgTXBjVXRpbHMgfSBmcm9tICcuLi9tcGNVdGlscyc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCaXRnb0dQR1B1YmxpY0tleSxcbiAgQml0Z29IZWxkQmFja3VwS2V5U2hhcmUsXG4gIEN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBJVHNzVXRpbHMsXG4gIFByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9ucyxcbiAgU2lnbmF0dXJlU2hhcmVSZWNvcmQsXG4gIFRTU1BhcmFtcyxcbiAgVHhSZXF1ZXN0LFxuICBUeFJlcXVlc3RWZXJzaW9uLFxuICBDcmVhdGVLZXljaGFpblBhcmFtc0Jhc2UsXG4gIEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICBQb3B1bGF0ZWRJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyxcbiAgSW50ZW50T3B0aW9uc0ZvclR5cGVkRGF0YSxcbiAgUG9wdWxhdGVkSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyxcbiAgQ3JlYXRlQml0R29LZXljaGFpblBhcmFtc0Jhc2UsXG4gIENvbW1pdG1lbnRTaGFyZVJlY29yZCxcbiAgRW5jcnlwdGVkU2lnbmVyU2hhcmVSZWNvcmQsXG4gIEN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gIFJlcXVlc3RUeXBlLFxuICBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgQ3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NdURlbHRhU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbVNTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbn0gZnJvbSAnLi9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgR1NoYXJlLCBTaWduU2hhcmUgfSBmcm9tICcuLi8uLi8uLi9hY2NvdW50LWxpYi9tcGMvdHNzJztcblxuLyoqXG4gKiBCYXNlVHNzVXRpbCBjbGFzcyB3aGljaCBkaWZmZXJlbnQgc2lnbmF0dXJlIHNjaGVtZXMgaGF2ZSB0byBleHRlbmRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVRzc1V0aWxzPEtleVNoYXJlPiBleHRlbmRzIE1wY1V0aWxzIGltcGxlbWVudHMgSVRzc1V0aWxzPEtleVNoYXJlPiB7XG4gIHByaXZhdGUgX3dhbGxldD86IElXYWxsZXQ7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0PzogSVdhbGxldCkge1xuICAgIHN1cGVyKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0O1xuICB9XG5cbiAgZ2V0IHdhbGxldCgpOiBJV2FsbGV0IHtcbiAgICBpZiAoXy5pc05pbCh0aGlzLl93YWxsZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBub3QgZGVmaW5lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy9rcnMvYmFja3Vwa2V5cycpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgaWYgKCFrZXlSZXNwb25zZSB8fCAha2V5UmVzcG9uc2Uua2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgYmFja3VwIHNoYXJlcyBmcm9tIEJpdEdvLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGtleVJlc3BvbnNlLmlkLFxuICAgICAga2V5U2hhcmVzOiBrZXlSZXNwb25zZS5rZXlTaGFyZXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgIGtleUlkOiBzdHJpbmcsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYmFja3VwR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJLZXljaGFpbihwYXJhbXM6IENyZWF0ZUtleWNoYWluUGFyYW1zQmFzZSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBjcmVhdGVCYWNrdXBLZXljaGFpbihwYXJhbXM6IENyZWF0ZUtleWNoYWluUGFyYW1zQmFzZSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBjcmVhdGVCaXRnb0tleWNoYWluKHBhcmFtczogQ3JlYXRlQml0R29LZXljaGFpblBhcmFtc0Jhc2UpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1RoaXJkUGFydHlCYWNrdXA/OiBib29sZWFuO1xuICAgIGJhY2t1cFByb3ZpZGVyPzogQmFja3VwUHJvdmlkZXI7XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtcyk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gdXNpbmcgVFNTIGZvciBFZERTQSBhbmQgdGhyb3VnaCB1dGlsaXphdGlvbiBvZiBjdXN0b20gc2hhcmUgZ2VuZXJhdG9yc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFR4UmVxdWVzdH0gdHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCB3aXRoIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7Q3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9ufSBleHRlcm5hbFNpZ25lclJTaGFyZUdlbmVyYXRvciBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBSIHNoYXJlcyBpbiB0aGUgRWREU0EgVFNTIGZsb3dcbiAgICogQHBhcmFtIHtDdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb259IGV4dGVybmFsU2lnbmVyR1NoYXJlR2VuZXJhdG9yIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIEcgc2hhcmVzIGluIHRoZSBFZERTQSBUU1MgZmxvd1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSAtIGEgc2lnbmVkIHR4IHJlcXVlc3RcbiAgICovXG4gIHNpZ25FZGRzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgdHhSZXF1ZXN0OiBzdHJpbmcgfCBUeFJlcXVlc3QsXG4gICAgZXh0ZXJuYWxTaWduZXJDb21taXRtZW50R2VuZXJhdG9yOiBDdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yOiBDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJHU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBhIHRyYW5zYWN0aW9uIHVzaW5nIFRTUyBmb3IgRUNEU0EgYW5kIHRocm91Z2ggdXRpbGl6YXRpb24gb2YgY3VzdG9tIHNoYXJlIGdlbmVyYXRvcnNcbiAgICpcbiAgICogQHBhcmFtIHtwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2V9IHBhcmFtcyAtIHBhcmFtcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHBhcmFtZXRlcnMgdG8gc2lnbiBhIHRyYW5zYWN0aW9uIG9yIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtSZXF1ZXN0VHlwZX0gcmVxdWVzdFR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgcmVxdWVzdCB0byBzaWduICh0cmFuc2FjdGlvbiBvciBtZXNzYWdlKS5cbiAgICogQHBhcmFtIHtDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbn0gZXh0ZXJuYWxTaWduZXJQYWlsbGllck1vZHVsdXNHZXR0ZXIgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgUGFpbGxpZXIgTW9kdWx1cyBzaGFyZXMgaW4gdGhlIEVDRFNBIFRTUyBmbG93LlxuICAgKiBAcGFyYW0ge0N1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbn0gZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3IgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgSyBzaGFyZXMgaW4gdGhlIEVDRFNBIFRTUyBmbG93LlxuICAgKiBAcGFyYW0ge0N1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbn0gZXh0ZXJuYWxTaWduZXJNdURlbHRhU2hhcmVHZW5lcmF0b3IgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgTXUgYW5kIERlbHRhIHNoYXJlcyBpbiB0aGUgRUNEU0EgVFNTIGZsb3cuXG4gICAqIEBwYXJhbSB7Q3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9ufSBleHRlcm5hbFNpZ25lclNTaGFyZUdlbmVyYXRvciBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBTIHNoYXJlcyBpbiB0aGUgRUNEU0EgVFNTIGZsb3cuXG4gICAqL1xuICBzaWduRWNkc2FUc3NVc2luZ0V4dGVybmFsU2lnbmVyKFxuICAgIHBhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgICByZXF1ZXN0VHlwZTogUmVxdWVzdFR5cGUsXG4gICAgZXh0ZXJuYWxTaWduZXJQYWlsbGllck1vZHVsdXNHZXR0ZXI6IEN1c3RvbVBhaWxsaWVyTW9kdWx1c0dldHRlckZ1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyS1NoYXJlR2VuZXJhdG9yOiBDdXN0b21LU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJNdURlbHRhU2hhcmVHZW5lcmF0b3I6IEN1c3RvbU11RGVsdGFTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lclNTaGFyZUdlbmVyYXRvcjogQ3VzdG9tU1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBDb21taXRtZW50IChVc2VyIHRvIEJpdEdvKSBzaGFyZSBmcm9tIGFuIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGFuZCBwcml2YXRlIHVzZXIgc2lnbmluZyBtYXRlcmlhbFxuICAgKiBFRERTQSBvbmx5XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbXMgb2JqZWN0XG4gICAqIEBwYXJhbSB7VHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCB3aXRoIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gdXNlciBzaWduaW5nIG1hdGVyaWFsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgdXNlclRvQml0Z29Db21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvciwgZW5jcnlwdGVkU2lnbmVyU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkIH0+fSAtIENvbW1pdG1lbnQgU2hhcmUgYW5kIHRoZSBFbmNyeXB0ZWQgU2lnbmVyIFNoYXJlIHRvIEJpdEdvXG4gICAqL1xuICBjcmVhdGVDb21taXRtZW50U2hhcmVGcm9tVHhSZXF1ZXN0KHBhcmFtczogeyB0eFJlcXVlc3Q6IFR4UmVxdWVzdDsgcHJ2OiBzdHJpbmc7IHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZyB9KTogUHJvbWlzZTx7XG4gICAgdXNlclRvQml0Z29Db21taXRtZW50OiBDb21taXRtZW50U2hhcmVSZWNvcmQ7XG4gICAgZW5jcnlwdGVkU2lnbmVyU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZDtcbiAgfT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gUiAoVXNlciB0byBCaXRHbykgc2hhcmUgZnJvbSBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgcHJpdmF0ZSB1c2VyIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtcyBvYmplY3RcbiAgICogQHBhcmFtIHtUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdpdGggdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSB1c2VyIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMud2FsbGV0UGFzc3BocmFzZV0gLSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge0VuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkfSBbcGFyYW1zLmVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlXSAtIGVuY3J5cHRlZCB1c2VyIHRvIGJpdGdvIFIgc2hhcmUgZ2VuZXJhdGVkIGluIHRoZSBjb21taXRtZW50IHBoYXNlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHsgclNoYXJlOiBTaWduU2hhcmUgfT59IC0gUiBTaGFyZSB0byBCaXRHb1xuICAgKi9cbiAgY3JlYXRlUlNoYXJlRnJvbVR4UmVxdWVzdChwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlclRvQml0Z29SU2hhcmU6IEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkO1xuICB9KTogUHJvbWlzZTx7IHJTaGFyZTogU2lnblNoYXJlIH0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgRyAoVXNlciB0byBCaXRHbykgc2hhcmUgZnJvbSBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgcHJpdmF0ZSB1c2VyIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtcyBvYmplY3RcbiAgICogQHBhcmFtIHtUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdpdGggdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5wcnYgLSB1c2VyIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICogQHBhcmFtIHtTaWduYXR1cmVTaGFyZVJlY29yZH0gcGFyYW1zLmJpdGdvVG9Vc2VyUlNoYXJlIC0gQml0R28gdG8gVXNlciBSIFNoYXJlXG4gICAqIEBwYXJhbSB7U2lnblNoYXJlfSBwYXJhbXMudXNlclRvQml0Z29SU2hhcmUgLSBVc2VyIHRvIEJpdEdvIFIgU2hhcmVcbiAgICogQHBhcmFtIHtDb21taXRtZW50U2hhcmVSZWNvcmR9IHBhcmFtcy5iaXRnb1RvVXNlckNvbW1pdG1lbnQgLSBCaXRHbyB0byBVc2VyIENvbW1pdG1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8R1NoYXJlPn0gLSBHU2hhcmUgZnJvbSBVc2VyIHRvIEJpdEdvXG4gICAqL1xuICBjcmVhdGVHU2hhcmVGcm9tVHhSZXF1ZXN0KHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIGJpdGdvVG9Vc2VyUlNoYXJlOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICB1c2VyVG9CaXRnb1JTaGFyZTogU2lnblNoYXJlO1xuICAgIGJpdGdvVG9Vc2VyQ29tbWl0bWVudDogQ29tbWl0bWVudFNoYXJlUmVjb3JkO1xuICB9KTogUHJvbWlzZTxHU2hhcmU+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgdHggcmVxdWVzdCBmcm9tIHBhcmFtcyBhbmQgdmVyaWZ5IGl0XG4gICAqXG4gICAqIEBwYXJhbSB7UHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zfSBwYXJhbXMgLSBwYXJhbWV0ZXJzIHRvIGJ1aWxkIHRoZSB0eFxuICAgKiBAcGFyYW0ge1R4UmVxdWVzdFZlcnNpb259IGFwaVZlcnNpb24gbGl0ZSBvciBmdWxsXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gcHJldmlldyBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBpcyB0byBwcmV2aWV3IGEgdHggcmVxdWVzdCwgd2hpY2ggd2lsbCBub3QgaW5pdGlhdGUgcG9saWN5IGNoZWNrcyBvciBwZW5kaW5nIGFwcHJvdmFsc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSAtIGEgYnVpbHQgdHggcmVxdWVzdFxuICAgKi9cbiAgYXN5bmMgcHJlYnVpbGRUeFdpdGhJbnRlbnQoXG4gICAgcGFyYW1zOiBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gICAgYXBpVmVyc2lvbjogVHhSZXF1ZXN0VmVyc2lvbiA9ICdsaXRlJyxcbiAgICBwcmV2aWV3PzogYm9vbGVhblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IGludGVudE9wdGlvbnMgPSB0aGlzLnBvcHVsYXRlSW50ZW50KHRoaXMuYmFzZUNvaW4sIHBhcmFtcyk7XG5cbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHtcbiAgICAgIGludGVudDoge1xuICAgICAgICAuLi5pbnRlbnRPcHRpb25zLFxuICAgICAgfSxcbiAgICAgIGFwaVZlcnNpb246IGFwaVZlcnNpb24sXG4gICAgICBwcmV2aWV3LFxuICAgIH07XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKCcvd2FsbGV0LycgKyB0aGlzLndhbGxldC5pZCgpICsgJy90eHJlcXVlc3RzJywgMikpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKSkgYXMgVHhSZXF1ZXN0O1xuXG4gICAgcmV0dXJuIHVuc2lnbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHggcmVxdWVzdCBmcm9tIHBhcmFtcyBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIGFwaVZlcnNpb25cbiAgICogQHBhcmFtIHByZXZpZXdcbiAgICovXG4gIGFzeW5jIGNyZWF0ZVR4UmVxdWVzdFdpdGhJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyhcbiAgICBwYXJhbXM6IEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICAgIGFwaVZlcnNpb246IFR4UmVxdWVzdFZlcnNpb24gPSAnZnVsbCcsXG4gICAgcHJldmlldz86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBQb3B1bGF0ZWRJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyA9IHtcbiAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgIGludGVudFR5cGU6IHBhcmFtcy5pbnRlbnRUeXBlLFxuICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgIG1lbW86IHBhcmFtcy5tZW1vPy52YWx1ZSxcbiAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZVJhdyxcbiAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMubWVzc2FnZUVuY29kZWQgPz8gJycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVR4UmVxdWVzdEJhc2UoaW50ZW50T3B0aW9ucywgYXBpVmVyc2lvbiwgcHJldmlldyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgdHggcmVxdWVzdCBmcm9tIHBhcmFtcyBmb3IgdHlwZSBkYXRhIHNpZ25pbmdcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gYXBpVmVyc2lvblxuICAgKiBAcGFyYW0gcHJldmlld1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcoXG4gICAgcGFyYW1zOiBJbnRlbnRPcHRpb25zRm9yVHlwZWREYXRhLFxuICAgIGFwaVZlcnNpb246IFR4UmVxdWVzdFZlcnNpb24gPSAnZnVsbCcsXG4gICAgcHJldmlldz86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCBpbnRlbnRPcHRpb25zOiBQb3B1bGF0ZWRJbnRlbnRGb3JUeXBlZERhdGFTaWduaW5nID0ge1xuICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgaW50ZW50VHlwZTogcGFyYW1zLmludGVudFR5cGUsXG4gICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgbWVtbzogcGFyYW1zLm1lbW8/LnZhbHVlLFxuICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy50eXBlZERhdGFSYXcsXG4gICAgICBtZXNzYWdlRW5jb2RlZDogcGFyYW1zLnR5cGVkRGF0YUVuY29kZWQgPz8gJycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVR4UmVxdWVzdEJhc2UoaW50ZW50T3B0aW9ucywgYXBpVmVyc2lvbiwgcHJldmlldyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgQml0Z28gQVBJIHRvIGNyZWF0ZSB0eCByZXF1ZXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVUeFJlcXVlc3RCYXNlKFxuICAgIGludGVudE9wdGlvbnM6IFBvcHVsYXRlZEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcgfCBQb3B1bGF0ZWRJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyxcbiAgICBhcGlWZXJzaW9uOiBUeFJlcXVlc3RWZXJzaW9uLFxuICAgIHByZXZpZXc/OiBib29sZWFuXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB7XG4gICAgICBpbnRlbnQ6IHtcbiAgICAgICAgLi4uaW50ZW50T3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcHJldmlldyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vdHhyZXF1ZXN0c2AsIDIpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBkZWxldGUgc2lnbmF0dXJlIHNoYXJlcyBmb3IgYSB0eFJlcXVlc3QsIHRoZSBlbmRwb2ludCBkZWxldGUgdGhlIHNpZ25hdHVyZXMgYW5kIHJldHVybiB0aGVtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCB0eCBpZCByZWZlcmVuY2UgdG8gZGVsZXRlIHNpZ25hdHVyZSBzaGFyZXNcbiAgICogQHJldHVybnMge1NpZ25hdHVyZVNoYXJlUmVjb3JkW119XG4gICAqL1xuICBhc3luYyBkZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8U2lnbmF0dXJlU2hhcmVSZWNvcmRbXT4ge1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAuZGVsKHRoaXMuYml0Z28udXJsKGAvd2FsbGV0LyR7dGhpcy53YWxsZXQuaWQoKX0vdHhyZXF1ZXN0cy8ke3R4UmVxdWVzdElkfS9zaWduYXR1cmVzaGFyZXNgLCAyKSlcbiAgICAgIC5zZW5kKClcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBzZW5kIHByb2NlZHVyZSBvbmNlIEJpdGdvIGhhcyB0aGUgVXNlciBUbyBCaXRnbyBHU2hhcmVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR4UmVxdWVzdElkIC0gdGhlIHR4UmVxdWVzdCBJZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgYXN5bmMgc2VuZFR4UmVxdWVzdCh0eFJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy93YWxsZXQvJyArIHRoaXMud2FsbGV0LmlkKCkgKyAnL3R4L3NlbmQnKSlcbiAgICAgIC5zZW5kKHsgdHhSZXF1ZXN0SWQgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgc2lnbmF0dXJlIHNoYXJlcywgZ2V0IHRoZSB0eCByZXF1ZXN0IHdpdGhvdXQgdGhlbSBmcm9tIHRoZSBkYiBhbmQgc2lnbiBpdCB0byBmaW5hbGx5IHNlbmQgaXQuXG4gICAqXG4gICAqIE5vdGUgOiBUaGlzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gcmVhY2ggbGF0ZXN0IG5ldHdvcmsgY29uZGl0aW9ucyByZXF1aXJlZCBvbiBwZW5kaW5nIGFwcHJvdmFsIGZsb3cuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRoZSB0eFJlcXVlc3QgSWQgdG8gbWFrZSB0aGUgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBkZWNyeXB0ZWRQcnYgLSBkZWNyeXB0ZWQgcHJ2IHRvIHNpZ24gdGhlIHR4IHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmVxdWVzdFRyYWNlcn0gcmVxSWQgaWQgdHJhY2VyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgcmVjcmVhdGVUeFJlcXVlc3QodHhSZXF1ZXN0SWQ6IHN0cmluZywgZGVjcnlwdGVkUHJ2OiBzdHJpbmcsIHJlcUlkOiBJUmVxdWVzdFRyYWNlcik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVTaWduYXR1cmVTaGFyZXModHhSZXF1ZXN0SWQpO1xuICAgIC8vIGFmdGVyIGRlbGV0ZSBzaWduYXR1cmVzIHNoYXJlcyBnZXQgdGhlIHR4IHdpdGhvdXQgdGhlbVxuICAgIGNvbnN0IHR4UmVxdWVzdCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3RJZCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnblR4UmVxdWVzdCh7IHR4UmVxdWVzdCwgcHJ2OiBkZWNyeXB0ZWRQcnYsIHJlcUlkIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhdGVzdCBUeCBSZXF1ZXN0IGJ5IGlkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRoZSB0eFJlcXVlc3QgSWRcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn1cbiAgICovXG4gIGFzeW5jIGdldFR4UmVxdWVzdCh0eFJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICByZXR1cm4gZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHR4UmVxdWVzdElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgdGhpcmQgcGFydHkgYmFja3VwIHByb3ZpZGVyIGlzIHZhbGlkL3N1cHBvcnRlZFxuICAgKiBAcGFyYW0gYmFja3VwUHJvdmlkZXIgLSB0aGUgYmFja3VwIHByb3ZpZGVyIGNsaWVudCBzZWxlY3RlZFxuICAgKi9cbiAgaXNWYWxpZFRoaXJkUGFydHlCYWNrdXBQcm92aWRlcihcbiAgICBiYWNrdXBQcm92aWRlcjogQmFja3VwUHJvdmlkZXIgfCBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogYmFja3VwUHJvdmlkZXIgaXMgQmFja3VwUHJvdmlkZXIge1xuICAgIC8vIEFzIG9mIG5vdywgQml0R28gaXMgdGhlIG9ubHkgc3VwcG9ydGVkIEtSUyBwcm92aWRlciBmb3IgVFNTXG4gICAgcmV0dXJuICEhKGJhY2t1cFByb3ZpZGVyICYmIGJhY2t1cFByb3ZpZGVyID09PSAnQml0R29UcnVzdEFzS3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogSXQgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgQml0R28gR1BHIHB1YmxpYyBrZXkgZm9yIGtleSBjcmVhdGlvbiBiYXNlZCBvbiBhXG4gICAqIGNvbWJpbmF0aW9uIG9mIGNvaW4gYW5kIHRoZSBmZWF0dXJlIGZsYWdzIG9uIHRoZSB1c2VyIGFuZCB0aGVpciBlbnRlcnByaXNlIGlmIHNldC5cbiAgICogQHBhcmFtIGVudGVycHJpc2VJZCAtIGVudGVycHJpc2UgdW5kZXIgd2hpY2ggdXNlciB3YW50cyB0byBjcmVhdGUgdGhlIHdhbGxldFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhlbnRlcnByaXNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8S2V5PiB7XG4gICAgY29uc3QgcmVzcG9uc2U6IEJpdGdvR1BHUHVibGljS2V5ID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLmdldCh0aGlzLmJhc2VDb2luLnVybCgnL3Rzcy9wdWJrZXknKSlcbiAgICAgIC5xdWVyeSh7IGVudGVycHJpc2VJZCB9KVxuICAgICAgLnJlc3VsdCgpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljS2V5U3RyID0gcmVzcG9uc2UucHVibGljS2V5IGFzIHN0cmluZztcbiAgICByZXR1cm4gcmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljS2V5U3RyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3VwcG9ydGVkIFR4UmVxdWVzdCB2ZXJzaW9ucyBmb3IgdGhpcyB3YWxsZXRcbiAgICovXG4gIHB1YmxpYyBzdXBwb3J0ZWRUeFJlcXVlc3RWZXJzaW9ucygpOiBUeFJlcXVlc3RWZXJzaW9uW10ge1xuICAgIGNvbnN0IHdhbGxldFR5cGUgPSB0aGlzLl93YWxsZXQ/LnR5cGUoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRXYWxsZXRUeXBlcyA9IFsnY3VzdG9kaWFsJywgJ2NvbGQnLCAnaG90J107XG4gICAgaWYgKCF3YWxsZXRUeXBlIHx8IHRoaXMuX3dhbGxldD8ubXVsdGlzaWdUeXBlKCkgIT09ICd0c3MnIHx8ICFzdXBwb3J0ZWRXYWxsZXRUeXBlcy5pbmNsdWRlcyh3YWxsZXRUeXBlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FsbGV0Py5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSA9PT0gJ2VjZHNhJykge1xuICAgICAgcmV0dXJuIFsnZnVsbCddO1xuICAgIH0gZWxzZSBpZiAod2FsbGV0VHlwZSA9PT0gJ2N1c3RvZGlhbCcgfHwgd2FsbGV0VHlwZSA9PT0gJ2NvbGQnKSB7XG4gICAgICByZXR1cm4gWydmdWxsJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLl93YWxsZXQ/LmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnICYmIHdhbGxldFR5cGUgPT09ICdob3QnKSB7XG4gICAgICByZXR1cm4gWydsaXRlJywgJ2Z1bGwnXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHhSZXF1ZXN0IGlzIHVzaW5nIGFwaVZlcnNpb24gPT0gZnVsbCBhbmQgaXMgcGVuZGluZyBhcHByb3ZhbFxuICAgKiBAcGFyYW0gdHhSZXF1ZXN0XG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIGlzUGVuZGluZ0FwcHJvdmFsVHhSZXF1ZXN0RnVsbCh0eFJlcXVlc3Q6IFR4UmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiwgc3RhdGUgfSA9IHR4UmVxdWVzdDtcbiAgICByZXR1cm4gYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnICYmICdwZW5kaW5nQXBwcm92YWwnID09PSBzdGF0ZTtcbiAgfVxufVxuIl19
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZVRTU1V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2JpdGdvL3V0aWxzL3Rzcy9iYXNlVFNTVXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5REEsZ0RBZUM7QUF2RUQsaURBQW1DO0FBQ25DLHFDQUEwRDtBQUcxRCw2Q0FBaUY7QUFDakYsbUNBQXlDO0FBRXpDLDBDQUF1QztBQUN2QywwQ0FBNEI7QUFxQzVCLGtDQUF3QztBQUN4Qyx5REFBK0Y7QUFDL0Ysa0RBQW9EO0FBQ3BELG9EQUE0QjtBQUM1QixrREFBc0Q7QUFFdEQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWUsRUFBRSxTQUFpQjtJQUNuRSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvRSxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQXlCLENBQUM7SUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTztRQUNMLFVBQVUsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM5QixHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsU0FBUyxF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LENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBQ0Qsd0RBQXdEO1FBQ3hELElBQ0Usa0JBQWtCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLGtCQUFrQixDQUFDLEdBQUcsb0JBQW9CLElBQUksS0FBSyxFQUFFLENBQUM7WUFDL0Ysa0JBQWtCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxFQUNsRSxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzNELENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE5cUJELCtCQThxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbmNyeXB0aW9uVmVyc2lvbiwgSVJlcXVlc3RUcmFjZXIgfSBmcm9tICcuLi8uLi8uLi9hcGknO1xuaW1wb3J0ICogYXMgb3BlbnBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IEtleSwgcmVhZEtleSwgU2VyaWFsaXplZEtleVBhaXIgfSBmcm9tICdvcGVucGdwJztcbmltcG9ydCB7IElCYXNlQ29pbiwgS2V5Y2hhaW5zVHJpcGxldCwgVHJhbnNhY3Rpb25QYXJhbXMgfSBmcm9tICcuLi8uLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi8uLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgS2V5Y2hhaW4sIEtleUluZGljZXMsIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBnZXRUeFJlcXVlc3QgfSBmcm9tICcuLi8uLi90c3MnO1xuaW1wb3J0IHsgSVdhbGxldCB9IGZyb20gJy4uLy4uL3dhbGxldCc7XG5pbXBvcnQgeyBNcGNVdGlscyB9IGZyb20gJy4uL21wY1V0aWxzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEJpdGdvR1BHUHVibGljS2V5LFxuICBCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZSxcbiAgQ29tbWl0bWVudFNoYXJlUmVjb3JkLFxuICBDcmVhdGVCaXRHb0tleWNoYWluUGFyYW1zQmFzZSxcbiAgQ3JlYXRlS2V5Y2hhaW5QYXJhbXNCYXNlLFxuICBDdXN0b21Db21taXRtZW50R2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21HU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgQ3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21QYWlsbGllck1vZHVsdXNHZXR0ZXJGdW5jdGlvbixcbiAgQ3VzdG9tUlNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEVuY3J5cHRlZFNpZ25lclNoYXJlUmVjb3JkLFxuICBJbnRlbnRPcHRpb25zRm9yTWVzc2FnZSxcbiAgSW50ZW50T3B0aW9uc0ZvclR5cGVkRGF0YSxcbiAgSVRzc1V0aWxzLFxuICBQb3B1bGF0ZWRJbnRlbnQsXG4gIFBvcHVsYXRlZEludGVudEZvck1lc3NhZ2VTaWduaW5nLFxuICBQb3B1bGF0ZWRJbnRlbnRGb3JUeXBlZERhdGFTaWduaW5nLFxuICBQcmVidWlsZFRyYW5zYWN0aW9uV2l0aEludGVudE9wdGlvbnMsXG4gIFJlcXVlc3RUeXBlLFxuICBTaWduYXR1cmVTaGFyZVJlY29yZCxcbiAgVFNTUGFyYW1zLFxuICBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydixcbiAgVHhSZXF1ZXN0LFxuICBUeFJlcXVlc3RWZXJzaW9uLFxufSBmcm9tICcuL2Jhc2VUeXBlcyc7XG5pbXBvcnQgeyBHU2hhcmUsIFNpZ25TaGFyZSB9IGZyb20gJy4uLy4uLy4uL2FjY291bnQtbGliL21wYy90c3MnO1xuaW1wb3J0IHsgUmVxdWVzdFRyYWNlciB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZywgZ2V0Qml0Z29NcGNHcGdQdWJLZXkgfSBmcm9tICcuLi8uLi90c3MvYml0Z29QdWJLZXlzJztcbmltcG9ydCB7IGdldEJpdGdvR3BnUHViS2V5IH0gZnJvbSAnLi4vb3BlbmdwZ1V0aWxzJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IE1lc3NhZ2VTdGFuZGFyZFR5cGUgfSBmcm9tICcuLi9tZXNzYWdlVHlwZXMnO1xuXG4vKipcbiAqIERlcml2ZXMgdHhQYXJhbXMgZnJvbSB0aGUgcGVyc2lzdGVkIGludGVudCBvbiBhIFR4UmVxdWVzdCBmb3IgRWREU0EgTVBDdjIgc2lnbmluZyBwYXRoc1xuICogd2hlcmUgbm8gU0RLLWxvY2FsIGJ1aWxkUGFyYW1zIGlzIGF2YWlsYWJsZSAoUEEgcGF0aCBhbmQgVUkgcmUtc2lnbiBwYXRoKS5cbiAqIE5hdGl2ZSBjb2luIHRyYW5zZmVycyAod2hlcmUgc3ltYm9sIGVxdWFscyB0aGUgY2hhaW4gbmFtZSkgYXJlIGV4Y2x1ZGVkIGZyb20gdG9rZW5OYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHhQYXJhbXNGcm9tSW50ZW50KGludGVudDogdW5rbm93biwgY2hhaW5OYW1lOiBzdHJpbmcpOiBUcmFuc2FjdGlvblBhcmFtcyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgaW50ZW50ICE9PSAnb2JqZWN0JyB8fCBpbnRlbnQgPT09IG51bGwgfHwgISgncmVjaXBpZW50cycgaW4gaW50ZW50KSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgeyByZWNpcGllbnRzIH0gPSBpbnRlbnQgYXMgUG9wdWxhdGVkSW50ZW50O1xuICBpZiAoIXJlY2lwaWVudHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZWNpcGllbnRzOiByZWNpcGllbnRzLm1hcCgocikgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHIuYWRkcmVzcy5hZGRyZXNzLFxuICAgICAgYW1vdW50OiBTdHJpbmcoci5hbW91bnQudmFsdWUpLFxuICAgICAgLi4uKHIuYW1vdW50LnN5bWJvbCAmJiByLmFtb3VudC5zeW1ib2wgIT09IGNoYWluTmFtZSAmJiB7IHRva2VuTmFtZTogci5hbW91bnQuc3ltYm9sIH0pLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCYXNlVHNzVXRpbCBjbGFzcyB3aGljaCBkaWZmZXJlbnQgc2lnbmF0dXJlIHNjaGVtZXMgaGF2ZSB0byBleHRlbmRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZVRzc1V0aWxzPEtleVNoYXJlPiBleHRlbmRzIE1wY1V0aWxzIGltcGxlbWVudHMgSVRzc1V0aWxzPEtleVNoYXJlPiB7XG4gIHByaXZhdGUgX3dhbGxldD86IElXYWxsZXQ7XG4gIHByb3RlY3RlZCBiaXRnb1B1YmxpY0dwZ0tleTogb3BlbnBncC5LZXk7XG4gIHByb3RlY3RlZCBiaXRnb01QQ3YyUHVibGljR3BnS2V5OiBvcGVucGdwLktleSB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGJpdGdvRWRkc2FNcGN2MlB1YmxpY0dwZ0tleTogb3BlbnBncC5LZXkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgYmFzZUNvaW46IElCYXNlQ29pbiwgd2FsbGV0PzogSVdhbGxldCkge1xuICAgIHN1cGVyKGJpdGdvLCBiYXNlQ29pbik7XG4gICAgdGhpcy5fd2FsbGV0ID0gd2FsbGV0O1xuICB9XG5cbiAgZ2V0IHdhbGxldCgpOiBJV2FsbGV0IHtcbiAgICBpZiAoXy5pc05pbCh0aGlzLl93YWxsZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhbGxldCBub3QgZGVmaW5lZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2FsbGV0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNldEJpdGdvR3BnUHViS2V5KGJpdGdvKSB7XG4gICAgY29uc3QgeyBtcGNWMSwgbXBjVjIsIGVkZHNhTXBjVjIgfSA9IGF3YWl0IGdldEJpdGdvR3BnUHViS2V5KGJpdGdvKTtcbiAgICAvLyBEbyBub3QgdW5zZXQgdGhlIE1QQ3YxIGtleSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBpcyB0byBhdm9pZCB1bnNldHRpbmcgaWYgZXh0cmEgY29uc3RhbnRzIGFwaSBjYWxscyBmYWlsLlxuICAgIGlmIChtcGNWMSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJpdGdvUHVibGljR3BnS2V5ID0gbXBjVjE7XG4gICAgfVxuICAgIC8vIERvIG5vdCB1bnNldCB0aGUgTVBDdjIga2V5IGlmIGl0IGlzIGFscmVhZHkgc2V0XG4gICAgaWYgKG1wY1YyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleSA9IG1wY1YyO1xuICAgIH1cbiAgICAvLyBEbyBub3QgdW5zZXQgdGhlIEVkRFNBIE1QQ3YyIGtleSBpZiBpdCBpcyBhbHJlYWR5IHNldFxuICAgIGlmIChlZGRzYU1wY1YyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5ID0gZWRkc2FNcGNWMjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGlja0JpdGdvUHViR3BnS2V5Rm9yU2lnbmluZyhcbiAgICBpc01wY3YyOiBib29sZWFuLFxuICAgIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIsXG4gICAgZW50ZXJwcmlzZUlkPzogc3RyaW5nLFxuICAgIGlzRWRkc2FNcGN2Mj86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxvcGVucGdwLktleT4ge1xuICAgIGxldCBiaXRnb0dwZ1B1YktleTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYml0Z29LZXlDaGFpbiA9IGF3YWl0IHRoaXMuYmFzZUNvaW4ua2V5Y2hhaW5zKCkuZ2V0KHsgaWQ6IHRoaXMud2FsbGV0LmtleUlkcygpW0tleUluZGljZXMuQklUR09dLCByZXFJZCB9KTtcbiAgICAgIGlmICghYml0Z29LZXlDaGFpbiB8fCAhYml0Z29LZXlDaGFpbi5oc21UeXBlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRnbyBHUEcgUHViIEtleSBUeXBlLicpO1xuICAgICAgfVxuICAgICAgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCBvcGVucGdwLnJlYWRLZXkoe1xuICAgICAgICBhcm1vcmVkS2V5OiBnZXRCaXRnb01wY0dwZ1B1YktleShcbiAgICAgICAgICB0aGlzLmJpdGdvLmdldEVudigpLFxuICAgICAgICAgIGJpdGdvS2V5Q2hhaW4uaHNtVHlwZSA9PT0gJ25pdHJvJyA/ICduaXRybycgOiAnb25wcmVtJyxcbiAgICAgICAgICBpc0VkZHNhTXBjdjIgPyAnZWRkc2FNcGN2MicgOiBpc01wY3YyID8gJ21wY3YyJyA6ICdtcGN2MSdcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICghZW52UmVxdWlyZXNCaXRnb1B1YkdwZ0tleUNvbmZpZyh0aGlzLmJpdGdvLmdldEVudigpKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFVuYWJsZSB0byBnZXQgQml0R28gR1BHIGtleSBiYXNlZCBvbiBrZXkgZGF0YSB3aXRoIGVycm9yOiAke2V9LiBGZXRjaGluZyBCaXRHbyBHUEcga2V5IGJhc2VkIG9uIGZlYXR1cmUgZmxhZ3MuYFxuICAgICAgICApO1xuICAgICAgICAvLyBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBrZXkgYmFzZWQgb24gZmVhdHVyZSBmbGFncywgaWYgdGhhdCBmYWlscywgZmFsbGJhY2sgdG8gdGhlIGRlZmF1bHQga2V5IGZyb20gY29uc3RhbnRzIGFwaS5cbiAgICAgICAgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCB0aGlzLmdldEJpdGdvR3BnUHVia2V5QmFzZWRPbkZlYXR1cmVGbGFncyhlbnRlcnByaXNlSWQsIGlzTXBjdjIsIHJlcUlkKVxuICAgICAgICAgIC50aGVuKGFzeW5jICh7IG1wY3YyUHVibGljS2V5LCBlZGRzYU1wY3YyUHVibGljS2V5IH0pID0+IHtcbiAgICAgICAgICAgIGlmIChpc0VkZHNhTXBjdjIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGVkZHNhTXBjdjJQdWJsaWNLZXkgPz8gKGF3YWl0IHRoaXMuZ2V0Qml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgbXBjdjJQdWJsaWNLZXkgPz8gKGlzTXBjdjIgPyBhd2FpdCB0aGlzLmdldEJpdGdvTXBjdjJQdWJsaWNHcGdLZXkoKSA6IGF3YWl0IHRoaXMuZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRWRkc2FNcGN2Mikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRCaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc01wY3YyID8gYXdhaXQgdGhpcy5nZXRCaXRnb01wY3YyUHVibGljR3BnS2V5KCkgOiBhd2FpdCB0aGlzLmdldEJpdGdvUHVibGljR3BnS2V5KCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEVudmlyb25tZW50IFwiJHt0aGlzLmJpdGdvLmdldEVudigpfVwiIHJlcXVpcmVzIGEgQml0R28gR1BHIFB1YiBLZXkgQ29uZmlnIGluIEJpdEdvSlMgZm9yIFRTUy4gRXJyb3IgdGhyb3duIHdoaWxlIGdldHRpbmcgdGhlIGtleSBmcm9tIGNvbmZpZzogJHtlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJpdGdvR3BnUHViS2V5O1xuICB9XG5cbiAgYXN5bmMgZ2V0Qml0Z29QdWJsaWNHcGdLZXkoKTogUHJvbWlzZTxvcGVucGdwLktleT4ge1xuICAgIGlmICghdGhpcy5iaXRnb1B1YmxpY0dwZ0tleSkge1xuICAgICAgLy8gcmV0cnkgZ2V0dGluZyBiaXRnbydzIGdwZyBrZXlcbiAgICAgIGF3YWl0IHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgICBpZiAoIXRoaXMuYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBCaXRnbydzIGdwZyBrZXlcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29QdWJsaWNHcGdLZXk7XG4gIH1cblxuICBhc3luYyBnZXRCaXRnb01wY3YyUHVibGljR3BnS2V5KCk6IFByb21pc2U8b3BlbnBncC5LZXk+IHtcbiAgICBpZiAoIXRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleSkge1xuICAgICAgLy8gcmV0cnkgZ2V0dGluZyBiaXRnbydzIGdwZyBrZXlcbiAgICAgIGF3YWl0IHRoaXMuc2V0Qml0Z29HcGdQdWJLZXkodGhpcy5iaXRnbyk7XG4gICAgICBpZiAoIXRoaXMuYml0Z29NUEN2MlB1YmxpY0dwZ0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IEJpdGdvJ3MgZ3BnIGtleVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iaXRnb01QQ3YyUHVibGljR3BnS2V5O1xuICB9XG5cbiAgYXN5bmMgZ2V0Qml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5KCk6IFByb21pc2U8b3BlbnBncC5LZXk+IHtcbiAgICBpZiAoIXRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5KSB7XG4gICAgICAvLyByZXRyeSBnZXR0aW5nIGJpdGdvJ3MgZ3BnIGtleVxuICAgICAgYXdhaXQgdGhpcy5zZXRCaXRnb0dwZ1B1YktleSh0aGlzLmJpdGdvKTtcbiAgICAgIGlmICghdGhpcy5iaXRnb0VkZHNhTXBjdjJQdWJsaWNHcGdLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBCaXRnbydzIEVkRFNBIE1QQ3YyIGdwZyBrZXlcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYml0Z29FZGRzYU1wY3YyUHVibGljR3BnS2V5O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQml0Z29IZWxkQmFja3VwS2V5U2hhcmUoXG4gICAgdXNlckdwZ0tleTogU2VyaWFsaXplZEtleVBhaXI8c3RyaW5nPixcbiAgICBlbnRlcnByaXNlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIGNvbnN0IGtleVJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iYXNlQ29pbi51cmwoJy9rcnMvYmFja3Vwa2V5cycpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICBlbnRlcnByaXNlLFxuICAgICAgICB1c2VyR1BHUHVibGljS2V5OiB1c2VyR3BnS2V5LnB1YmxpY0tleSxcbiAgICAgIH0pXG4gICAgICAucmVzdWx0KCk7XG4gICAgaWYgKCFrZXlSZXNwb25zZSB8fCAha2V5UmVzcG9uc2Uua2V5U2hhcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgYmFja3VwIHNoYXJlcyBmcm9tIEJpdEdvLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGtleVJlc3BvbnNlLmlkLFxuICAgICAga2V5U2hhcmVzOiBrZXlSZXNwb25zZS5rZXlTaGFyZXMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5hbGl6ZUJpdGdvSGVsZEJhY2t1cEtleVNoYXJlKFxuICAgIGtleUlkOiBzdHJpbmcsXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICB1c2VyS2V5U2hhcmU6IEtleVNoYXJlLFxuICAgIGJpdGdvS2V5Y2hhaW46IEtleWNoYWluLFxuICAgIHVzZXJHcGdLZXk6IFNlcmlhbGl6ZWRLZXlQYWlyPHN0cmluZz4sXG4gICAgYmFja3VwR3BnS2V5OiBLZXlcbiAgKTogUHJvbWlzZTxCaXRnb0hlbGRCYWNrdXBLZXlTaGFyZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGNyZWF0ZVVzZXJLZXljaGFpbihwYXJhbXM6IENyZWF0ZUtleWNoYWluUGFyYW1zQmFzZSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBjcmVhdGVCYWNrdXBLZXljaGFpbihwYXJhbXM6IENyZWF0ZUtleWNoYWluUGFyYW1zQmFzZSk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBjcmVhdGVCaXRnb0tleWNoYWluKHBhcmFtczogQ3JlYXRlQml0R29LZXljaGFpblBhcmFtc0Jhc2UpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgY3JlYXRlS2V5Y2hhaW5zKHBhcmFtczoge1xuICAgIHBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbnRlcnByaXNlPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1RoaXJkUGFydHlCYWNrdXA/OiBib29sZWFuO1xuICAgIHdlYmF1dGhuSW5mbz86IFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm87XG4gICAgZW5jcnlwdGlvblZlcnNpb24/OiBFbmNyeXB0aW9uVmVyc2lvbjtcbiAgfSk6IFByb21pc2U8S2V5Y2hhaW5zVHJpcGxldD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHNpZ25UeFJlcXVlc3QocGFyYW1zOiBUc3NTaWduVHhSZXF1ZXN0UGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc2lnblR4UmVxdWVzdEZvck1lc3NhZ2UocGFyYW1zOiBUU1NQYXJhbXNGb3JNZXNzYWdlKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiB1c2luZyBUU1MgZm9yIEVkRFNBIGFuZCB0aHJvdWdoIHV0aWxpemF0aW9uIG9mIGN1c3RvbSBzaGFyZSBnZW5lcmF0b3JzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgVHhSZXF1ZXN0fSB0eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdpdGggdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtDdXN0b21SU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb259IGV4dGVybmFsU2lnbmVyUlNoYXJlR2VuZXJhdG9yIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIFIgc2hhcmVzIGluIHRoZSBFZERTQSBUU1MgZmxvd1xuICAgKiBAcGFyYW0ge0N1c3RvbUdTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbn0gZXh0ZXJuYWxTaWduZXJHU2hhcmVHZW5lcmF0b3IgYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgRyBzaGFyZXMgaW4gdGhlIEVkRFNBIFRTUyBmbG93XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFR4UmVxdWVzdD59IC0gYSBzaWduZWQgdHggcmVxdWVzdFxuICAgKi9cbiAgc2lnbkVkZHNhVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICB0eFJlcXVlc3Q6IHN0cmluZyB8IFR4UmVxdWVzdCxcbiAgICBleHRlcm5hbFNpZ25lckNvbW1pdG1lbnRHZW5lcmF0b3I6IEN1c3RvbUNvbW1pdG1lbnRHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJSU2hhcmVHZW5lcmF0b3I6IEN1c3RvbVJTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lckdTaGFyZUdlbmVyYXRvcjogQ3VzdG9tR1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIGEgdHJhbnNhY3Rpb24gdXNpbmcgVFNTIGZvciBFQ0RTQSBhbmQgdGhyb3VnaCB1dGlsaXphdGlvbiBvZiBjdXN0b20gc2hhcmUgZ2VuZXJhdG9yc1xuICAgKlxuICAgKiBAcGFyYW0ge3BhcmFtczogVFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZX0gcGFyYW1zIC0gcGFyYW1zIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgcGFyYW1ldGVycyB0byBzaWduIGEgdHJhbnNhY3Rpb24gb3IgYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1JlcXVlc3RUeXBlfSByZXF1ZXN0VHlwZSAtIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IHRvIHNpZ24gKHRyYW5zYWN0aW9uIG9yIG1lc3NhZ2UpLlxuICAgKiBAcGFyYW0ge0N1c3RvbVBhaWxsaWVyTW9kdWx1c0dldHRlckZ1bmN0aW9ufSBleHRlcm5hbFNpZ25lclBhaWxsaWVyTW9kdWx1c0dldHRlciBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBQYWlsbGllciBNb2R1bHVzIHNoYXJlcyBpbiB0aGUgRUNEU0EgVFNTIGZsb3cuXG4gICAqIEBwYXJhbSB7Q3VzdG9tS1NoYXJlR2VuZXJhdGluZ0Z1bmN0aW9ufSBleHRlcm5hbFNpZ25lcktTaGFyZUdlbmVyYXRvciBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBLIHNoYXJlcyBpbiB0aGUgRUNEU0EgVFNTIGZsb3cuXG4gICAqIEBwYXJhbSB7Q3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9ufSBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvciBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBNdSBhbmQgRGVsdGEgc2hhcmVzIGluIHRoZSBFQ0RTQSBUU1MgZmxvdy5cbiAgICogQHBhcmFtIHtDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb259IGV4dGVybmFsU2lnbmVyU1NoYXJlR2VuZXJhdG9yIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIFMgc2hhcmVzIGluIHRoZSBFQ0RTQSBUU1MgZmxvdy5cbiAgICovXG4gIHNpZ25FY2RzYVRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSxcbiAgICBleHRlcm5hbFNpZ25lclBhaWxsaWVyTW9kdWx1c0dldHRlcjogQ3VzdG9tUGFpbGxpZXJNb2R1bHVzR2V0dGVyRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJLU2hhcmVHZW5lcmF0b3I6IEN1c3RvbUtTaGFyZUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck11RGVsdGFTaGFyZUdlbmVyYXRvcjogQ3VzdG9tTXVEZWx0YVNoYXJlR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyU1NoYXJlR2VuZXJhdG9yOiBDdXN0b21TU2hhcmVHZW5lcmF0aW5nRnVuY3Rpb25cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnMgYSB0cmFuc2FjdGlvbiB1c2luZyBUU1MgTVBDdjIgZm9yIEVDRFNBIGFuZCB0aHJvdWdoIHV0aWxpemF0aW9uIG9mIGN1c3RvbSBzaGFyZSBnZW5lcmF0b3JzXG4gICAqXG4gICAqIEBwYXJhbSB7VFNTUGFyYW1zIHwgVFNTUGFyYW1zRm9yTWVzc2FnZX0gcGFyYW1zIC0gcGFyYW1zIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgcGFyYW1ldGVycyB0byBzaWduIGEgdHJhbnNhY3Rpb24gb3IgYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge0N1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbn0gZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3IgLSBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBNUEN2MiBSb3VuZCAxIHNoYXJlcyBpbiB0aGUgRUNEU0EgVFNTIE1QQ3YyIGZsb3cuXG4gICAqIEBwYXJhbSB7Q3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9ufSBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvciAtIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIE1QQ3YyIFJvdW5kIDIgc2hhcmVzIGluIHRoZSBFQ0RTQSBUU1MgTVBDdjIgZmxvdy5cbiAgICogQHBhcmFtIHtDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb259IGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yIC0gYSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgTVBDdjIgUm91bmQgMyBzaGFyZXMgaW4gdGhlIEVDRFNBIFRTUyBNUEN2MiBmbG93LlxuICAgKiBAcGFyYW0ge1JlcXVlc3RUeXBlfSByZXF1ZXN0VHlwZSAtIHRoZSB0eXBlIG9mIHRoZSByZXF1ZXN0IHRvIHNpZ24gKHRyYW5zYWN0aW9uIG9yIG1lc3NhZ2UpLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSAtIGEgc2lnbmVkIHR4IHJlcXVlc3RcbiAgICovXG4gIHNpZ25FY2RzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRpbmdGdW5jdGlvbixcbiAgICBleHRlcm5hbFNpZ25lck1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdG9yOiBDdXN0b21NUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU/OiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHNpZ25FZGRzYU1QQ3YyVHNzVXNpbmdFeHRlcm5hbFNpZ25lcihcbiAgICBwYXJhbXM6IFRTU1BhcmFtcyB8IFRTU1BhcmFtc0Zvck1lc3NhZ2UsXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMkdlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRvcjogQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0aW5nRnVuY3Rpb24sXG4gICAgcmVxdWVzdFR5cGU/OiBSZXF1ZXN0VHlwZVxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQ29tbWl0bWVudCAoVXNlciB0byBCaXRHbykgc2hhcmUgZnJvbSBhbiB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgcHJpdmF0ZSB1c2VyIHNpZ25pbmcgbWF0ZXJpYWxcbiAgICogRUREU0Egb25seVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1zIG9iamVjdFxuICAgKiBAcGFyYW0ge1R4UmVxdWVzdH0gcGFyYW1zLnR4UmVxdWVzdCAtIHRyYW5zYWN0aW9uIHJlcXVlc3Qgd2l0aCB1bnNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIHVzZXIgc2lnbmluZyBtYXRlcmlhbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHVzZXJUb0JpdGdvQ29tbWl0bWVudDogQ29tbWl0bWVudFNoYXJlUmVjb3IsIGVuY3J5cHRlZFNpZ25lclNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZCB9Pn0gLSBDb21taXRtZW50IFNoYXJlIGFuZCB0aGUgRW5jcnlwdGVkIFNpZ25lciBTaGFyZSB0byBCaXRHb1xuICAgKi9cbiAgY3JlYXRlQ29tbWl0bWVudFNoYXJlRnJvbVR4UmVxdWVzdChwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgYml0Z29HcGdQdWJLZXk6IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHVzZXJUb0JpdGdvQ29tbWl0bWVudDogQ29tbWl0bWVudFNoYXJlUmVjb3JkO1xuICAgIGVuY3J5cHRlZFNpZ25lclNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZTogRW5jcnlwdGVkU2lnbmVyU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIFIgKFVzZXIgdG8gQml0R28pIHNoYXJlIGZyb20gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gYW5kIHByaXZhdGUgdXNlciBzaWduaW5nIG1hdGVyaWFsXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbXMgb2JqZWN0XG4gICAqIEBwYXJhbSB7VHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCB3aXRoIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gdXNlciBzaWduaW5nIG1hdGVyaWFsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLndhbGxldFBhc3NwaHJhc2VdIC0gd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHtFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZH0gW3BhcmFtcy5lbmNyeXB0ZWRVc2VyVG9CaXRnb1JTaGFyZV0gLSBlbmNyeXB0ZWQgdXNlciB0byBiaXRnbyBSIHNoYXJlIGdlbmVyYXRlZCBpbiB0aGUgY29tbWl0bWVudCBwaGFzZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IHJTaGFyZTogU2lnblNoYXJlIH0+fSAtIFIgU2hhcmUgdG8gQml0R29cbiAgICovXG4gIGNyZWF0ZVJTaGFyZUZyb21UeFJlcXVlc3QocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJUb0JpdGdvUlNoYXJlOiBFbmNyeXB0ZWRTaWduZXJTaGFyZVJlY29yZDtcbiAgfSk6IFByb21pc2U8eyByU2hhcmU6IFNpZ25TaGFyZSB9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEcgKFVzZXIgdG8gQml0R28pIHNoYXJlIGZyb20gYW4gdW5zaWduZWQgdHJhbnNhY3Rpb24gYW5kIHByaXZhdGUgdXNlciBzaWduaW5nIG1hdGVyaWFsXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbXMgb2JqZWN0XG4gICAqIEBwYXJhbSB7VHhSZXF1ZXN0fSBwYXJhbXMudHhSZXF1ZXN0IC0gdHJhbnNhY3Rpb24gcmVxdWVzdCB3aXRoIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMucHJ2IC0gdXNlciBzaWduaW5nIG1hdGVyaWFsXG4gICAqIEBwYXJhbSB7U2lnbmF0dXJlU2hhcmVSZWNvcmR9IHBhcmFtcy5iaXRnb1RvVXNlclJTaGFyZSAtIEJpdEdvIHRvIFVzZXIgUiBTaGFyZVxuICAgKiBAcGFyYW0ge1NpZ25TaGFyZX0gcGFyYW1zLnVzZXJUb0JpdGdvUlNoYXJlIC0gVXNlciB0byBCaXRHbyBSIFNoYXJlXG4gICAqIEBwYXJhbSB7Q29tbWl0bWVudFNoYXJlUmVjb3JkfSBwYXJhbXMuYml0Z29Ub1VzZXJDb21taXRtZW50IC0gQml0R28gdG8gVXNlciBDb21taXRtZW50XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEdTaGFyZT59IC0gR1NoYXJlIGZyb20gVXNlciB0byBCaXRHb1xuICAgKi9cbiAgY3JlYXRlR1NoYXJlRnJvbVR4UmVxdWVzdChwYXJhbXM6IHtcbiAgICB0eFJlcXVlc3Q6IFR4UmVxdWVzdDtcbiAgICBwcnY6IHN0cmluZztcbiAgICBiaXRnb1RvVXNlclJTaGFyZTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlclRvQml0Z29SU2hhcmU6IFNpZ25TaGFyZTtcbiAgICBiaXRnb1RvVXNlckNvbW1pdG1lbnQ6IENvbW1pdG1lbnRTaGFyZVJlY29yZDtcbiAgfSk6IFByb21pc2U8R1NoYXJlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHR4IHJlcXVlc3QgZnJvbSBwYXJhbXMgYW5kIHZlcmlmeSBpdFxuICAgKlxuICAgKiBAcGFyYW0ge1ByZWJ1aWxkVHJhbnNhY3Rpb25XaXRoSW50ZW50T3B0aW9uc30gcGFyYW1zIC0gcGFyYW1ldGVycyB0byBidWlsZCB0aGUgdHhcbiAgICogQHBhcmFtIHtUeFJlcXVlc3RWZXJzaW9ufSBhcGlWZXJzaW9uIGxpdGUgb3IgZnVsbFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByZXZpZXcgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgdG8gcHJldmlldyBhIHR4IHJlcXVlc3QsIHdoaWNoIHdpbGwgbm90IGluaXRpYXRlIHBvbGljeSBjaGVja3Mgb3IgcGVuZGluZyBhcHByb3ZhbHNcbiAgICogQHJldHVybnMge1Byb21pc2U8VHhSZXF1ZXN0Pn0gLSBhIGJ1aWx0IHR4IHJlcXVlc3RcbiAgICovXG4gIGFzeW5jIHByZWJ1aWxkVHhXaXRoSW50ZW50KFxuICAgIHBhcmFtczogUHJlYnVpbGRUcmFuc2FjdGlvbldpdGhJbnRlbnRPcHRpb25zLFxuICAgIGFwaVZlcnNpb246IFR4UmVxdWVzdFZlcnNpb24gPSAnbGl0ZScsXG4gICAgcHJldmlldz86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCBpbnRlbnRPcHRpb25zID0gdGhpcy5wb3B1bGF0ZUludGVudCh0aGlzLmJhc2VDb2luLCBwYXJhbXMpO1xuXG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB7XG4gICAgICBpbnRlbnQ6IHtcbiAgICAgICAgLi4uaW50ZW50T3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICBhcGlWZXJzaW9uOiBhcGlWZXJzaW9uLFxuICAgICAgcHJldmlldyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxVHJhY2VyID0gcGFyYW1zLnJlcUlkIHx8IG5ldyBSZXF1ZXN0VHJhY2VyKCk7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcVRyYWNlcik7XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IChhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJpdGdvLnVybCgnL3dhbGxldC8nICsgdGhpcy53YWxsZXQuaWQoKSArICcvdHhyZXF1ZXN0cycsIDIpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCkpIGFzIFR4UmVxdWVzdDtcblxuICAgIHJldHVybiB1bnNpZ25lZFR4O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR4IHJlcXVlc3QgZnJvbSBwYXJhbXMgZm9yIG1lc3NhZ2Ugc2lnbmluZ1xuICAgKiBAZGVwcmVjYXRlZCBVc2UgY3JlYXRlU2lnbk1lc3NhZ2VSZXF1ZXN0IGluc3RlYWRcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gYXBpVmVyc2lvblxuICAgKiBAcGFyYW0gcHJldmlld1xuICAgKi9cbiAgYXN5bmMgY3JlYXRlVHhSZXF1ZXN0V2l0aEludGVudEZvck1lc3NhZ2VTaWduaW5nKFxuICAgIHBhcmFtczogSW50ZW50T3B0aW9uc0Zvck1lc3NhZ2UsXG4gICAgYXBpVmVyc2lvbjogVHhSZXF1ZXN0VmVyc2lvbiA9ICdmdWxsJyxcbiAgICBwcmV2aWV3PzogYm9vbGVhblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IGludGVudE9wdGlvbnM6IFBvcHVsYXRlZEludGVudEZvck1lc3NhZ2VTaWduaW5nID0ge1xuICAgICAgY3VzdG9kaWFuTWVzc2FnZUlkOiBwYXJhbXMuY3VzdG9kaWFuTWVzc2FnZUlkLFxuICAgICAgaW50ZW50VHlwZTogcGFyYW1zLmludGVudFR5cGUsXG4gICAgICBzZXF1ZW5jZUlkOiBwYXJhbXMuc2VxdWVuY2VJZCxcbiAgICAgIGNvbW1lbnQ6IHBhcmFtcy5jb21tZW50LFxuICAgICAgbWVtbzogcGFyYW1zLm1lbW8/LnZhbHVlLFxuICAgICAgaXNUc3M6IHBhcmFtcy5pc1RzcyxcbiAgICAgIG1lc3NhZ2VSYXc6IHBhcmFtcy5tZXNzYWdlUmF3LFxuICAgICAgbWVzc2FnZUVuY29kZWQ6IHBhcmFtcy5tZXNzYWdlRW5jb2RlZCA/PyAnJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHhSZXF1ZXN0QmFzZShpbnRlbnRPcHRpb25zLCBhcGlWZXJzaW9uLCBwcmV2aWV3LCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHNpZ24gbWVzc2FnZSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHNpZ24gbWVzc2FnZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uIC0gdGhlIEFQSSB2ZXJzaW9uIHRvIHVzZSwgZGVmYXVsdHMgdG8gJ2Z1bGwnXG4gICAqL1xuICBhc3luYyBidWlsZFNpZ25NZXNzYWdlUmVxdWVzdChcbiAgICBwYXJhbXM6IEludGVudE9wdGlvbnNGb3JNZXNzYWdlLFxuICAgIGFwaVZlcnNpb246IFR4UmVxdWVzdFZlcnNpb24gPSAnZnVsbCdcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBhc3NlcnQoXG4gICAgICBwYXJhbXMuaW50ZW50VHlwZSA9PT0gJ3NpZ25NZXNzYWdlJyxcbiAgICAgICdJbnRlbnQgdHlwZSBtdXN0IGJlIHNpZ25NZXNzYWdlIGZvciBjcmVhdGVNc2dSZXF1ZXN0V2l0aFNpZ25NZXNzYWdlSW50ZW50J1xuICAgICk7XG4gICAgY29uc3QgaW50ZW50OiBQb3B1bGF0ZWRJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyA9IHtcbiAgICAgIGN1c3RvZGlhbk1lc3NhZ2VJZDogcGFyYW1zLmN1c3RvZGlhbk1lc3NhZ2VJZCxcbiAgICAgIGludGVudFR5cGU6IHBhcmFtcy5pbnRlbnRUeXBlLFxuICAgICAgc2VxdWVuY2VJZDogcGFyYW1zLnNlcXVlbmNlSWQsXG4gICAgICBjb21tZW50OiBwYXJhbXMuY29tbWVudCxcbiAgICAgIG1lbW86IHBhcmFtcy5tZW1vPy52YWx1ZSxcbiAgICAgIGlzVHNzOiBwYXJhbXMuaXNUc3MsXG4gICAgICBtZXNzYWdlUmF3OiBwYXJhbXMubWVzc2FnZVJhdyxcbiAgICAgIG1lc3NhZ2VTdGFuZGFyZFR5cGU6IHBhcmFtcy5tZXNzYWdlU3RhbmRhcmRUeXBlID8/IE1lc3NhZ2VTdGFuZGFyZFR5cGUuVU5LTk9XTixcbiAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMubWVzc2FnZUVuY29kZWQgPz8gJycsXG4gICAgICBzaWduZXJBZGRyZXNzOiBwYXJhbXMuc2lnbmVyQWRkcmVzcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuYnVpbGRTaWduTWVzc2FnZVJlcXVlc3RCYXNlKGludGVudCwgYXBpVmVyc2lvbiwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0eCByZXF1ZXN0IGZyb20gcGFyYW1zIGZvciB0eXBlIGRhdGEgc2lnbmluZ1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uXG4gICAqIEBwYXJhbSBwcmV2aWV3XG4gICAqL1xuICBhc3luYyBjcmVhdGVUeFJlcXVlc3RXaXRoSW50ZW50Rm9yVHlwZWREYXRhU2lnbmluZyhcbiAgICBwYXJhbXM6IEludGVudE9wdGlvbnNGb3JUeXBlZERhdGEsXG4gICAgYXBpVmVyc2lvbjogVHhSZXF1ZXN0VmVyc2lvbiA9ICdmdWxsJyxcbiAgICBwcmV2aWV3PzogYm9vbGVhblxuICApOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIGNvbnN0IGludGVudE9wdGlvbnM6IFBvcHVsYXRlZEludGVudEZvclR5cGVkRGF0YVNpZ25pbmcgPSB7XG4gICAgICBjdXN0b2RpYW5NZXNzYWdlSWQ6IHBhcmFtcy5jdXN0b2RpYW5NZXNzYWdlSWQsXG4gICAgICBpbnRlbnRUeXBlOiBwYXJhbXMuaW50ZW50VHlwZSxcbiAgICAgIHNlcXVlbmNlSWQ6IHBhcmFtcy5zZXF1ZW5jZUlkLFxuICAgICAgY29tbWVudDogcGFyYW1zLmNvbW1lbnQsXG4gICAgICBtZW1vOiBwYXJhbXMubWVtbz8udmFsdWUsXG4gICAgICBpc1RzczogcGFyYW1zLmlzVHNzLFxuICAgICAgbWVzc2FnZVJhdzogcGFyYW1zLnR5cGVkRGF0YVJhdyxcbiAgICAgIG1lc3NhZ2VFbmNvZGVkOiBwYXJhbXMudHlwZWREYXRhRW5jb2RlZCA/PyAnJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVHhSZXF1ZXN0QmFzZShpbnRlbnRPcHRpb25zLCBhcGlWZXJzaW9uLCBwcmV2aWV3LCBwYXJhbXMucmVxSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIEJpdGdvIEFQSSB0byBjcmVhdGUgdHggcmVxdWVzdC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlVHhSZXF1ZXN0QmFzZShcbiAgICBpbnRlbnRPcHRpb25zOiBQb3B1bGF0ZWRJbnRlbnRGb3JUeXBlZERhdGFTaWduaW5nIHwgUG9wdWxhdGVkSW50ZW50Rm9yTWVzc2FnZVNpZ25pbmcsXG4gICAgYXBpVmVyc2lvbjogVHhSZXF1ZXN0VmVyc2lvbixcbiAgICBwcmV2aWV3PzogYm9vbGVhbixcbiAgICByZXFJZD86IElSZXF1ZXN0VHJhY2VyXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3Qgd2hpdGVsaXN0ZWRQYXJhbXMgPSB7XG4gICAgICBpbnRlbnQ6IHtcbiAgICAgICAgLi4uaW50ZW50T3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICBhcGlWZXJzaW9uLFxuICAgICAgcHJldmlldyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLndhbGxldC5pZCgpfS90eHJlcXVlc3RzYCwgMikpXG4gICAgICAuc2VuZCh3aGl0ZWxpc3RlZFBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBCaXRnbyBBUEkgdG8gY3JlYXRlIG1zZyByZXF1ZXN0LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFNpZ25NZXNzYWdlUmVxdWVzdEJhc2UoXG4gICAgaW50ZW50OiBQb3B1bGF0ZWRJbnRlbnRGb3JNZXNzYWdlU2lnbmluZyxcbiAgICBhcGlWZXJzaW9uOiBUeFJlcXVlc3RWZXJzaW9uLFxuICAgIHJlcUlkPzogSVJlcXVlc3RUcmFjZXJcbiAgKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFBhcmFtcyA9IHtcbiAgICAgIGludGVudDoge1xuICAgICAgICAuLi5pbnRlbnQsXG4gICAgICB9LFxuICAgICAgYXBpVmVyc2lvbixcbiAgICB9O1xuXG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoYC93YWxsZXQvJHt0aGlzLndhbGxldC5pZCgpfS9tc2dyZXF1ZXN0c2AsIDIpKVxuICAgICAgLnNlbmQod2hpdGVsaXN0ZWRQYXJhbXMpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBkZWxldGUgc2lnbmF0dXJlIHNoYXJlcyBmb3IgYSB0eFJlcXVlc3QsIHRoZSBlbmRwb2ludCBkZWxldGUgdGhlIHNpZ25hdHVyZXMgYW5kIHJldHVybiB0aGVtXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eFJlcXVlc3RJZCB0eCBpZCByZWZlcmVuY2UgdG8gZGVsZXRlIHNpZ25hdHVyZSBzaGFyZXNcbiAgICogQHBhcmFtIHtJUmVxdWVzdFRyYWNlcn0gcmVxSWQgLSB0aGUgcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7U2lnbmF0dXJlU2hhcmVSZWNvcmRbXX1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZDogc3RyaW5nLCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxTaWduYXR1cmVTaGFyZVJlY29yZFtdPiB7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICByZXR1cm4gdGhpcy5iaXRnb1xuICAgICAgLmRlbCh0aGlzLmJpdGdvLnVybChgL3dhbGxldC8ke3RoaXMud2FsbGV0LmlkKCl9L3R4cmVxdWVzdHMvJHt0eFJlcXVlc3RJZH0vc2lnbmF0dXJlc2hhcmVzYCwgMikpXG4gICAgICAuc2VuZCgpXG4gICAgICAucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgc2VuZCBwcm9jZWR1cmUgb25jZSBCaXRnbyBoYXMgdGhlIFVzZXIgVG8gQml0Z28gR1NoYXJlXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eFJlcXVlc3RJZCAtIHRoZSB0eFJlcXVlc3QgSWRcbiAgICogQHBhcmFtIHtJUmVxdWVzdFRyYWNlcn0gcmVxSWQgLSB0aGUgcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgYXN5bmMgc2VuZFR4UmVxdWVzdCh0eFJlcXVlc3RJZDogc3RyaW5nLCByZXFJZD86IElSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCByZXFUcmFjZXIgPSByZXFJZCB8fCBuZXcgUmVxdWVzdFRyYWNlcigpO1xuICAgIHRoaXMuYml0Z28uc2V0UmVxdWVzdFRyYWNlcihyZXFUcmFjZXIpO1xuICAgIHJldHVybiB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJhc2VDb2luLnVybCgnL3dhbGxldC8nICsgdGhpcy53YWxsZXQuaWQoKSArICcvdHgvc2VuZCcpKVxuICAgICAgLnNlbmQoeyB0eFJlcXVlc3RJZCB9KVxuICAgICAgLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBzaWduYXR1cmUgc2hhcmVzLCBnZXQgdGhlIHR4IHJlcXVlc3Qgd2l0aG91dCB0aGVtIGZyb20gdGhlIGRiIGFuZCBzaWduIGl0IHRvIGZpbmFsbHkgc2VuZCBpdC5cbiAgICpcbiAgICogTm90ZSA6IFRoaXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvcmRlciB0byByZWFjaCBsYXRlc3QgbmV0d29yayBjb25kaXRpb25zIHJlcXVpcmVkIG9uIHBlbmRpbmcgYXBwcm92YWwgZmxvdy5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR4UmVxdWVzdElkIC0gdGhlIHR4UmVxdWVzdCBJZCB0byBtYWtlIHRoZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGRlY3J5cHRlZFBydiAtIGRlY3J5cHRlZCBwcnYgdG8gc2lnbiB0aGUgdHggcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZXF1ZXN0VHJhY2VyfSByZXFJZCBpZCB0cmFjZXIuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyByZWNyZWF0ZVR4UmVxdWVzdCh0eFJlcXVlc3RJZDogc3RyaW5nLCBkZWNyeXB0ZWRQcnY6IHN0cmluZywgcmVxSWQ6IElSZXF1ZXN0VHJhY2VyKTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZVNpZ25hdHVyZVNoYXJlcyh0eFJlcXVlc3RJZCwgcmVxSWQpO1xuICAgIC8vIGFmdGVyIGRlbGV0ZSBzaWduYXR1cmVzIHNoYXJlcyBnZXQgdGhlIHR4IHdpdGhvdXQgdGhlbVxuICAgIGNvbnN0IHR4UmVxdWVzdCA9IGF3YWl0IHRoaXMuZ2V0VHhSZXF1ZXN0KHR4UmVxdWVzdElkLCByZXFJZCk7XG4gICAgLy8gRWREU0EgTVBDdjIgcmUtdmVyaWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFnYWluc3QgdHhQYXJhbXMucmVjaXBpZW50cyBiZWZvcmUgRFNHIHN0YXJ0cy5cbiAgICAvLyBPbiB0aGUgUEEgcGF0aCB0aGVyZSBpcyBubyBTREstbG9jYWwgYnVpbGRQYXJhbXMsIHNvIGRlcml2ZSB0eFBhcmFtcyBmcm9tIHRoZSBwZXJzaXN0ZWRcbiAgICAvLyBpbnRlbnQuIE90aGVyIFRTUyB2YXJpYW50cyBlaXRoZXIgc2tpcCByZWNpcGllbnQgdmVyaWZpY2F0aW9uIG9yIGFscmVhZHkgd29yayB3aXRob3V0IHR4UGFyYW1zLlxuICAgIGNvbnN0IHR4UGFyYW1zID1cbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSA9PT0gJ01QQ3YyJyAmJiB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWRkc2EnXG4gICAgICAgID8gdHhQYXJhbXNGcm9tSW50ZW50KHR4UmVxdWVzdC5pbnRlbnQsIHRoaXMuYmFzZUNvaW4uZ2V0Q2hhaW4oKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2lnblR4UmVxdWVzdCh7IHR4UmVxdWVzdCwgcHJ2OiBkZWNyeXB0ZWRQcnYsIHJlcUlkLCB0eFBhcmFtcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYXRlc3QgVHggUmVxdWVzdCBieSBpZFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHhSZXF1ZXN0SWQgLSB0aGUgdHhSZXF1ZXN0IElkXG4gICAqIEBwYXJhbSB7SVJlcXVlc3RUcmFjZXJ9IHJlcUlkIC0gcmVxdWVzdCB0cmFjZXIgcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fVxuICAgKi9cbiAgYXN5bmMgZ2V0VHhSZXF1ZXN0KHR4UmVxdWVzdElkOiBzdHJpbmcsIHJlcUlkPzogSVJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPFR4UmVxdWVzdD4ge1xuICAgIHJldHVybiBnZXRUeFJlcXVlc3QodGhpcy5iaXRnbywgdGhpcy53YWxsZXQuaWQoKSwgdHhSZXF1ZXN0SWQsIHJlcUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJdCBnZXRzIHRoZSBhcHByb3ByaWF0ZSBCaXRHbyBHUEcgcHVibGljIGtleXMgZm9yIGtleSBjcmVhdGlvbiBiYXNlZCBvbiBhXG4gICAqIGNvbWJpbmF0aW9uIG9mIGNvaW4gYW5kIHRoZSBmZWF0dXJlIGZsYWdzIG9uIHRoZSB1c2VyIGFuZCB0aGVpciBlbnRlcnByaXNlIGlmIHNldC5cbiAgICogUmV0dXJucyBib3RoIHRoZSBkZWZhdWx0IE1QQ3YyIGtleSBhbmQgdGhlIEVkRFNBLXNwZWNpZmljIE1QQ3YyIGtleSAoaWYgcHJlc2VudCkuXG4gICAqIEBwYXJhbSBlbnRlcnByaXNlSWQgLSBlbnRlcnByaXNlIHVuZGVyIHdoaWNoIHVzZXIgd2FudHMgdG8gY3JlYXRlIHRoZSB3YWxsZXRcbiAgICogQHBhcmFtIGlzTVBDdjIgLSB0cnVlIHRvIGdldCB0aGUgTVBDdjIgR1BHIHB1YmxpYyBrZXksIGRlZmF1bHRzIHRvIGZhbHNlXG4gICAqIEBwYXJhbSByZXFJZCAtIHJlcXVlc3QgdHJhY2VyIHJlcXVlc3QgaWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MoXG4gICAgZW50ZXJwcmlzZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgaXNNUEN2MiA9IGZhbHNlLFxuICAgIHJlcUlkPzogSVJlcXVlc3RUcmFjZXJcbiAgKTogUHJvbWlzZTx7IG1wY3YyUHVibGljS2V5OiBLZXk7IGVkZHNhTXBjdjJQdWJsaWNLZXk6IEtleSB8IHVuZGVmaW5lZCB9PiB7XG4gICAgY29uc3QgcmVxVHJhY2VyID0gcmVxSWQgfHwgbmV3IFJlcXVlc3RUcmFjZXIoKTtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxVHJhY2VyKTtcbiAgICBjb25zdCByZXNwb25zZTogQml0Z29HUEdQdWJsaWNLZXkgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYmFzZUNvaW4udXJsKCcvdHNzL3B1YmtleScpKVxuICAgICAgLnF1ZXJ5KHsgZW50ZXJwcmlzZUlkIH0pXG4gICAgICAucmV0cnkoMylcbiAgICAgIC5yZXN1bHQoKTtcbiAgICBjb25zdCBtcGN2MlB1YmxpY0tleSA9IGF3YWl0IHJlYWRLZXkoe1xuICAgICAgYXJtb3JlZEtleTogKGlzTVBDdjIgPyByZXNwb25zZS5tcGN2MlB1YmxpY0tleSA6IHJlc3BvbnNlLnB1YmxpY0tleSkgYXMgc3RyaW5nLFxuICAgIH0pO1xuICAgIGNvbnN0IGVkZHNhTXBjdjJQdWJsaWNLZXkgPSByZXNwb25zZS5lZGRzYU1wY3YyUHVibGljS2V5XG4gICAgICA/IGF3YWl0IHJlYWRLZXkoeyBhcm1vcmVkS2V5OiByZXNwb25zZS5lZGRzYU1wY3YyUHVibGljS2V5IH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBtcGN2MlB1YmxpY0tleSwgZWRkc2FNcGN2MlB1YmxpY0tleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3VwcG9ydGVkIFR4UmVxdWVzdCB2ZXJzaW9ucyBmb3IgdGhpcyB3YWxsZXRcbiAgICogQGRlcHJlY2F0ZWQgV2hlbmV2ZXIgbmVlZGVkLCB1c2UgYXBpVmVyc2lvbiAnZnVsbCcgZm9yIFRTUyB3YWxsZXRzXG4gICAqL1xuICBwdWJsaWMgc3VwcG9ydGVkVHhSZXF1ZXN0VmVyc2lvbnMoKTogVHhSZXF1ZXN0VmVyc2lvbltdIHtcbiAgICBpZiAoIXRoaXMuX3dhbGxldCB8fCB0aGlzLl93YWxsZXQudHlwZSgpID09PSAndHJhZGluZycgfHwgdGhpcy5fd2FsbGV0Lm11bHRpc2lnVHlwZSgpICE9PSAndHNzJykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fd2FsbGV0LmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpID09PSAnZWNkc2EnKSB7XG4gICAgICByZXR1cm4gWydmdWxsJ107XG4gICAgfSBlbHNlIGlmICh0aGlzLl93YWxsZXQuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCkgPT09ICdlZGRzYScgJiYgdGhpcy5fd2FsbGV0LnR5cGUoKSA9PT0gJ2hvdCcpIHtcbiAgICAgIGlmICh0aGlzLl93YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpID09PSAnTVBDdjInKSB7XG4gICAgICAgIHJldHVybiBbJ2Z1bGwnXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbJ2xpdGUnLCAnZnVsbCddO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gWydmdWxsJ107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHhSZXF1ZXN0IGlzIHVzaW5nIGFwaVZlcnNpb24gPT0gZnVsbCBhbmQgaXMgcGVuZGluZyBhcHByb3ZhbFxuICAgKiBAcGFyYW0gdHhSZXF1ZXN0XG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIGlzUGVuZGluZ0FwcHJvdmFsVHhSZXF1ZXN0RnVsbCh0eFJlcXVlc3Q6IFR4UmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgYXBpVmVyc2lvbiwgc3RhdGUgfSA9IHR4UmVxdWVzdDtcbiAgICByZXR1cm4gYXBpVmVyc2lvbiA9PT0gJ2Z1bGwnICYmICdwZW5kaW5nQXBwcm92YWwnID09PSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpZ25hYmxlIGhleCwgZGVyaXZhdGlvbiBwYXRoLCBhbmQgc2VyaWFsaXplZCB0eCBoZXggZnJvbSBhIGZ1bGwgc2luZ2xlLXRyYW5zYWN0aW9uIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7VHhSZXF1ZXN0fSB0eFJlcXVlc3QgLSB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBvYmplY3RcbiAgICogQHJldHVybnMge3sgc2lnbmFibGVIZXg6IHN0cmluZzsgZGVyaXZhdGlvblBhdGg6IHN0cmluZzsgc2VyaWFsaXplZFR4SGV4OiBzdHJpbmcgfCB1bmRlZmluZWQgfX0gLSB0aGUgc2lnbmFibGUgaGV4LCBkZXJpdmF0aW9uIHBhdGgsIGFuZCBzZXJpYWxpemVkIHR4IGhleFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3QsXG4gICAgbWlzc2luZ1RyYW5zYWN0aW9uc01lc3NhZ2UgPSAnY3JlYXRlT2ZmbGluZVNoYXJlIHJlcXVpcmVzIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uIGluIHR4UmVxdWVzdCdcbiAgKToge1xuICAgIHNpZ25hYmxlSGV4OiBzdHJpbmc7XG4gICAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbiAgICBzZXJpYWxpemVkVHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfSB7XG4gICAgYXNzZXJ0KHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgJiYgdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsIG1pc3NpbmdUcmFuc2FjdGlvbnNNZXNzYWdlKTtcbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4O1xuICAgIGFzc2VydCh1bnNpZ25lZFR4LCAnTWlzc2luZyB1bnNpZ25lZFR4IGluIHRyYW5zYWN0aW9ucycpO1xuICAgIGFzc2VydCh1bnNpZ25lZFR4LnNpZ25hYmxlSGV4LCAnTWlzc2luZyBzaWduYWJsZUhleCBpbiB1bnNpZ25lZFR4Jyk7XG4gICAgYXNzZXJ0KHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGgsICdNaXNzaW5nIGRlcml2YXRpb25QYXRoIGluIHVuc2lnbmVkVHgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFibGVIZXg6IHVuc2lnbmVkVHguc2lnbmFibGVIZXgsXG4gICAgICBkZXJpdmF0aW9uUGF0aDogdW5zaWduZWRUeC5kZXJpdmF0aW9uUGF0aCxcbiAgICAgIHNlcmlhbGl6ZWRUeEhleDogdW5zaWduZWRUeC5zZXJpYWxpemVkVHhIZXgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBCaXRHbyBhbmQgdXNlciBHUEcga2V5cyBmcm9tIHRoZSBCaXRHbyBwdWJsaWMgR1BHIGtleSBhbmQgdGhlIGVuY3J5cHRlZCB1c2VyIEdQRyBwcml2YXRlIGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGJpdGdvUHVibGljR3BnS2V5IC0gdGhlIEJpdEdvIHB1YmxpYyBHUEcga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IC0gdGhlIGVuY3J5cHRlZCB1c2VyIEdQRyBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gd2FsbGV0UGFzc3BocmFzZSAtIHRoZSB3YWxsZXQgcGFzc3BocmFzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRhdGEgLSB0aGUgYWRkaXRpb25hbCBkYXRhIHRvIHZhbGlkYXRlIHRoZSBHUEcga2V5c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlckdwZ0tleURvbWFpblNlcGFyYXRvciAtIHRoZSBkb21haW4gc2VwYXJhdG9yIGV4cGVjdGVkIGluIHRoZSBlbmNyeXB0ZWQgR1BHIGtleSBhZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7IGJpdGdvR3BnS2V5OiBvcGVucGdwLktleTsgdXNlckdwZ1BydktleTogb3BlbnBncC5Qcml2YXRlS2V5IH0+fSAtIHRoZSBCaXRHbyBhbmQgdXNlciBHUEcga2V5c1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEJpdGdvQW5kVXNlckdwZ0tleXMoXG4gICAgYml0Z29QdWJsaWNHcGdLZXk6IHN0cmluZyxcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmcsXG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nLFxuICAgIGFkYXRhOiBzdHJpbmcsXG4gICAgdXNlckdwZ0tleURvbWFpblNlcGFyYXRvcjogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIGJpdGdvR3BnS2V5OiBvcGVucGdwLktleTtcbiAgICB1c2VyR3BnUHJ2S2V5OiBvcGVucGdwLlByaXZhdGVLZXk7XG4gIH0+IHtcbiAgICBjb25zdCBiaXRnb0dwZ0tleSA9IGF3YWl0IG9wZW5wZ3AucmVhZEtleSh7IGFybW9yZWRLZXk6IGJpdGdvUHVibGljR3BnS2V5IH0pO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkR3BnUHJ2S2V5ID0gYXdhaXQgdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgIGlucHV0OiBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgfSk7XG5cbiAgICBpZiAoYWRhdGEpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkVXNlckdwZ1BydktleSwgdXNlckdwZ0tleURvbWFpblNlcGFyYXRvcik7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBvcGVucGdwLnJlYWRQcml2YXRlS2V5KHsgYXJtb3JlZEtleTogZGVjcnlwdGVkR3BnUHJ2S2V5IH0pO1xuICAgIHJldHVybiB7IGJpdGdvR3BnS2V5LCB1c2VyR3BnUHJ2S2V5IH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGVuY3J5cHRpb24gYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgYWdhaW5zdCB0aGUgY2lwaGVydGV4dCBlbnZlbG9wZS5cbiAgICogQHBhcmFtIGFkYXRhIHN0cmluZ1xuICAgKiBAcGFyYW0gY3lwaGVydGV4dCBzdHJpbmdcbiAgICogQHBhcmFtIHJvdW5kRG9tYWluU2VwYXJhdG9yIHN0cmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIGFkYXRhIG9yIGN5cGhlcnRleHQgaXMgaW52YWxpZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQWRhdGEoYWRhdGE6IHN0cmluZywgY3lwaGVydGV4dDogc3RyaW5nLCByb3VuZERvbWFpblNlcGFyYXRvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGN5cGhlckpzb247XG4gICAgdHJ5IHtcbiAgICAgIGN5cGhlckpzb24gPSBKU09OLnBhcnNlKGN5cGhlcnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHBhcnNlIGN5cGhlcnRleHQgdG8gSlNPTiwgZ290OiAnICsgY3lwaGVydGV4dCk7XG4gICAgfVxuICAgIC8vIHVzaW5nIGRlY29kZVVSSUNvbXBvbmVudCB0byBoYW5kbGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKFxuICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KGN5cGhlckpzb24uYWRhdGEpICE9PSBkZWNvZGVVUklDb21wb25lbnQoYCR7cm91bmREb21haW5TZXBhcmF0b3J9OiR7YWRhdGF9YCkgJiZcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudChjeXBoZXJKc29uLmFkYXRhKSAhPT0gZGVjb2RlVVJJQ29tcG9uZW50KGFkYXRhKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBZGF0YSBkb2VzIG5vdCBtYXRjaCBjeXBoZXJ0ZXh0IGFkYXRhJyk7XG4gICAgfVxuICB9XG59XG4iXX0=