@bitgo-beta/sdk-coin-sol 7.6.4-beta.72 → 7.6.4-beta.721

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 (508) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
  6. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
  11. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +128 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +96 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +276 -0
  17. package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
  18. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  23. package/dist/cjs/src/lib/iface.d.ts +526 -0
  24. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/iface.js +7 -0
  26. package/dist/{src → cjs/src}/lib/index.d.ts +6 -0
  27. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/index.js +97 -0
  29. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  30. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/instructionParamsFactory.js +1280 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  34. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  35. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/keyPair.js +112 -0
  37. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
  59. package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
  60. package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/serialization/index.js +27 -0
  62. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  63. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  65. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  66. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  68. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  69. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  71. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  73. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  75. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  77. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  79. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  80. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  81. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  83. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  84. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  85. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  86. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  87. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  88. package/dist/cjs/src/lib/tokenExtensions.js +109 -0
  89. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  90. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  91. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  92. package/dist/{src → cjs/src}/lib/transaction.d.ts +34 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +691 -0
  95. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
  96. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  97. package/dist/cjs/src/lib/transactionBuilder.js +462 -0
  98. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +14 -0
  99. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/src/lib/transactionBuilderFactory.js +222 -0
  101. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  102. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  103. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  104. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  105. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  106. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +665 -0
  109. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  110. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  111. package/dist/cjs/src/register.d.ts +5 -0
  112. package/dist/cjs/src/register.d.ts.map +1 -0
  113. package/dist/cjs/src/register.js +29 -0
  114. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  115. package/dist/cjs/src/sol.d.ts.map +1 -0
  116. package/dist/cjs/src/sol.js +1673 -0
  117. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  118. package/dist/cjs/src/solToken.d.ts.map +1 -0
  119. package/dist/cjs/src/solToken.js +79 -0
  120. package/dist/cjs/src/tsol.d.ts.map +1 -0
  121. package/dist/cjs/src/tsol.js +24 -0
  122. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  123. package/dist/cjs/test/fixtures/sol.js +1433 -0
  124. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  125. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  126. package/dist/cjs/test/resources/sol.js +320 -0
  127. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  128. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  129. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  130. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  132. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  134. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  135. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  136. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  137. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  138. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  139. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  141. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  142. package/dist/cjs/test/unit/keyPair.js +177 -0
  143. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  144. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  145. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  146. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  147. package/dist/cjs/test/unit/register.d.ts +2 -0
  148. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/register.js +65 -0
  150. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  151. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  152. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  153. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  154. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  155. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  156. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  157. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  159. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  160. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  162. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  163. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  165. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  166. package/dist/cjs/test/unit/sol.js +5092 -0
  167. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  168. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  169. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/solToken.js +37 -0
  171. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  172. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  174. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  175. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  176. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  177. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  178. package/dist/cjs/test/unit/transaction.js +1129 -0
  179. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  180. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  181. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  182. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  183. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  184. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  186. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  187. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  188. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  189. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  190. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  192. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  193. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  194. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  195. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  196. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  198. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  199. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  200. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  201. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  202. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  204. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  205. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  206. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  207. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  208. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  210. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  211. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  212. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  213. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  214. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  216. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  218. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  219. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  220. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  221. package/dist/cjs/test/unit/utils.js +628 -0
  222. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  224. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  225. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  226. package/dist/esm/index.d.ts +7 -0
  227. package/dist/esm/index.js +7 -0
  228. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  229. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  230. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  231. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  232. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  233. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  234. package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
  235. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  236. package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
  237. package/dist/esm/lib/constants.d.ts +234 -0
  238. package/dist/esm/lib/constants.d.ts.map +1 -0
  239. package/dist/esm/lib/constants.js +273 -0
  240. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  241. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  242. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  243. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  244. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  245. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  246. package/dist/esm/lib/iface.d.ts +526 -0
  247. package/dist/esm/lib/iface.d.ts.map +1 -0
  248. package/dist/esm/lib/iface.js +3 -0
  249. package/dist/esm/lib/index.d.ts +28 -0
  250. package/dist/esm/lib/index.d.ts.map +1 -0
  251. package/dist/esm/lib/index.js +28 -0
  252. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  253. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  254. package/dist/esm/lib/instructionParamsFactory.js +1272 -0
  255. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  256. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  257. package/dist/esm/lib/keyPair.d.ts +32 -0
  258. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  259. package/dist/esm/lib/keyPair.js +75 -0
  260. package/dist/esm/lib/messages/index.d.ts +2 -0
  261. package/dist/esm/lib/messages/index.js +2 -0
  262. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  263. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  264. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  265. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  266. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  267. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  268. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  269. package/dist/esm/lib/scaledUiAmount.js +108 -0
  270. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  271. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  272. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  273. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  274. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  275. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  276. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  277. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  278. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  279. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
  280. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  281. package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
  282. package/dist/esm/lib/serialization/index.d.ts +5 -0
  283. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  284. package/dist/esm/lib/serialization/index.js +5 -0
  285. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  286. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  287. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  288. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  289. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  290. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  291. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  292. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  293. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  294. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  295. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  296. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  297. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  298. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  299. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  300. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  301. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  302. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  303. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  304. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  305. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  306. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  307. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  308. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  309. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  310. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  311. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  312. package/dist/esm/lib/token2022Resolve.js +194 -0
  313. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  314. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  315. package/dist/esm/lib/tokenExtensions.js +103 -0
  316. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  317. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  318. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  319. package/dist/esm/lib/transaction.d.ts +136 -0
  320. package/dist/esm/lib/transaction.d.ts.map +1 -0
  321. package/dist/esm/lib/transaction.js +684 -0
  322. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  323. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  324. package/dist/esm/lib/transactionBuilder.js +455 -0
  325. package/dist/esm/lib/transactionBuilderFactory.d.ts +129 -0
  326. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  327. package/dist/esm/lib/transactionBuilderFactory.js +218 -0
  328. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  329. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  330. package/dist/esm/lib/transferBuilder.js +74 -0
  331. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  332. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  333. package/dist/esm/lib/transferBuilderV2.js +245 -0
  334. package/dist/esm/lib/utils.d.ts +205 -0
  335. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  336. package/dist/esm/lib/utils.js +627 -0
  337. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  338. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  339. package/dist/esm/register.d.ts +5 -0
  340. package/dist/esm/register.d.ts.map +1 -0
  341. package/dist/esm/register.js +24 -0
  342. package/dist/esm/sol.d.ts +351 -0
  343. package/dist/esm/sol.d.ts.map +1 -0
  344. package/dist/esm/sol.js +1632 -0
  345. package/dist/esm/solToken.d.ts +44 -0
  346. package/dist/esm/solToken.d.ts.map +1 -0
  347. package/dist/esm/solToken.js +75 -0
  348. package/dist/esm/tsol.d.ts +11 -0
  349. package/dist/esm/tsol.js +20 -0
  350. package/package.json +37 -17
  351. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  352. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  353. package/dist/src/config/token2022StaticConfig.js +0 -50
  354. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  355. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  356. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  357. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  358. package/dist/src/lib/closeAtaBuilder.js +0 -69
  359. package/dist/src/lib/constants.d.ts.map +0 -1
  360. package/dist/src/lib/constants.js +0 -171
  361. package/dist/src/lib/customInstructionBuilder.js +0 -289
  362. package/dist/src/lib/iface.d.ts +0 -244
  363. package/dist/src/lib/iface.d.ts.map +0 -1
  364. package/dist/src/lib/iface.js +0 -7
  365. package/dist/src/lib/index.d.ts.map +0 -1
  366. package/dist/src/lib/index.js +0 -77
  367. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  368. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  369. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  370. package/dist/src/lib/keyPair.d.ts.map +0 -1
  371. package/dist/src/lib/keyPair.js +0 -63
  372. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  373. package/dist/src/lib/solInstructionFactory.js +0 -572
  374. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  375. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  376. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  377. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  378. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  379. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  380. package/dist/src/lib/token2022Config.d.ts +0 -44
  381. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  382. package/dist/src/lib/token2022Config.js +0 -27
  383. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  384. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  385. package/dist/src/lib/transaction.d.ts.map +0 -1
  386. package/dist/src/lib/transaction.js +0 -595
  387. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  388. package/dist/src/lib/transactionBuilder.js +0 -380
  389. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  390. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  391. package/dist/src/lib/transferBuilder.js +0 -70
  392. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  393. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  394. package/dist/src/lib/transferBuilderV2.js +0 -210
  395. package/dist/src/lib/utils.js +0 -589
  396. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  397. package/dist/src/register.d.ts +0 -3
  398. package/dist/src/register.d.ts.map +0 -1
  399. package/dist/src/register.js +0 -15
  400. package/dist/src/sol.d.ts.map +0 -1
  401. package/dist/src/sol.js +0 -1324
  402. package/dist/src/solToken.d.ts.map +0 -1
  403. package/dist/src/solToken.js +0 -69
  404. package/dist/src/tsol.js +0 -24
  405. package/dist/test/fixtures/sol.js +0 -1433
  406. package/dist/test/resources/sol.d.ts.map +0 -1
  407. package/dist/test/resources/sol.js +0 -320
  408. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  409. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  410. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  411. package/dist/test/unit/getBuilderFactory.js +0 -10
  412. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  413. package/dist/test/unit/instructionParamsFactory.js +0 -412
  414. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  415. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  416. package/dist/test/unit/keyPair.js +0 -177
  417. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  418. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  419. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  420. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  421. package/dist/test/unit/sol.js +0 -3180
  422. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  423. package/dist/test/unit/solInstructionFactory.js +0 -454
  424. package/dist/test/unit/solToken.d.ts.map +0 -1
  425. package/dist/test/unit/solToken.js +0 -31
  426. package/dist/test/unit/transaction.d.ts.map +0 -1
  427. package/dist/test/unit/transaction.js +0 -983
  428. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  429. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  430. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  431. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  432. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  433. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  434. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  435. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  436. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  437. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  438. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  439. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  440. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  441. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  442. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  443. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  444. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  445. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  446. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  447. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  448. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  449. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  450. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  451. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  452. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  453. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  454. package/dist/test/unit/utils.js +0 -517
  455. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  456. package/dist/test/unit/versionedTransaction.js +0 -207
  457. package/dist/tsconfig.tsbuildinfo +0 -1
  458. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  459. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  460. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  461. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  462. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  463. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  464. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  465. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  466. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  467. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  468. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  469. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  470. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  471. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  472. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  473. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  474. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  475. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  476. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  477. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  478. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  479. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  480. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  481. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  482. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  483. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  484. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  485. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  486. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  487. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  488. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  489. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  490. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  491. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  492. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  493. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  494. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  495. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  496. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  497. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  498. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  499. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  500. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  501. /package/dist/{src → esm}/index.d.ts.map +0 -0
  502. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  503. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  504. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  505. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  506. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  507. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  508. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,691 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transaction = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
