@bitgo-beta/sdk-coin-sol 7.6.4-beta.74 → 7.6.4-beta.741

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