10
+ const bs58_1 = __importDefault(require("bs58"));
11
+ const _1 = require(".");
12
+ const constants_1 = require("./constants");
13
+ const instructionParamsFactory_1 = require("./instructionParamsFactory");
14
+ const utils_1 = require("./utils");
15
+ const public_types_1 = require("@bitgo/public-types");
16
+ class Transaction extends sdk_core_1.BaseTransaction {
17
+ constructor(_coinConfig) {
18
+ super(_coinConfig);
19
+ this._instructionsData = [];
20
+ this._useTokenAddressTokenName = false;
21
+ }
22
+ get solTransaction() {
23
+ return this._solTransaction;
24
+ }
25
+ set solTransaction(tx) {
26
+ this._solTransaction = tx;
27
+ }
28
+ get numberOfRequiredSignatures() {
29
+ return this._solTransaction.compileMessage().header.numRequiredSignatures;
30
+ }
31
+ get numberOfATACreationInstructions() {
32
+ return this._solTransaction.instructions.filter((instruction) => (0, utils_1.getInstructionType)(instruction) === constants_1.ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
33
+ }
34
+ /** @inheritDoc */
35
+ get signablePayload() {
36
+ if (this._v1MessageBytes) {
37
+ return Buffer.from(this._v1MessageBytes);
38
+ }
39
+ if (this._versionedTransaction) {
40
+ return Buffer.from(this._versionedTransaction.message.serialize());
41
+ }
42
+ return this._solTransaction.serializeMessage();
43
+ }
44
+ /** @inheritDoc **/
45
+ get id() {
46
+ // Solana transaction ID === first signature: https://docs.solana.com/terminology#transaction-id
47
+ if (this._v1TransactionBytes) {
48
+ // v1 wire format: messageBytes followed by 64-byte signatures; the first signature is the tx id
49
+ const numRequired = this._v1TransactionBytes[1];
50
+ const sigStart = this._v1TransactionBytes.length - numRequired * 64;
51
+ if (numRequired > 0 && sigStart >= 0) {
52
+ const sig = this._v1TransactionBytes.slice(sigStart, sigStart + 64);
53
+ if (sig.some((byte) => byte !== 0)) {
54
+ return bs58_1.default.encode(sig);
55
+ }
56
+ }
57
+ }
58
+ if (this._versionedTransaction) {
59
+ const sig = this._versionedTransaction.signatures?.[0];
60
+ // Check if signature exists and is not a placeholder signature (all zeros)
61
+ if (sig && sig.some((byte) => byte !== 0)) {
62
+ return bs58_1.default.encode(sig);
63
+ }
64
+ }
65
+ if (this._solTransaction.signature) {
66
+ return bs58_1.default.encode(this._solTransaction.signature);
67
+ }
68
+ return constants_1.UNAVAILABLE_TEXT;
69
+ }
70
+ get lamportsPerSignature() {
71
+ return this._lamportsPerSignature;
72
+ }
73
+ set lamportsPerSignature(lamportsPerSignature) {
74
+ this._lamportsPerSignature = lamportsPerSignature;
75
+ }
76
+ get tokenAccountRentExemptAmount() {
77
+ return this._tokenAccountRentExemptAmount;
78
+ }
79
+ set tokenAccountRentExemptAmount(tokenAccountRentExemptAmount) {
80
+ this._tokenAccountRentExemptAmount = tokenAccountRentExemptAmount;
81
+ }
82
+ /** @inheritDoc */
83
+ get signature() {
84
+ const signatures = [];
85
+ if (this._versionedTransaction) {
86
+ // Handle VersionedTransaction signatures
87
+ for (const sig of this._versionedTransaction.signatures) {
88
+ // Filters out placeholder signatures
89
+ if (sig && sig.some((b) => b !== 0)) {
90
+ signatures.push(bs58_1.default.encode(sig));
91
+ }
92
+ }
93
+ }
94
+ else {
95
+ // Handle legacy transaction signatures
96
+ for (const solSignature of this._solTransaction.signatures) {
97
+ if (solSignature.signature) {
98
+ signatures.push(bs58_1.default.encode(solSignature.signature));
99
+ }
100
+ }
101
+ }
102
+ return signatures;
103
+ }
104
+ /**
105
+ * Set the transaction type.
106
+ *
107
+ * @param {TransactionType} transactionType The transaction type to be set.
108
+ */
109
+ setTransactionType(transactionType) {
110
+ this._type = transactionType;
111
+ }
112
+ /**
113
+ * Set the instructionData.
114
+ *
115
+ * @param {InstructionParams[]} instructionData The instruction data to be set.
116
+ */
117
+ setInstructionsData(instructionData) {
118
+ this._instructionsData = instructionData;
119
+ }
120
+ get useTokenAddressTokenName() {
121
+ return this._useTokenAddressTokenName;
122
+ }
123
+ setUseTokenAddressTokenName(value) {
124
+ this._useTokenAddressTokenName = value;
125
+ }
126
+ /**
127
+ * Check if this transaction is a VersionedTransaction
128
+ * @returns {boolean} True if this is a VersionedTransaction
129
+ */
130
+ isVersionedTransaction() {
131
+ return !!this._versionedTransaction || !!this._versionedTransactionData || !!this._v1TransactionBytes;
132
+ }
133
+ /**
134
+ * Get the serialized v1 wire transaction bytes (message + signatures), if this transaction is v1
135
+ * @returns {Uint8Array | undefined} The v1 wire bytes or undefined
136
+ */
137
+ get v1TransactionBytes() {
138
+ return this._v1TransactionBytes;
139
+ }
140
+ /**
141
+ * Set the serialized v1 wire transaction bytes (message + signatures)
142
+ * @param {Uint8Array | undefined} bytes The v1 wire bytes to store, or undefined to clear
143
+ */
144
+ set v1TransactionBytes(bytes) {
145
+ this._v1TransactionBytes = bytes;
146
+ }
147
+ /**
148
+ * Get the serialized v1 message bytes (without signatures), if this transaction is v1
149
+ * @returns {Uint8Array | undefined} The v1 message bytes or undefined
150
+ */
151
+ get v1MessageBytes() {
152
+ return this._v1MessageBytes;
153
+ }
154
+ /**
155
+ * Set the serialized v1 message bytes (without signatures)
156
+ * @param {Uint8Array | undefined} bytes The v1 message bytes to store, or undefined to clear
157
+ */
158
+ set v1MessageBytes(bytes) {
159
+ this._v1MessageBytes = bytes;
160
+ }
161
+ /**
162
+ * Get the original VersionedTransaction if this transaction was parsed from one
163
+ * @returns {VersionedTransaction | undefined} The VersionedTransaction or undefined
164
+ */
165
+ get versionedTransaction() {
166
+ return this._versionedTransaction;
167
+ }
168
+ /**
169
+ * Set a built VersionedTransaction
170
+ * @param {VersionedTransaction} versionedTx The VersionedTransaction to set
171
+ */
172
+ set versionedTransaction(versionedTx) {
173
+ this._versionedTransaction = versionedTx;
174
+ }
175
+ /**
176
+ * Get the stored VersionedTransactionData
177
+ * @returns {VersionedTransactionData | undefined} The stored data or undefined
178
+ */
179
+ getVersionedTransactionData() {
180
+ return this._versionedTransactionData;
181
+ }
182
+ /**
183
+ * Set the VersionedTransactionData for this transaction
184
+ * @param {VersionedTransactionData | undefined} data The versioned transaction data to store, or undefined to clear
185
+ */
186
+ setVersionedTransactionData(data) {
187
+ this._versionedTransactionData = data;
188
+ }
189
+ /**
190
+ * Add a signature produced by the fee payer of this transaction.
191
+ *
192
+ * The fee payer is account 0 of the transaction message, so its signature belongs in slot 0.
193
+ * Use this for signatures produced by the enterprise fee address key (HSM single-sig) of a
194
+ * sponsored transaction.
195
+ *
196
+ * @param {BasePublicKey} publicKey The public key of the fee payer; must be account 0 of the message
197
+ * @param {Buffer} signature The signature of the transaction payload
198
+ */
199
+ addFeePayerSignature(publicKey, signature) {
200
+ if (this._versionedTransaction) {
201
+ const account0 = this._versionedTransaction.message.staticAccountKeys[0]?.toBase58();
202
+ if (publicKey.pub !== account0) {
203
+ throw new sdk_core_1.SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
204
+ }
205
+ this._versionedTransaction.addSignature(new web3_js_1.PublicKey(publicKey.pub), signature);
206
+ return;
207
+ }
208
+ if (this._solTransaction) {
209
+ // For legacy transactions @solana/web3.js places the fee payer first in the message
210
+ const feePayer = this._solTransaction.feePayer?.toBase58();
211
+ if (publicKey.pub !== feePayer) {
212
+ throw new sdk_core_1.SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
213
+ }
214
+ this._solTransaction.addSignature(new web3_js_1.PublicKey(publicKey.pub), signature);
215
+ return;
216
+ }
217
+ throw new sdk_core_1.SigningError('Fee payer signature requires a built transaction');
218
+ }
219
+ /** @inheritdoc */
220
+ canSign() {
221
+ return true;
222
+ }
223
+ /**
224
+ * Signs transaction.
225
+ *
226
+ * @param {KeyPair} keyPair Signer keys.
227
+ */
228
+ async sign(keyPair) {
229
+ // Convert to array and build signers list
230
+ const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
231
+ const signers = [];
232
+ for (const kp of keyPairs) {
233
+ const keys = kp.getKeys(true);
234
+ if (!keys.prv) {
235
+ throw new sdk_core_1.SigningError('Missing private key');
236
+ }
237
+ signers.push({ publicKey: new web3_js_1.PublicKey(keys.pub), secretKey: keys.prv });
238
+ }
239
+ if (this._versionedTransaction) {
240
+ if (!this._versionedTransaction.message.recentBlockhash) {
241
+ throw new sdk_core_1.SigningError('Nonce is required before signing');
242
+ }
243
+ this._versionedTransaction.sign(signers);
244
+ return;
245
+ }
246
+ if (!this._solTransaction || !this._solTransaction.recentBlockhash) {
247
+ throw new sdk_core_1.SigningError('Nonce is required before signing');
248
+ }
249
+ if (!this._solTransaction || !this._solTransaction.feePayer) {
250
+ throw new sdk_core_1.SigningError('feePayer is required before signing');
251
+ }
252
+ this._solTransaction.partialSign(...signers);
253
+ }
254
+ /** @inheritdoc */
255
+ toBroadcastFormat() {
256
+ if (this._v1TransactionBytes) {
257
+ // v1 wire format is message-first with signatures appended (no length prefix)
258
+ return Buffer.from(this._v1TransactionBytes).toString('base64');
259
+ }
260
+ if (this._versionedTransaction) {
261
+ // VersionedTransaction.serialize() doesn't need requireAllSignatures parameter
262
+ // It automatically handles whatever signatures are present
263
+ return Buffer.from(this._versionedTransaction.serialize()).toString('base64');
264
+ }
265
+ if (!this._solTransaction) {
266
+ throw new sdk_core_1.ParseTransactionError('Empty transaction');
267
+ }
268
+ // The signatures can have null signatures (which means they are required but yet unsigned)
269
+ // In order to be able to serializer the txs, we have to change the requireAllSignatures based
270
+ // on if the TX is fully signed or not
271
+ const requireAllSignatures = (0, utils_1.requiresAllSignatures)(this._solTransaction.signatures);
272
+ // Based on the recomendation encoding found here https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
273
+ // We use base64 encoding
274
+ return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
275
+ }
276
+ /**
277
+ * Sets this transaction payload
278
+ *
279
+ * @param rawTransaction
280
+ */
281
+ fromRawTransaction(rawTransaction) {
282
+ try {
283
+ (0, utils_1.isValidRawTransaction)(rawTransaction);
284
+ this._solTransaction = web3_js_1.Transaction.from(Buffer.from(rawTransaction, 'base64'));
285
+ if (this._solTransaction.signature && this._solTransaction.signature !== null) {
286
+ this._id = bs58_1.default.encode(this._solTransaction.signature);
287
+ }
288
+ const transactionType = (0, utils_1.getTransactionType)(this._solTransaction);
289
+ switch (transactionType) {
290
+ case sdk_core_1.TransactionType.WalletInitialization:
291
+ this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
292
+ break;
293
+ case sdk_core_1.TransactionType.Send:
294
+ this.setTransactionType(sdk_core_1.TransactionType.Send);
295
+ break;
296
+ case sdk_core_1.TransactionType.StakingActivate:
297
+ this.setTransactionType(sdk_core_1.TransactionType.StakingActivate);
298
+ break;
299
+ case sdk_core_1.TransactionType.StakingDeactivate:
300
+ this.setTransactionType(sdk_core_1.TransactionType.StakingDeactivate);
301
+ break;
302
+ case sdk_core_1.TransactionType.StakingWithdraw:
303
+ this.setTransactionType(sdk_core_1.TransactionType.StakingWithdraw);
304
+ break;
305
+ case sdk_core_1.TransactionType.AssociatedTokenAccountInitialization:
306
+ this.setTransactionType(sdk_core_1.TransactionType.AssociatedTokenAccountInitialization);
307
+ break;
308
+ case sdk_core_1.TransactionType.CloseAssociatedTokenAccount:
309
+ this.setTransactionType(sdk_core_1.TransactionType.CloseAssociatedTokenAccount);
310
+ break;
311
+ case sdk_core_1.TransactionType.StakingAuthorize:
312
+ this.setTransactionType(sdk_core_1.TransactionType.StakingAuthorize);
313
+ break;
314
+ case sdk_core_1.TransactionType.StakingAuthorizeRaw:
315
+ this.setTransactionType(sdk_core_1.TransactionType.StakingAuthorizeRaw);
316
+ break;
317
+ case sdk_core_1.TransactionType.StakingDelegate:
318
+ this.setTransactionType(sdk_core_1.TransactionType.StakingDelegate);
319
+ break;
320
+ case sdk_core_1.TransactionType.CustomTx:
321
+ this.setTransactionType(sdk_core_1.TransactionType.CustomTx);
322
+ break;
323
+ case sdk_core_1.TransactionType.ConfidentialTransfer:
324
+ this.setTransactionType(sdk_core_1.TransactionType.ConfidentialTransfer);
325
+ break;
326
+ }
327
+ if (transactionType !== sdk_core_1.TransactionType.StakingAuthorizeRaw) {
328
+ this.loadInputsAndOutputs();
329
+ }
330
+ }
331
+ catch (e) {
332
+ throw e;
333
+ }
334
+ }
335
+ /** @inheritdoc */
336
+ toJson() {
337
+ if (!this._solTransaction) {
338
+ throw new sdk_core_1.ParseTransactionError('Empty transaction');
339
+ }
340
+ let durableNonce;
341
+ if (this._solTransaction.nonceInfo) {
342
+ const nonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
343
+ durableNonce = {
344
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
345
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
346
+ };
347
+ }
348
+ const instructionData = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
349
+ if (this._type) {
350
+ if (!durableNonce &&
351
+ instructionData.length > 1 &&
352
+ instructionData[0].type === constants_1.InstructionBuilderTypes.NonceAdvance) {
353
+ durableNonce = instructionData[0].params;
354
+ }
355
+ }
356
+ const result = {
357
+ id: this._solTransaction.signature ? this.id : undefined,
358
+ feePayer: this._solTransaction.feePayer?.toString(),
359
+ lamportsPerSignature: this.lamportsPerSignature,
360
+ nonce: this.getNonce(),
361
+ durableNonce: durableNonce,
362
+ numSignatures: this.signature.length,
363
+ instructionsData: instructionData,
364
+ };
365
+ return result;
366
+ }
367
+ /**
368
+ * Get the nonce from the Solana Transaction
369
+ * Throws if not set
370
+ */
371
+ getNonce() {
372
+ if (this._solTransaction.recentBlockhash) {
373
+ return this._solTransaction.recentBlockhash;
374
+ }
375
+ else if (this._solTransaction.nonceInfo) {
376
+ return this._solTransaction.nonceInfo.nonce;
377
+ }
378
+ else {
379
+ throw new sdk_core_1.InvalidTransactionError('Nonce is not set');
380
+ }
381
+ }
382
+ /**
383
+ * Load the input and output data on this transaction.
384
+ */
385
+ loadInputsAndOutputs() {
386
+ if (!this._solTransaction || this._solTransaction.instructions?.length === 0) {
387
+ return;
388
+ }
389
+ const outputs = [];
390
+ const inputs = [];
391
+ const instructionParams = (0, instructionParamsFactory_1.instructionParamsFactory)(this.type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
392
+ for (const instruction of instructionParams) {
393
+ switch (instruction.type) {
394
+ case constants_1.InstructionBuilderTypes.CreateNonceAccount:
395
+ inputs.push({
396
+ address: instruction.params.fromAddress,
397
+ value: instruction.params.amount,
398
+ coin: this._coinConfig.name,
399
+ });
400
+ break;
401
+ case constants_1.InstructionBuilderTypes.Transfer:
402
+ inputs.push({
403
+ address: instruction.params.fromAddress,
404
+ value: instruction.params.amount,
405
+ coin: this._coinConfig.name,
406
+ });
407
+ outputs.push({
408
+ address: instruction.params.toAddress,
409
+ value: instruction.params.amount,
410
+ coin: this._coinConfig.name,
411
+ });
412
+ break;
413
+ case constants_1.InstructionBuilderTypes.TokenTransfer:
414
+ inputs.push({
415
+ address: instruction.params.fromAddress,
416
+ value: instruction.params.amount,
417
+ coin: instruction.params.tokenName,
418
+ });
419
+ outputs.push({
420
+ address: instruction.params.toAddress,
421
+ value: instruction.params.amount,
422
+ coin: instruction.params.tokenName,
423
+ });
424
+ break;
425
+ case constants_1.InstructionBuilderTypes.StakingActivate:
426
+ inputs.push({
427
+ address: instruction.params.fromAddress,
428
+ value: instruction.params.amount,
429
+ coin: this._coinConfig.name,
430
+ });
431
+ if (instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
432
+ outputs.push({
433
+ address: instruction.params.stakingAddress,
434
+ value: instruction.params.amount,
435
+ coin: this._coinConfig.name,
436
+ });
437
+ }
438
+ break;
439
+ case constants_1.InstructionBuilderTypes.StakingDeactivate:
440
+ if (instruction.params.amount &&
441
+ instruction.params.unstakingAddress &&
442
+ instruction.params.stakingType !== public_types_1.SolStakingTypeEnum.JITO) {
443
+ inputs.push({
444
+ address: instruction.params.stakingAddress,
445
+ value: instruction.params.amount,
446
+ coin: this._coinConfig.name,
447
+ });
448
+ outputs.push({
449
+ address: instruction.params.unstakingAddress,
450
+ value: instruction.params.amount,
451
+ coin: this._coinConfig.name,
452
+ });
453
+ }
454
+ break;
455
+ case constants_1.InstructionBuilderTypes.StakingWithdraw:
456
+ inputs.push({
457
+ address: instruction.params.stakingAddress,
458
+ value: instruction.params.amount,
459
+ coin: this._coinConfig.name,
460
+ });
461
+ outputs.push({
462
+ address: instruction.params.fromAddress,
463
+ value: instruction.params.amount,
464
+ coin: this._coinConfig.name,
465
+ });
466
+ break;
467
+ case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
468
+ break;
469
+ case constants_1.InstructionBuilderTypes.CloseAssociatedTokenAccount:
470
+ break;
471
+ case constants_1.InstructionBuilderTypes.StakingAuthorize:
472
+ break;
473
+ case constants_1.InstructionBuilderTypes.StakingDelegate:
474
+ break;
475
+ case constants_1.InstructionBuilderTypes.SetComputeUnitLimit:
476
+ break;
477
+ case constants_1.InstructionBuilderTypes.SetPriorityFee:
478
+ break;
479
+ case constants_1.InstructionBuilderTypes.CustomInstruction:
480
+ break;
481
+ }
482
+ }
483
+ this._outputs = outputs;
484
+ this._inputs = inputs;
485
+ }
486
+ /** @inheritDoc */
487
+ explainTransaction() {
488
+ // Testnet uses WASM-based parsing (no @solana/web3.js dependency).
489
+ // This validates the WASM path against production traffic before
490
+ // replacing the legacy implementation for all networks.
491
+ if (this._coinConfig.name === 'tsol') {
492
+ // explainTransaction should work on unsigned/partially-signed transactions
493
+ // (e.g., during parseTransaction round-trips where null signatures become
494
+ // zero-filled buffers). Use serialize without signature validation since
495
+ // we only need to read the transaction, not broadcast it.
496
+ const txBase64 = Buffer.from(this._solTransaction.serialize({ verifySignatures: false, requireAllSignatures: false })).toString('base64');
497
+ return (0, _1.explainSolTransaction)({
498
+ txBase64,
499
+ feeInfo: this._lamportsPerSignature ? { fee: this._lamportsPerSignature.toString() } : undefined,
500
+ tokenAccountRentExemptAmount: this._tokenAccountRentExemptAmount,
501
+ coinName: this._coinConfig.name,
502
+ });
503
+ }
504
+ if ((0, utils_1.validateRawMsgInstruction)(this._solTransaction.instructions)) {
505
+ return this.explainRawMsgAuthorizeTransaction();
506
+ }
507
+ const decodedInstructions = (0, instructionParamsFactory_1.instructionParamsFactory)(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
508
+ let memo = undefined;
509
+ let durableNonce = undefined;
510
+ let outputAmount = new bignumber_js_1.default(0);
511
+ const outputs = [];
512
+ // Create a separate array for token enablements
513
+ const tokenEnablements = [];
514
+ for (const instruction of decodedInstructions) {
515
+ switch (instruction.type) {
516
+ case constants_1.InstructionBuilderTypes.NonceAdvance:
517
+ durableNonce = instruction.params;
518
+ break;
519
+ case constants_1.InstructionBuilderTypes.Memo:
520
+ memo = instruction.params.memo;
521
+ break;
522
+ case constants_1.InstructionBuilderTypes.Transfer:
523
+ const transferInstruction = instruction;
524
+ outputs.push({
525
+ address: transferInstruction.params.toAddress,
526
+ amount: transferInstruction.params.amount,
527
+ });
528
+ outputAmount = outputAmount.plus(transferInstruction.params.amount);
529
+ break;
530
+ case constants_1.InstructionBuilderTypes.TokenTransfer:
531
+ const tokenTransferInstruction = instruction;
532
+ outputs.push({
533
+ address: tokenTransferInstruction.params.toAddress,
534
+ amount: tokenTransferInstruction.params.amount,
535
+ tokenName: tokenTransferInstruction.params.tokenName,
536
+ });
537
+ break;
538
+ case constants_1.InstructionBuilderTypes.CreateNonceAccount:
539
+ const createInstruction = instruction;
540
+ outputs.push({
541
+ address: createInstruction.params.nonceAddress,
542
+ amount: createInstruction.params.amount,
543
+ });
544
+ outputAmount = outputAmount.plus(createInstruction.params.amount);
545
+ break;
546
+ case constants_1.InstructionBuilderTypes.StakingActivate:
547
+ const stakingActivateInstruction = instruction;
548
+ outputs.push({
549
+ address: stakingActivateInstruction.params.stakingAddress,
550
+ amount: stakingActivateInstruction.params.amount,
551
+ });
552
+ outputAmount = outputAmount.plus(stakingActivateInstruction.params.amount);
553
+ break;
554
+ case constants_1.InstructionBuilderTypes.StakingWithdraw:
555
+ const stakingWithdrawInstruction = instruction;
556
+ outputs.push({
557
+ address: stakingWithdrawInstruction.params.fromAddress,
558
+ amount: stakingWithdrawInstruction.params.amount,
559
+ });
560
+ outputAmount = outputAmount.plus(stakingWithdrawInstruction.params.amount);
561
+ break;
562
+ case constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount:
563
+ // Process token enablement instructions and collect them in the tokenEnablements array
564
+ const ataInit = instruction;
565
+ tokenEnablements.push({
566
+ address: ataInit.params.ataAddress,
567
+ tokenName: ataInit.params.tokenName,
568
+ tokenAddress: ataInit.params.mintAddress,
569
+ });
570
+ break;
571
+ case constants_1.InstructionBuilderTypes.CustomInstruction:
572
+ // Custom instructions are arbitrary and cannot be explained
573
+ break;
574
+ default:
575
+ continue;
576
+ }
577
+ // After deserializing a transaction, durable nonce details are populated in the nonceInfo field
578
+ if (!durableNonce && this._solTransaction.nonceInfo) {
579
+ const nonceAdvanceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
580
+ durableNonce = {
581
+ authWalletAddress: nonceAdvanceInstruction.authorizedPubkey.toString(),
582
+ walletNonceAddress: nonceAdvanceInstruction.noncePubkey.toString(),
583
+ };
584
+ }
585
+ }
586
+ return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce, tokenEnablements);
587
+ }
588
+ calculateFee() {
589
+ if (this.lamportsPerSignature || this.tokenAccountRentExemptAmount) {
590
+ const signatureFees = this.lamportsPerSignature
591
+ ? new bignumber_js_1.default(this.lamportsPerSignature).multipliedBy(this.numberOfRequiredSignatures).toFixed(0)
592
+ : 0;
593
+ const rentFees = this.tokenAccountRentExemptAmount
594
+ ? new bignumber_js_1.default(this.tokenAccountRentExemptAmount).multipliedBy(this.numberOfATACreationInstructions).toFixed(0)
595
+ : 0;
596
+ return new bignumber_js_1.default(signatureFees).plus(rentFees).toFixed(0);
597
+ }
598
+ return constants_1.UNAVAILABLE_TEXT;
599
+ }
600
+ getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined, tokenEnablements = []) {
601
+ const feeString = this.calculateFee();
602
+ // Create displayOrder with tokenEnablements always included
603
+ const displayOrder = [
604
+ 'id',
605
+ 'type',
606
+ 'blockhash',
607
+ 'durableNonce',
608
+ 'outputAmount',
609
+ 'changeAmount',
610
+ 'outputs',
611
+ 'changeOutputs',
612
+ 'tokenEnablements',
613
+ 'fee',
614
+ 'memo',
615
+ ];
616
+ // Create the base explanation object with tokenEnablements always included
617
+ const explanation = {
618
+ displayOrder,
619
+ id: this.id,
620
+ type: sdk_core_1.TransactionType[this.type].toString(),
621
+ changeOutputs: [],
622
+ changeAmount: '0',
623
+ outputAmount: outputAmount.toFixed(0),
624
+ outputs: outputs,
625
+ fee: {
626
+ fee: feeString,
627
+ feeRate: this.lamportsPerSignature,
628
+ },
629
+ memo: memo,
630
+ blockhash: this.getNonce(),
631
+ durableNonce: durableNonce,
632
+ tokenEnablements: tokenEnablements,
633
+ };
634
+ return explanation;
635
+ }
636
+ explainRawMsgAuthorizeTransaction() {
637
+ const { instructions } = this._solTransaction;
638
+ const nonceInstruction = web3_js_1.SystemInstruction.decodeNonceAdvance(instructions[0]);
639
+ const durableNonce = {
640
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
641
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
642
+ };
643
+ const data = instructions[1].data.toString('hex');
644
+ const stakingAuthorizeParams = data === constants_1.validInstructionData
645
+ ? {
646
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
647
+ oldWithdrawAddress: instructions[1].keys[2].pubkey.toString(),
648
+ newWithdrawAddress: instructions[1].keys[3].pubkey.toString(),
649
+ custodianAddress: instructions[1].keys[4].pubkey.toString(),
650
+ }
651
+ : {
652
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
653
+ oldWithdrawAddress: '',
654
+ newWithdrawAddress: '',
655
+ oldStakingAuthorityAddress: instructions[1].keys[2].pubkey.toString(),
656
+ newStakingAuthorityAddress: instructions[1].keys[3].pubkey.toString(),
657
+ };
658
+ const feeString = this.calculateFee();
659
+ return {
660
+ displayOrder: [
661
+ 'id',
662
+ 'type',
663
+ 'blockhash',
664
+ 'durableNonce',
665
+ 'outputAmount',
666
+ 'changeAmount',
667
+ 'outputs',
668
+ 'changeOutputs',
669
+ 'tokenEnablements',
670
+ 'fee',
671
+ 'memo',
672
+ ],
673
+ id: this.id,
674
+ type: sdk_core_1.TransactionType[this.type].toString(),
675
+ changeOutputs: [],
676
+ changeAmount: '0',
677
+ outputAmount: 0,
678
+ outputs: [],
679
+ fee: {
680
+ fee: feeString,
681
+ feeRate: this.lamportsPerSignature,
682
+ },
683
+ blockhash: this.getNonce(),
684
+ durableNonce: durableNonce,
685
+ stakingAuthorize: stakingAuthorizeParams,
686
+ tokenEnablements: [], // Always include tokenEnablements as an empty array for consistency
687
+ };
688
+ }
689
+ }
690
+ exports.Transaction = Transaction;
691
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQVU4QjtBQUU5Qiw2Q0FPeUI7QUFDekIsZ0VBQXFDO0FBQ3JDLGdEQUEwQjtBQUMxQix3QkFBbUQ7QUFDbkQsMkNBS3FCO0FBaUJyQix5RUFBc0U7QUFDdEUsbUNBTWlCO0FBQ2pCLHNEQUF5RDtBQUV6RCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVk5QyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQVJYLHNCQUFpQixHQUF3QixFQUFFLENBQUM7UUFDOUMsOEJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBUTFDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLGNBQWMsQ0FBQyxFQUFrQjtRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBWSwwQkFBMEI7UUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztJQUM1RSxDQUFDO0lBRUQsSUFBWSwrQkFBK0I7UUFDekMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQzdDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFBLDBCQUFrQixFQUFDLFdBQVcsQ0FBQyxLQUFLLHFDQUF5QixDQUFDLGdDQUFnQyxDQUNoSCxDQUFDLE1BQU0sQ0FBQztJQUNYLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsSUFBSSxlQUFlO1FBQ2pCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFB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QUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDckUsMEJBQTBCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2FBQ3RFLENBQUM7UUFDUixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEMsT0FBTztZQUNMLFlBQVksRUFBRTtnQkFDWixJQUFJO2dCQUNKLE1BQU07Z0JBQ04sV0FBVztnQkFDWCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2QsY0FBYztnQkFDZCxTQUFTO2dCQUNULGVBQWU7Z0JBQ2Ysa0JBQWtCO2dCQUNsQixLQUFLO2dCQUNMLE1BQU07YUFDUDtZQUNELEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDM0MsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLEdBQUcsRUFBRTtnQkFDSCxHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNuQztZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzFCLFlBQVksRUFBRSxZQUFZO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsb0VBQW9FO1NBQzNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFud0JELGtDQW13QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQdWJsaWNLZXkgYXMgQmFzZVB1YmxpY0tleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIElUb2tlbkVuYWJsZW1lbnQsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCbG9ja2hhc2gsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmVyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IGV4cGxhaW5Tb2xUcmFuc2FjdGlvbiwgS2V5UGFpciB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsXG4gIFVOQVZBSUxBQkxFX1RFWFQsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBEdXJhYmxlTm9uY2VQYXJhbXMsXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyLFxuICBUeERhdGEsXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgV2FsbGV0SW5pdCxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkgfSBmcm9tICcuL2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeSc7XG5pbXBvcnQge1xuICBnZXRJbnN0cnVjdGlvblR5cGUsXG4gIGdldFRyYW5zYWN0aW9uVHlwZSxcbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uLFxuICByZXF1aXJlc0FsbFNpZ25hdHVyZXMsXG4gIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfc29sVHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX2luc3RydWN0aW9uc0RhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZlcnNpb25lZFRyYW5zYWN0aW9uOiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3YxVHJhbnNhY3Rpb25CeXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdjFNZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHNvbFRyYW5zYWN0aW9uKCk6IFNvbFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc29sVHJhbnNhY3Rpb24odHg6IFNvbFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmNvbXBpbGVNZXNzYWdlKCkuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLmZpbHRlcihcbiAgICAgIChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fdjFNZXNzYWdlQnl0ZXMpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92MU1lc3NhZ2VCeXRlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2Uuc2VyaWFsaXplKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplTWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAvLyBTb2xhbmEgdHJhbnNhY3Rpb24gSUQgPT09IGZpcnN0IHNpZ25hdHVyZTogaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjdHJhbnNhY3Rpb24taWRcbiAgICBpZiAodGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzKSB7XG4gICAgICAvLyB2MSB3aXJlIGZvcm1hdDogbWVzc2FnZUJ5dGVzIGZvbGxvd2VkIGJ5IDY0LWJ5dGUgc2lnbmF0dXJlczsgdGhlIGZpcnN0IHNpZ25hdHVyZSBpcyB0aGUgdHggaWRcbiAgICAgIGNvbnN0IG51bVJlcXVpcmVkID0gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzWzFdO1xuICAgICAgY29uc3Qgc2lnU3RhcnQgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMubGVuZ3RoIC0gbnVtUmVxdWlyZWQgKiA2NDtcbiAgICAgIGlmIChudW1SZXF1aXJlZCA+IDAgJiYgc2lnU3RhcnQgPj0gMCkge1xuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMuc2xpY2Uoc2lnU3RhcnQsIHNpZ1N0YXJ0ICsgNjQpO1xuICAgICAgICBpZiAoc2lnLnNvbWUoKGJ5dGUpID0+IGJ5dGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGJhc2U1OC5lbmNvZGUoc2lnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgY29uc3Qgc2lnID0gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlcz8uWzBdO1xuICAgICAgLy8gQ2hlY2sgaWYgc2lnbmF0dXJlIGV4aXN0cyBhbmQgaXMgbm90IGEgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIChhbGwgemVyb3MpXG4gICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChieXRlKSA9PiBieXRlICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gYmFzZTU4LmVuY29kZShzaWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBnZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBzZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUobGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBnZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50O1xuICB9XG5cbiAgc2V0IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQodG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCA9IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgLy8gSGFuZGxlIFZlcnNpb25lZFRyYW5zYWN0aW9uIHNpZ25hdHVyZXNcbiAgICAgIGZvciAoY29uc3Qgc2lnIG9mIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpIHtcbiAgICAgICAgLy8gRmlsdGVycyBvdXQgcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChiKSA9PiBiICE9PSAwKSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgdHJhbnNhY3Rpb24gc2lnbmF0dXJlc1xuICAgICAgZm9yIChjb25zdCBzb2xTaWduYXR1cmUgb2YgdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcykge1xuICAgICAgICBpZiAoc29sU2lnbmF0dXJlLnNpZ25hdHVyZSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNvbFNpZ25hdHVyZS5zaWduYXR1cmUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaWduYXR1cmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgaW5zdHJ1Y3Rpb25EYXRhLlxuICAgKlxuICAgKiBAcGFyYW0ge0luc3RydWN0aW9uUGFyYW1zW119IGluc3RydWN0aW9uRGF0YSBUaGUgaW5zdHJ1Y3Rpb24gZGF0YSB0byBiZSBzZXQuXG4gICAqL1xuICBzZXRJbnN0cnVjdGlvbnNEYXRhKGluc3RydWN0aW9uRGF0YTogSW5zdHJ1Y3Rpb25QYXJhbXNbXSk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEgPSBpbnN0cnVjdGlvbkRhdGE7XG4gIH1cblxuICBnZXQgdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU7XG4gIH1cblxuICBzZXRVc2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGEgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBpcyBhIFZlcnNpb25lZFRyYW5zYWN0aW9uXG4gICAqL1xuICBpc1ZlcnNpb25lZFRyYW5zYWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uIHx8ICEhdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIHx8ICEhdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VyaWFsaXplZCB2MSB3aXJlIHRyYW5zYWN0aW9uIGJ5dGVzIChtZXNzYWdlICsgc2lnbmF0dXJlcyksIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdjFcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXkgfCB1bmRlZmluZWR9IFRoZSB2MSB3aXJlIGJ5dGVzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0IHYxVHJhbnNhY3Rpb25CeXRlcygpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc2VyaWFsaXplZCB2MSB3aXJlIHRyYW5zYWN0aW9uIGJ5dGVzIChtZXNzYWdlICsgc2lnbmF0dXJlcylcbiAgICogQHBhcmFtIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBieXRlcyBUaGUgdjEgd2lyZSBieXRlcyB0byBzdG9yZSwgb3IgdW5kZWZpbmVkIHRvIGNsZWFyXG4gICAqL1xuICBzZXQgdjFUcmFuc2FjdGlvbkJ5dGVzKGJ5dGVzOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzID0gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzZXJpYWxpemVkIHYxIG1lc3NhZ2UgYnl0ZXMgKHdpdGhvdXQgc2lnbmF0dXJlcyksIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdjFcbiAgICogQHJldHVybnMge1VpbnQ4QXJyYXkgfCB1bmRlZmluZWR9IFRoZSB2MSBtZXNzYWdlIGJ5dGVzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0IHYxTWVzc2FnZUJ5dGVzKCk6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92MU1lc3NhZ2VCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNlcmlhbGl6ZWQgdjEgbWVzc2FnZSBieXRlcyAod2l0aG91dCBzaWduYXR1cmVzKVxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXkgfCB1bmRlZmluZWR9IGJ5dGVzIFRoZSB2MSBtZXNzYWdlIGJ5dGVzIHRvIHN0b3JlLCBvciB1bmRlZmluZWQgdG8gY2xlYXJcbiAgICovXG4gIHNldCB2MU1lc3NhZ2VCeXRlcyhieXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3YxTWVzc2FnZUJ5dGVzID0gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcmlnaW5hbCBWZXJzaW9uZWRUcmFuc2FjdGlvbiBpZiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBwYXJzZWQgZnJvbSBvbmVcbiAgICogQHJldHVybnMge1ZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkfSBUaGUgVmVyc2lvbmVkVHJhbnNhY3Rpb24gb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXQgdmVyc2lvbmVkVHJhbnNhY3Rpb24oKTogVmVyc2lvbmVkVHJhbnNhY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBidWlsdCBWZXJzaW9uZWRUcmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1ZlcnNpb25lZFRyYW5zYWN0aW9ufSB2ZXJzaW9uZWRUeCBUaGUgVmVyc2lvbmVkVHJhbnNhY3Rpb24gdG8gc2V0XG4gICAqL1xuICBzZXQgdmVyc2lvbmVkVHJhbnNhY3Rpb24odmVyc2lvbmVkVHg6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24gPSB2ZXJzaW9uZWRUeDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0b3JlZCBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGFcbiAgICogQHJldHVybnMge1ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZH0gVGhlIHN0b3JlZCBkYXRhIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKCk6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBmb3IgdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZH0gZGF0YSBUaGUgdmVyc2lvbmVkIHRyYW5zYWN0aW9uIGRhdGEgdG8gc3RvcmUsIG9yIHVuZGVmaW5lZCB0byBjbGVhclxuICAgKi9cbiAgc2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKGRhdGE6IFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSA9IGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgc2lnbmF0dXJlIHByb2R1Y2VkIGJ5IHRoZSBmZWUgcGF5ZXIgb2YgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlIGZlZSBwYXllciBpcyBhY2NvdW50IDAgb2YgdGhlIHRyYW5zYWN0aW9uIG1lc3NhZ2UsIHNvIGl0cyBzaWduYXR1cmUgYmVsb25ncyBpbiBzbG90IDAuXG4gICAqIFVzZSB0aGlzIGZvciBzaWduYXR1cmVzIHByb2R1Y2VkIGJ5IHRoZSBlbnRlcnByaXNlIGZlZSBhZGRyZXNzIGtleSAoSFNNIHNpbmdsZS1zaWcpIG9mIGFcbiAgICogc3BvbnNvcmVkIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0Jhc2VQdWJsaWNLZXl9IHB1YmxpY0tleSBUaGUgcHVibGljIGtleSBvZiB0aGUgZmVlIHBheWVyOyBtdXN0IGJlIGFjY291bnQgMCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgb2YgdGhlIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICovXG4gIGFkZEZlZVBheWVyU2lnbmF0dXJlKHB1YmxpY0tleTogQmFzZVB1YmxpY0tleSwgc2lnbmF0dXJlOiBCdWZmZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIGNvbnN0IGFjY291bnQwID0gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24ubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5c1swXT8udG9CYXNlNTgoKTtcbiAgICAgIGlmIChwdWJsaWNLZXkucHViICE9PSBhY2NvdW50MCkge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKGBGZWUgcGF5ZXIgc2lnbmF0dXJlIG11c3QgY29tZSBmcm9tIGFjY291bnQgMCBvZiB0aGUgbWVzc2FnZSwgZ290OiAke3B1YmxpY0tleS5wdWJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5hZGRTaWduYXR1cmUobmV3IFB1YmxpY0tleShwdWJsaWNLZXkucHViKSwgc2lnbmF0dXJlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIEZvciBsZWdhY3kgdHJhbnNhY3Rpb25zIEBzb2xhbmEvd2ViMy5qcyBwbGFjZXMgdGhlIGZlZSBwYXllciBmaXJzdCBpbiB0aGUgbWVzc2FnZVxuICAgICAgY29uc3QgZmVlUGF5ZXIgPSB0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcj8udG9CYXNlNTgoKTtcbiAgICAgIGlmIChwdWJsaWNLZXkucHViICE9PSBmZWVQYXllcikge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKGBGZWUgcGF5ZXIgc2lnbmF0dXJlIG11c3QgY29tZSBmcm9tIGFjY291bnQgMCBvZiB0aGUgbWVzc2FnZSwgZ290OiAke3B1YmxpY0tleS5wdWJ9YCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5hZGRTaWduYXR1cmUobmV3IFB1YmxpY0tleShwdWJsaWNLZXkucHViKSwgc2lnbmF0dXJlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdGZWUgcGF5ZXIgc2lnbmF0dXJlIHJlcXVpcmVzIGEgYnVpbHQgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgU2lnbmVyIGtleXMuXG4gICAqL1xuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXJbXSB8IEtleVBhaXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDb252ZXJ0IHRvIGFycmF5IGFuZCBidWlsZCBzaWduZXJzIGxpc3RcbiAgICBjb25zdCBrZXlQYWlycyA9IGtleVBhaXIgaW5zdGFuY2VvZiBBcnJheSA/IGtleVBhaXIgOiBba2V5UGFpcl07XG4gICAgY29uc3Qgc2lnbmVyczogU2lnbmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtwIG9mIGtleVBhaXJzKSB7XG4gICAgICBjb25zdCBrZXlzID0ga3AuZ2V0S2V5cyh0cnVlKTtcbiAgICAgIGlmICgha2V5cy5wcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgICAgc2lnbmVycy5wdXNoKHsgcHVibGljS2V5OiBuZXcgUHVibGljS2V5KGtleXMucHViKSwgc2VjcmV0S2V5OiBrZXlzLnBydiBhcyBVaW50OEFycmF5IH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgaWYgKCF0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5tZXNzYWdlLnJlY2VudEJsb2NraGFzaCkge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdOb25jZSBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbihzaWduZXJzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8ICF0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ05vbmNlIGlzIHJlcXVpcmVkIGJlZm9yZSBzaWduaW5nJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgIXRoaXMuX3NvbFRyYW5zYWN0aW9uLmZlZVBheWVyKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdmZWVQYXllciBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH1cbiAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5wYXJ0aWFsU2lnbiguLi5zaWduZXJzKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMpIHtcbiAgICAgIC8vIHYxIHdpcmUgZm9ybWF0IGlzIG1lc3NhZ2UtZmlyc3Qgd2l0aCBzaWduYXR1cmVzIGFwcGVuZGVkIChubyBsZW5ndGggcHJlZml4KVxuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgLy8gVmVyc2lvbmVkVHJhbnNhY3Rpb24uc2VyaWFsaXplKCkgZG9lc24ndCBuZWVkIHJlcXVpcmVBbGxTaWduYXR1cmVzIHBhcmFtZXRlclxuICAgICAgLy8gSXQgYXV0b21hdGljYWxseSBoYW5kbGVzIHdoYXRldmVyIHNpZ25hdHVyZXMgYXJlIHByZXNlbnRcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIC8vIFRoZSBzaWduYXR1cmVzIGNhbiBoYXZlIG51bGwgc2lnbmF0dXJlcyAod2hpY2ggbWVhbnMgdGhleSBhcmUgcmVxdWlyZWQgYnV0IHlldCB1bnNpZ25lZClcbiAgICAvLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHNlcmlhbGl6ZXIgdGhlIHR4cywgd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIHJlcXVpcmVBbGxTaWduYXR1cmVzIGJhc2VkXG4gICAgLy8gb24gaWYgdGhlIFRYIGlzIGZ1bGx5IHNpZ25lZCBvciBub3RcbiAgICBjb25zdCByZXF1aXJlQWxsU2lnbmF0dXJlcyA9IHJlcXVpcmVzQWxsU2lnbmF0dXJlcyh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmVzKTtcbiAgICAvLyBCYXNlZCBvbiB0aGUgcmVjb21lbmRhdGlvbiBlbmNvZGluZyBmb3VuZCBoZXJlIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2RldmVsb3BpbmcvY2xpZW50cy9qc29ucnBjLWFwaSNzZW5kdHJhbnNhY3Rpb25cbiAgICAvLyBXZSB1c2UgYmFzZTY0IGVuY29kaW5nXG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7IHJlcXVpcmVBbGxTaWduYXR1cmVzIH0pLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdHJhbnNhY3Rpb24gcGF5bG9hZFxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb25cbiAgICovXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbiA9IFNvbFRyYW5zYWN0aW9uLmZyb20oQnVmZmVyLmZyb20ocmF3VHJhbnNhY3Rpb24sICdiYXNlNjQnKSk7XG4gICAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlICYmIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9pZCA9IGJhc2U1OC5lbmNvZGUodGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uVHlwZSA9IGdldFRyYW5zYWN0aW9uVHlwZSh0aGlzLl9zb2xUcmFuc2FjdGlvbik7XG4gICAgICBzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5XYWxsZXRJbml0aWFsaXphdGlvbjpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQXNzb2NpYXRlZFRva2VuQWNjb3VudEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlbGVnYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ3VzdG9tVHg6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ29uZmlkZW50aWFsVHJhbnNmZXI6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2FjdGlvblR5cGUgIT09IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQXV0aG9yaXplUmF3KSB7XG4gICAgICAgIHRoaXMubG9hZElucHV0c0FuZE91dHB1dHMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogVHhEYXRhIHtcbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGxldCBkdXJhYmxlTm9uY2U6IER1cmFibGVOb25jZVBhcmFtcyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICBjb25zdCBub25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uKTtcbiAgICAgIGR1cmFibGVOb25jZSA9IHtcbiAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGluc3RydWN0aW9uRGF0YSA9IGluc3RydWN0aW9uUGFyYW1zRmFjdG9yeShcbiAgICAgIHRoaXMuX3R5cGUsXG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMsXG4gICAgICB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhLFxuICAgICAgdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lXG4gICAgKTtcbiAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICAhZHVyYWJsZU5vbmNlICYmXG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5sZW5ndGggPiAxICYmXG4gICAgICAgIGluc3RydWN0aW9uRGF0YVswXS50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2VcbiAgICAgICkge1xuICAgICAgICBkdXJhYmxlTm9uY2UgPSBpbnN0cnVjdGlvbkRhdGFbMF0ucGFyYW1zO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IFR4RGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgPyB0aGlzLmlkIDogdW5kZWZpbmVkLFxuICAgICAgZmVlUGF5ZXI6IHRoaXMuX3NvbFRyYW5zYWN0aW9uLmZlZVBheWVyPy50b1N0cmluZygpLFxuICAgICAgbGFtcG9ydHNQZXJTaWduYXR1cmU6IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUsXG4gICAgICBub25jZTogdGhpcy5nZXROb25jZSgpLFxuICAgICAgZHVyYWJsZU5vbmNlOiBkdXJhYmxlTm9uY2UsXG4gICAgICBudW1TaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZS5sZW5ndGgsXG4gICAgICBpbnN0cnVjdGlvbnNEYXRhOiBpbnN0cnVjdGlvbkRhdGEsXG4gICAgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbm9uY2UgZnJvbSB0aGUgU29sYW5hIFRyYW5zYWN0aW9uXG4gICAqIFRocm93cyBpZiBub3Qgc2V0XG4gICAqL1xuICBwcml2YXRlIGdldE5vbmNlKCk6IEJsb2NraGFzaCB7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBpcyBub3Qgc2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5wdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25QYXJhbXMgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLnR5cGUsXG4gICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5pbnN0cnVjdGlvbnMsXG4gICAgICB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhLFxuICAgICAgdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25QYXJhbXMpIHtcbiAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudDpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5UcmFuc2ZlcjpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXI6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMudG9BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdUeXBlICE9PSBTb2xTdGFraW5nVHlwZUVudW0uSklUTykge1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWFjdGl2YXRlOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQgJiZcbiAgICAgICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzICYmXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ1R5cGUgIT09IFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnVuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdEZWxlZ2F0ZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldFByaW9yaXR5RmVlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9vdXRwdXRzID0gb3V0cHV0cztcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIC8vIFRlc3RuZXQgdXNlcyBXQVNNLWJhc2VkIHBhcnNpbmcgKG5vIEBzb2xhbmEvd2ViMy5qcyBkZXBlbmRlbmN5KS5cbiAgICAvLyBUaGlzIHZhbGlkYXRlcyB0aGUgV0FTTSBwYXRoIGFnYWluc3QgcHJvZHVjdGlvbiB0cmFmZmljIGJlZm9yZVxuICAgIC8vIHJlcGxhY2luZyB0aGUgbGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBhbGwgbmV0d29ya3MuXG4gICAgaWYgKHRoaXMuX2NvaW5Db25maWcubmFtZSA9PT0gJ3Rzb2wnKSB7XG4gICAgICAvLyBleHBsYWluVHJhbnNhY3Rpb24gc2hvdWxkIHdvcmsgb24gdW5zaWduZWQvcGFydGlhbGx5LXNpZ25lZCB0cmFuc2FjdGlvbnNcbiAgICAgIC8vIChlLmcuLCBkdXJpbmcgcGFyc2VUcmFuc2FjdGlvbiByb3VuZC10cmlwcyB3aGVyZSBudWxsIHNpZ25hdHVyZXMgYmVjb21lXG4gICAgICAvLyB6ZXJvLWZpbGxlZCBidWZmZXJzKS4gVXNlIHNlcmlhbGl6ZSB3aXRob3V0IHNpZ25hdHVyZSB2YWxpZGF0aW9uIHNpbmNlXG4gICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gcmVhZCB0aGUgdHJhbnNhY3Rpb24sIG5vdCBicm9hZGNhc3QgaXQuXG4gICAgICBjb25zdCB0eEJhc2U2NCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zZXJpYWxpemUoeyB2ZXJpZnlTaWduYXR1cmVzOiBmYWxzZSwgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlIH0pXG4gICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIHJldHVybiBleHBsYWluU29sVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEJhc2U2NCxcbiAgICAgICAgZmVlSW5mbzogdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmUgPyB7IGZlZTogdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmUudG9TdHJpbmcoKSB9IDogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50LFxuICAgICAgICBjb2luTmFtZTogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24odGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblJhd01zZ0F1dGhvcml6ZVRyYW5zYWN0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IGRlY29kZWRJbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLl90eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG5cbiAgICBsZXQgbWVtbzogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBkdXJhYmxlTm9uY2U6IER1cmFibGVOb25jZVBhcmFtcyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGxldCBvdXRwdXRBbW91bnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcbiAgICAvLyBDcmVhdGUgYSBzZXBhcmF0ZSBhcnJheSBmb3IgdG9rZW4gZW5hYmxlbWVudHNcbiAgICBjb25zdCB0b2tlbkVuYWJsZW1lbnRzOiBJVG9rZW5FbmFibGVtZW50W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgZGVjb2RlZEluc3RydWN0aW9ucykge1xuICAgICAgc3dpdGNoIChpbnN0cnVjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlOlxuICAgICAgICAgIGR1cmFibGVOb25jZSA9IChpbnN0cnVjdGlvbiBhcyBOb25jZSkucGFyYW1zO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW86XG4gICAgICAgICAgbWVtbyA9IChpbnN0cnVjdGlvbiBhcyBNZW1vKS5wYXJhbXMubWVtbztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5UcmFuc2ZlcjpcbiAgICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgVHJhbnNmZXI7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgICBjb25zdCB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBUb2tlblRyYW5zZmVyO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZU5vbmNlQWNjb3VudDpcbiAgICAgICAgICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFdhbGxldEluaXQ7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5ub25jZUFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoY3JlYXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlOlxuICAgICAgICAgIGNvbnN0IHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgU3Rha2luZ0FjdGl2YXRlO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIGNvbnN0IHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgU3Rha2luZ1dpdGhkcmF3O1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMoc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICAvLyBQcm9jZXNzIHRva2VuIGVuYWJsZW1lbnQgaW5zdHJ1Y3Rpb25zIGFuZCBjb2xsZWN0IHRoZW0gaW4gdGhlIHRva2VuRW5hYmxlbWVudHMgYXJyYXlcbiAgICAgICAgICBjb25zdCBhdGFJbml0ID0gaW5zdHJ1Y3Rpb24gYXMgQXRhSW5pdDtcbiAgICAgICAgICB0b2tlbkVuYWJsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogYXRhSW5pdC5wYXJhbXMuYXRhQWRkcmVzcyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogYXRhSW5pdC5wYXJhbXMudG9rZW5OYW1lLFxuICAgICAgICAgICAgdG9rZW5BZGRyZXNzOiBhdGFJbml0LnBhcmFtcy5taW50QWRkcmVzcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbjpcbiAgICAgICAgICAvLyBDdXN0b20gaW5zdHJ1Y3Rpb25zIGFyZSBhcmJpdHJhcnkgYW5kIGNhbm5vdCBiZSBleHBsYWluZWRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgZGVzZXJpYWxpemluZyBhIHRyYW5zYWN0aW9uLCBkdXJhYmxlIG5vbmNlIGRldGFpbHMgYXJlIHBvcHVsYXRlZCBpbiB0aGUgbm9uY2VJbmZvIGZpZWxkXG4gICAgICBpZiAoIWR1cmFibGVOb25jZSAmJiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgICAgY29uc3Qgbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoXG4gICAgICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvLm5vbmNlSW5zdHJ1Y3Rpb25cbiAgICAgICAgKTtcbiAgICAgICAgZHVyYWJsZU5vbmNlID0ge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUFkdmFuY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUFkdmFuY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEV4cGxhaW5lZFRyYW5zYWN0aW9uKG91dHB1dEFtb3VudCwgb3V0cHV0cywgbWVtbywgZHVyYWJsZU5vbmNlLCB0b2tlbkVuYWJsZW1lbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlRmVlKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUgfHwgdGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50KSB7XG4gICAgICBjb25zdCBzaWduYXR1cmVGZWVzID0gdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZVxuICAgICAgICA/IG5ldyBCaWdOdW1iZXIodGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSkubXVsdGlwbGllZEJ5KHRoaXMubnVtYmVyT2ZSZXF1aXJlZFNpZ25hdHVyZXMpLnRvRml4ZWQoMClcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgcmVudEZlZXMgPSB0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnRcbiAgICAgICAgPyBuZXcgQmlnTnVtYmVyKHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCkubXVsdGlwbGllZEJ5KHRoaXMubnVtYmVyT2ZBVEFDcmVhdGlvbkluc3RydWN0aW9ucykudG9GaXhlZCgwKVxuICAgICAgICA6IDA7XG4gICAgICByZXR1cm4gbmV3IEJpZ051bWJlcihzaWduYXR1cmVGZWVzKS5wbHVzKHJlbnRGZWVzKS50b0ZpeGVkKDApO1xuICAgIH1cbiAgICByZXR1cm4gVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRFeHBsYWluZWRUcmFuc2FjdGlvbihcbiAgICBvdXRwdXRBbW91bnQ6IEJpZ051bWJlcixcbiAgICBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdLFxuICAgIG1lbW86IHVuZGVmaW5lZCB8IHN0cmluZyA9IHVuZGVmaW5lZCxcbiAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCB8IER1cmFibGVOb25jZVBhcmFtcyA9IHVuZGVmaW5lZCxcbiAgICB0b2tlbkVuYWJsZW1lbnRzOiBJVG9rZW5FbmFibGVtZW50W10gPSBbXVxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBmZWVTdHJpbmcgPSB0aGlzLmNhbGN1bGF0ZUZlZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGRpc3BsYXlPcmRlciB3aXRoIHRva2VuRW5hYmxlbWVudHMgYWx3YXlzIGluY2x1ZGVkXG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gW1xuICAgICAgJ2lkJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdibG9ja2hhc2gnLFxuICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgJ291dHB1dHMnLFxuICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgJ2ZlZScsXG4gICAgICAnbWVtbycsXG4gICAgXTtcblxuICAgIC8vIENyZWF0ZSB0aGUgYmFzZSBleHBsYW5hdGlvbiBvYmplY3Qgd2l0aCB0b2tlbkVuYWJsZW1lbnRzIGFsd2F5cyBpbmNsdWRlZFxuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVbdGhpcy50eXBlXS50b1N0cmluZygpLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvRml4ZWQoMCksXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogZmVlU3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICAgIG1lbW86IG1lbW8sXG4gICAgICBibG9ja2hhc2g6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgdG9rZW5FbmFibGVtZW50czogdG9rZW5FbmFibGVtZW50cyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBsYWluUmF3TXNnQXV0aG9yaXplVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgeyBpbnN0cnVjdGlvbnMgfSA9IHRoaXMuX3NvbFRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb25zWzBdKTtcbiAgICBjb25zdCBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICB3YWxsZXROb25jZUFkZHJlc3M6IG5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9O1xuICAgIGNvbnN0IGRhdGEgPSBpbnN0cnVjdGlvbnNbMV0uZGF0YS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgc3Rha2luZ0F1dGhvcml6ZVBhcmFtczogU3Rha2luZ0F1dGhvcml6ZVBhcmFtcyA9XG4gICAgICBkYXRhID09PSB2YWxpZEluc3RydWN0aW9uRGF0YVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZFdpdGhkcmF3QWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgY3VzdG9kaWFuQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1swXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG9sZFdpdGhkcmF3QWRkcmVzczogJycsXG4gICAgICAgICAgICBuZXdXaXRoZHJhd0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgb2xkU3Rha2luZ0F1dGhvcml0eUFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3U3Rha2luZ0F1dGhvcml0eUFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzNdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH07XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICdpZCcsXG4gICAgICAgICd0eXBlJyxcbiAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICdmZWUnLFxuICAgICAgICAnbWVtbycsXG4gICAgICBdLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGVbdGhpcy50eXBlXS50b1N0cmluZygpLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgZmVlOiB7XG4gICAgICAgIGZlZTogZmVlU3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgfSxcbiAgICAgIGJsb2NraGFzaDogdGhpcy5nZXROb25jZSgpLFxuICAgICAgZHVyYWJsZU5vbmNlOiBkdXJhYmxlTm9uY2UsXG4gICAgICBzdGFraW5nQXV0aG9yaXplOiBzdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICAgICAgdG9rZW5FbmFibGVtZW50czogW10sIC8vIEFsd2F5cyBpbmNsdWRlIHRva2VuRW5hYmxlbWVudHMgYXMgYW4gZW1wdHkgYXJyYXkgZm9yIGNvbnNpc3RlbmN5XG4gICAgfTtcbiAgfVxufVxuIl19