@bitgo-beta/sdk-coin-sol 7.6.4-beta.78 → 7.6.4-beta.781

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 (542) 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 +136 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +375 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +97 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +277 -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 +538 -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 +1284 -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 +1119 -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 +46 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +761 -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 +16 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +681 -0
  109. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +29 -0
  110. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  111. package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +36 -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 +1707 -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/ctEnablementVerify.d.ts +2 -0
  137. package/dist/cjs/test/unit/ctEnablementVerify.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/ctEnablementVerify.js +143 -0
  139. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  140. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  142. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  144. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  146. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  147. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  148. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  150. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  151. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  152. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  153. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  154. package/dist/cjs/test/unit/keyPair.js +177 -0
  155. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  156. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  157. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  159. package/dist/cjs/test/unit/register.d.ts +2 -0
  160. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/register.js +65 -0
  162. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  163. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  165. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  166. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  167. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  168. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  169. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  171. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  172. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  174. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  175. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  176. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  177. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  178. package/dist/cjs/test/unit/sol.js +5364 -0
  179. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  180. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  181. package/dist/cjs/test/unit/solIntentVersion.d.ts +2 -0
  182. package/dist/cjs/test/unit/solIntentVersion.d.ts.map +1 -0
  183. package/dist/cjs/test/unit/solIntentVersion.js +59 -0
  184. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/solToken.js +37 -0
  186. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  187. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  188. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  189. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  190. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  192. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  193. package/dist/cjs/test/unit/transaction.js +1129 -0
  194. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  195. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  196. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  198. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  199. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  201. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  204. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.js +124 -0
  207. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  208. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +922 -0
  210. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  211. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +194 -0
  213. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  214. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +168 -0
  216. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  218. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  219. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  220. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  221. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  222. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  224. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  225. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  226. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  227. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  228. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  230. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  231. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  232. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  233. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  234. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  235. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  236. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  237. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  239. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  240. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  242. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  243. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  244. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  245. package/dist/cjs/test/unit/utils.js +663 -0
  246. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  247. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  248. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  249. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  250. package/dist/esm/index.d.ts +7 -0
  251. package/dist/esm/index.js +7 -0
  252. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  253. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  254. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  255. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  256. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  257. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  258. package/dist/esm/lib/confidentialTransferBuilder.d.ts +136 -0
  259. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  260. package/dist/esm/lib/confidentialTransferBuilder.js +368 -0
  261. package/dist/esm/lib/constants.d.ts +235 -0
  262. package/dist/esm/lib/constants.d.ts.map +1 -0
  263. package/dist/esm/lib/constants.js +274 -0
  264. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  265. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  266. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  267. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  268. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  269. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  270. package/dist/esm/lib/iface.d.ts +538 -0
  271. package/dist/esm/lib/iface.d.ts.map +1 -0
  272. package/dist/esm/lib/iface.js +3 -0
  273. package/dist/esm/lib/index.d.ts +31 -0
  274. package/dist/esm/lib/index.d.ts.map +1 -0
  275. package/dist/esm/lib/index.js +31 -0
  276. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  277. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  278. package/dist/esm/lib/instructionParamsFactory.js +1276 -0
  279. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  280. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  281. package/dist/esm/lib/keyPair.d.ts +32 -0
  282. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  283. package/dist/esm/lib/keyPair.js +75 -0
  284. package/dist/esm/lib/messages/index.d.ts +2 -0
  285. package/dist/esm/lib/messages/index.js +2 -0
  286. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  287. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  288. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  289. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  290. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  291. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  292. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  293. package/dist/esm/lib/scaledUiAmount.js +108 -0
  294. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  295. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  296. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  297. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  298. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  300. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  301. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  303. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  304. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  306. package/dist/esm/lib/serialization/index.d.ts +5 -0
  307. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  308. package/dist/esm/lib/serialization/index.js +5 -0
  309. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  310. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  311. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  312. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  313. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  314. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  315. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  316. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  317. package/dist/esm/lib/solInstructionFactory.js +1113 -0
  318. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  319. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  320. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  321. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  322. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  323. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  324. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  325. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  326. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  327. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  328. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  329. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  330. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  331. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  332. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  333. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  334. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  335. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  336. package/dist/esm/lib/token2022Resolve.js +194 -0
  337. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  338. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  339. package/dist/esm/lib/tokenExtensions.js +103 -0
  340. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  341. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  342. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  343. package/dist/esm/lib/transaction.d.ts +148 -0
  344. package/dist/esm/lib/transaction.d.ts.map +1 -0
  345. package/dist/esm/lib/transaction.js +754 -0
  346. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  347. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  348. package/dist/esm/lib/transactionBuilder.js +455 -0
  349. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  350. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  351. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  352. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  353. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  354. package/dist/esm/lib/transferBuilder.js +74 -0
  355. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  356. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  357. package/dist/esm/lib/transferBuilderV2.js +245 -0
  358. package/dist/esm/lib/utils.d.ts +216 -0
  359. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  360. package/dist/esm/lib/utils.js +642 -0
  361. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +29 -0
  362. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  363. package/dist/esm/lib/v1CustomInstructionBuilder.js +32 -0
  364. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  365. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  366. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  367. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  368. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  369. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  370. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  371. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  372. package/dist/esm/register.d.ts +5 -0
  373. package/dist/esm/register.d.ts.map +1 -0
  374. package/dist/esm/register.js +24 -0
  375. package/dist/esm/sol.d.ts +351 -0
  376. package/dist/esm/sol.d.ts.map +1 -0
  377. package/dist/esm/sol.js +1666 -0
  378. package/dist/esm/solToken.d.ts +44 -0
  379. package/dist/esm/solToken.d.ts.map +1 -0
  380. package/dist/esm/solToken.js +75 -0
  381. package/dist/esm/tsol.d.ts +11 -0
  382. package/dist/esm/tsol.js +20 -0
  383. package/package.json +37 -17
  384. package/LICENSE +0 -191
  385. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  386. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  387. package/dist/src/config/token2022StaticConfig.js +0 -50
  388. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  389. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  390. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  391. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  392. package/dist/src/lib/closeAtaBuilder.js +0 -69
  393. package/dist/src/lib/constants.d.ts.map +0 -1
  394. package/dist/src/lib/constants.js +0 -171
  395. package/dist/src/lib/customInstructionBuilder.js +0 -289
  396. package/dist/src/lib/iface.d.ts +0 -244
  397. package/dist/src/lib/iface.d.ts.map +0 -1
  398. package/dist/src/lib/iface.js +0 -7
  399. package/dist/src/lib/index.d.ts.map +0 -1
  400. package/dist/src/lib/index.js +0 -77
  401. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  402. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  403. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  404. package/dist/src/lib/keyPair.d.ts.map +0 -1
  405. package/dist/src/lib/keyPair.js +0 -63
  406. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  407. package/dist/src/lib/solInstructionFactory.js +0 -572
  408. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  409. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  410. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  411. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  412. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  413. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  414. package/dist/src/lib/token2022Config.d.ts +0 -44
  415. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  416. package/dist/src/lib/token2022Config.js +0 -27
  417. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  418. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  419. package/dist/src/lib/transaction.d.ts.map +0 -1
  420. package/dist/src/lib/transaction.js +0 -595
  421. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  422. package/dist/src/lib/transactionBuilder.js +0 -380
  423. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  424. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  425. package/dist/src/lib/transferBuilder.js +0 -70
  426. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  427. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  428. package/dist/src/lib/transferBuilderV2.js +0 -210
  429. package/dist/src/lib/utils.js +0 -589
  430. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  431. package/dist/src/register.d.ts +0 -3
  432. package/dist/src/register.d.ts.map +0 -1
  433. package/dist/src/register.js +0 -15
  434. package/dist/src/sol.d.ts.map +0 -1
  435. package/dist/src/sol.js +0 -1324
  436. package/dist/src/solToken.d.ts.map +0 -1
  437. package/dist/src/solToken.js +0 -69
  438. package/dist/src/tsol.js +0 -24
  439. package/dist/test/fixtures/sol.js +0 -1433
  440. package/dist/test/resources/sol.d.ts.map +0 -1
  441. package/dist/test/resources/sol.js +0 -320
  442. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  443. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  444. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  445. package/dist/test/unit/getBuilderFactory.js +0 -10
  446. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  447. package/dist/test/unit/instructionParamsFactory.js +0 -412
  448. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  449. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  450. package/dist/test/unit/keyPair.js +0 -177
  451. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  452. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  453. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  454. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  455. package/dist/test/unit/sol.js +0 -3180
  456. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  457. package/dist/test/unit/solInstructionFactory.js +0 -454
  458. package/dist/test/unit/solToken.d.ts.map +0 -1
  459. package/dist/test/unit/solToken.js +0 -31
  460. package/dist/test/unit/transaction.d.ts.map +0 -1
  461. package/dist/test/unit/transaction.js +0 -983
  462. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  463. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  464. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  465. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  466. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  467. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  468. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  469. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  470. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  471. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  472. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  473. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  474. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  475. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  476. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  477. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  478. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  479. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  480. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  481. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  482. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  483. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  484. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  485. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  486. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  487. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  488. package/dist/test/unit/utils.js +0 -517
  489. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  490. package/dist/test/unit/versionedTransaction.js +0 -207
  491. package/dist/tsconfig.tsbuildinfo +0 -1
  492. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  493. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  494. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  496. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  497. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  498. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  499. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  500. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  501. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  502. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  503. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  504. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  505. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  506. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  507. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  523. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  524. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  525. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  526. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  527. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  528. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  529. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  530. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  531. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  532. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  533. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  534. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  535. /package/dist/{src → esm}/index.d.ts.map +0 -0
  536. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  537. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  538. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  539. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  540. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  541. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  542. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,922 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const src_1 = require("../../../src");
40
+ const should_1 = __importDefault(require("should"));
41
+ const testData = __importStar(require("../../resources/sol"));
42
+ const getBuilderFactory_1 = require("../getBuilderFactory");
43
+ describe('Solana Confidential Transfer Builder', () => {
44
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
45
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
46
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
47
+ // Test addresses (Token-2022 mint + ATAs)
48
+ const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
49
+ const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
50
+ const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
51
+ const authorityAddress = account.pub;
52
+ // Valid base58 addresses for context state accounts (any valid Solana pubkey)
53
+ const eqCtxAddress = testData.associatedTokenAccounts.accounts[0].ata;
54
+ const validityCtxAddress = testData.associatedTokenAccounts.accounts[0].pub;
55
+ const rangeCtxAddress = testData.nonceAccount.pub;
56
+ // Hex test data
57
+ const zeroBytes36 = '00'.repeat(36);
58
+ const zeroBytes64 = '00'.repeat(64);
59
+ const proofDataHex = '00'.repeat(320); // typical equality proof size
60
+ const ctBuilder = () => {
61
+ const txBuilder = factory.getConfidentialTransferBuilder();
62
+ txBuilder.nonce(recentBlockHash);
63
+ txBuilder.sender(account.pub);
64
+ return txBuilder;
65
+ };
66
+ /** Access the raw Solana Transaction from the built tx */
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const solTx = (tx) => tx.solTransaction;
69
+ describe('ConfigureAccount', () => {
70
+ it('should build a configure account instruction with correct 79-byte layout', async () => {
71
+ const builder = ctBuilder();
72
+ builder.configureAccount({
73
+ tokenAddress,
74
+ mintAddress,
75
+ authorityAddress,
76
+ elgamalPubkey: '11'.repeat(32),
77
+ decryptableZeroBalance: zeroBytes36,
78
+ maximumPendingBalanceCreditCounter: '65536',
79
+ proofInstructionOffset: 1,
80
+ });
81
+ const tx = await builder.build();
82
+ const instructions = tx.toJson().instructionsData;
83
+ instructions.should.have.length(1);
84
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
85
+ // Verify raw instruction data
86
+ const rawInstructions = solTx(tx).instructions;
87
+ rawInstructions.should.have.length(1);
88
+ const data = rawInstructions[0].data;
89
+ data.length.should.equal(79);
90
+ data[0].should.equal(27); // ConfidentialTransferExtension
91
+ data[1].should.equal(2); // ConfigureAccount
92
+ data.slice(2, 34).toString('hex').should.equal('11'.repeat(32)); // new_account_elgamal_pubkey
93
+ data.slice(34, 70).toString('hex').should.equal(zeroBytes36); // decryptable_zero_balance
94
+ data.readBigUInt64LE(70).toString().should.equal('65536'); // max pending balance credit counter
95
+ data[78].should.equal(1); // proof_instruction_offset
96
+ // Verify accounts
97
+ const keys = rawInstructions[0].keys;
98
+ keys.should.have.length(4);
99
+ keys[0].pubkey.toString().should.equal(tokenAddress);
100
+ keys[0].isWritable.should.be.true();
101
+ keys[1].pubkey.toString().should.equal(mintAddress);
102
+ keys[1].isWritable.should.be.false();
103
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111'); // instructions sysvar
104
+ keys[3].pubkey.toString().should.equal(authorityAddress);
105
+ keys[3].isSigner.should.be.true();
106
+ });
107
+ it('should use context state address when provided', async () => {
108
+ const contextStateAddress = testData.associatedTokenAccounts.accounts[0].pub;
109
+ const builder = ctBuilder();
110
+ builder.configureAccount({
111
+ tokenAddress,
112
+ mintAddress,
113
+ authorityAddress,
114
+ elgamalPubkey: '11'.repeat(32),
115
+ instructionsSysvarOrContextStateAddress: contextStateAddress,
116
+ decryptableZeroBalance: zeroBytes36,
117
+ maximumPendingBalanceCreditCounter: '65536',
118
+ proofInstructionOffset: 0,
119
+ });
120
+ const tx = await builder.build();
121
+ const keys = solTx(tx).instructions[0].keys;
122
+ keys[2].pubkey.toString().should.equal(contextStateAddress);
123
+ const data = solTx(tx).instructions[0].data;
124
+ data[78].should.equal(0); // proof_instruction_offset = 0 (context state)
125
+ });
126
+ });
127
+ describe('ApplyPendingBalance', () => {
128
+ it('should build an apply pending balance instruction with correct 46-byte layout', async () => {
129
+ const builder = ctBuilder();
130
+ builder.applyPendingBalance({
131
+ tokenAddress,
132
+ authorityAddress,
133
+ expectedPendingBalanceCreditCounter: '3',
134
+ newDecryptableAvailableBalance: zeroBytes36,
135
+ });
136
+ const tx = await builder.build();
137
+ const instructions = tx.toJson().instructionsData;
138
+ instructions.should.have.length(1);
139
+ instructions[0].type.should.equal('ApplyPendingBalance');
140
+ const rawInstructions = solTx(tx).instructions;
141
+ rawInstructions.should.have.length(1);
142
+ const data = rawInstructions[0].data;
143
+ data.length.should.equal(46);
144
+ data[0].should.equal(27); // ConfidentialTransferExtension
145
+ data[1].should.equal(8); // ApplyPendingBalance
146
+ data.readBigUInt64LE(2).toString().should.equal('3'); // expected_pending_balance_credit_counter
147
+ data.slice(10, 46).toString('hex').should.equal(zeroBytes36); // new_decryptable_available_balance
148
+ // Verify accounts: [token(writable), authority(signer)]
149
+ const keys = rawInstructions[0].keys;
150
+ keys.should.have.length(2);
151
+ keys[0].pubkey.toString().should.equal(tokenAddress);
152
+ keys[0].isWritable.should.be.true();
153
+ keys[1].pubkey.toString().should.equal(authorityAddress);
154
+ keys[1].isSigner.should.be.true();
155
+ });
156
+ });
157
+ describe('Deposit', () => {
158
+ it('should build a deposit instruction with correct 11-byte layout', async () => {
159
+ const builder = ctBuilder();
160
+ builder.confidentialDeposit({
161
+ tokenAddress,
162
+ mintAddress,
163
+ authorityAddress,
164
+ amount: '1000000',
165
+ decimals: 6,
166
+ });
167
+ const tx = await builder.build();
168
+ const instructions = tx.toJson().instructionsData;
169
+ instructions.should.have.length(1);
170
+ instructions[0].type.should.equal('ConfidentialDeposit');
171
+ const rawInstructions = solTx(tx).instructions;
172
+ rawInstructions.should.have.length(1);
173
+ const data = rawInstructions[0].data;
174
+ data.length.should.equal(11);
175
+ data[0].should.equal(27); // ConfidentialTransferExtension
176
+ data[1].should.equal(5); // Deposit
177
+ data.readBigUInt64LE(2).toString().should.equal('1000000'); // amount
178
+ data[10].should.equal(6); // decimals
179
+ // Verify accounts: [token(writable), mint, authority(signer)]
180
+ const keys = rawInstructions[0].keys;
181
+ keys.should.have.length(3);
182
+ keys[0].pubkey.toString().should.equal(tokenAddress);
183
+ keys[0].isWritable.should.be.true();
184
+ keys[1].pubkey.toString().should.equal(mintAddress);
185
+ keys[2].pubkey.toString().should.equal(authorityAddress);
186
+ keys[2].isSigner.should.be.true();
187
+ });
188
+ });
189
+ describe('Withdraw', () => {
190
+ it('should build a withdraw instruction with correct 49-byte layout and inline proofs', async () => {
191
+ const builder = ctBuilder();
192
+ builder.confidentialWithdraw({
193
+ tokenAddress,
194
+ mintAddress,
195
+ authorityAddress,
196
+ amount: '500000',
197
+ decimals: 6,
198
+ newDecryptableAvailableBalance: zeroBytes36,
199
+ equalityProofInstructionOffset: 1,
200
+ rangeProofInstructionOffset: 2,
201
+ });
202
+ const tx = await builder.build();
203
+ const instructions = tx.toJson().instructionsData;
204
+ instructions.should.have.length(1);
205
+ instructions[0].type.should.equal('ConfidentialWithdraw');
206
+ const rawInstructions = solTx(tx).instructions;
207
+ rawInstructions.should.have.length(1);
208
+ const data = rawInstructions[0].data;
209
+ data.length.should.equal(49);
210
+ data[0].should.equal(27); // ConfidentialTransferExtension
211
+ data[1].should.equal(6); // Withdraw
212
+ data.readBigUInt64LE(2).toString().should.equal('500000'); // amount
213
+ data[10].should.equal(6); // decimals
214
+ data.slice(11, 47).toString('hex').should.equal(zeroBytes36); // new_decryptable
215
+ data[47].should.equal(1); // equality proof offset
216
+ data[48].should.equal(2); // range proof offset
217
+ // Verify accounts: [token(writable), mint, sysvar, authority(signer)]
218
+ const keys = rawInstructions[0].keys;
219
+ keys.should.have.length(4);
220
+ keys[0].pubkey.toString().should.equal(tokenAddress);
221
+ keys[0].isWritable.should.be.true();
222
+ keys[1].pubkey.toString().should.equal(mintAddress);
223
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
224
+ keys[3].pubkey.toString().should.equal(authorityAddress);
225
+ keys[3].isSigner.should.be.true();
226
+ });
227
+ it('should build a withdraw instruction with context state accounts', async () => {
228
+ const builder = ctBuilder();
229
+ builder.confidentialWithdraw({
230
+ tokenAddress,
231
+ mintAddress,
232
+ authorityAddress,
233
+ equalityProofContextStateAddress: eqCtxAddress,
234
+ rangeProofContextStateAddress: rangeCtxAddress,
235
+ amount: '500000',
236
+ decimals: 6,
237
+ newDecryptableAvailableBalance: zeroBytes36,
238
+ equalityProofInstructionOffset: 0,
239
+ rangeProofInstructionOffset: 0,
240
+ });
241
+ const tx = await builder.build();
242
+ const keys = solTx(tx).instructions[0].keys;
243
+ // [token, mint, eqCtx, rgCtx, authority] — no sysvar since all proofs use context state
244
+ keys.should.have.length(5);
245
+ keys[2].pubkey.toString().should.equal(eqCtxAddress);
246
+ keys[3].pubkey.toString().should.equal(rangeCtxAddress);
247
+ keys[4].pubkey.toString().should.equal(authorityAddress);
248
+ keys[4].isSigner.should.be.true();
249
+ });
250
+ });
251
+ describe('ConfidentialTransfer', () => {
252
+ it('should build a transfer instruction with correct 169-byte layout and inline proofs', async () => {
253
+ const builder = ctBuilder();
254
+ builder.confidentialTransfer({
255
+ sourceTokenAddress: tokenAddress,
256
+ mintAddress,
257
+ destinationTokenAddress,
258
+ authorityAddress,
259
+ newSourceDecryptableAvailableBalance: zeroBytes36,
260
+ transferAmountAuditorCiphertextLo: zeroBytes64,
261
+ transferAmountAuditorCiphertextHi: zeroBytes64,
262
+ equalityProofInstructionOffset: 1,
263
+ ciphertextValidityProofInstructionOffset: 2,
264
+ rangeProofInstructionOffset: 3,
265
+ });
266
+ const tx = await builder.build();
267
+ const instructions = tx.toJson().instructionsData;
268
+ instructions.should.have.length(1);
269
+ instructions[0].type.should.equal('ConfidentialTransfer');
270
+ const rawInstructions = solTx(tx).instructions;
271
+ rawInstructions.should.have.length(1);
272
+ const data = rawInstructions[0].data;
273
+ data.length.should.equal(169);
274
+ data[0].should.equal(27); // ConfidentialTransferExtension
275
+ data[1].should.equal(7); // Transfer
276
+ data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // new_source_decryptable
277
+ data.slice(38, 102).toString('hex').should.equal(zeroBytes64); // auditor_ct_lo
278
+ data.slice(102, 166).toString('hex').should.equal(zeroBytes64); // auditor_ct_hi
279
+ data[166].should.equal(1); // equality proof offset
280
+ data[167].should.equal(2); // validity proof offset
281
+ data[168].should.equal(3); // range proof offset
282
+ // Verify accounts: [source(writable), mint, dest(writable), sysvar, authority(signer)]
283
+ const keys = rawInstructions[0].keys;
284
+ keys.should.have.length(5);
285
+ keys[0].pubkey.toString().should.equal(tokenAddress);
286
+ keys[0].isWritable.should.be.true();
287
+ keys[1].pubkey.toString().should.equal(mintAddress);
288
+ keys[2].pubkey.toString().should.equal(destinationTokenAddress);
289
+ keys[2].isWritable.should.be.true();
290
+ keys[3].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
291
+ keys[4].pubkey.toString().should.equal(authorityAddress);
292
+ keys[4].isSigner.should.be.true();
293
+ });
294
+ it('should build a transfer instruction with context state accounts', async () => {
295
+ const builder = ctBuilder();
296
+ builder.confidentialTransfer({
297
+ sourceTokenAddress: tokenAddress,
298
+ mintAddress,
299
+ destinationTokenAddress,
300
+ authorityAddress,
301
+ equalityProofContextStateAddress: eqCtxAddress,
302
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
303
+ rangeProofContextStateAddress: rangeCtxAddress,
304
+ newSourceDecryptableAvailableBalance: zeroBytes36,
305
+ transferAmountAuditorCiphertextLo: zeroBytes64,
306
+ transferAmountAuditorCiphertextHi: zeroBytes64,
307
+ equalityProofInstructionOffset: 0,
308
+ ciphertextValidityProofInstructionOffset: 0,
309
+ rangeProofInstructionOffset: 0,
310
+ });
311
+ const tx = await builder.build();
312
+ const keys = solTx(tx).instructions[0].keys;
313
+ // [source, mint, dest, eqCtx, validityCtx, rangeCtx, authority] — no sysvar
314
+ keys.should.have.length(7);
315
+ keys[3].pubkey.toString().should.equal(eqCtxAddress);
316
+ keys[4].pubkey.toString().should.equal(validityCtxAddress);
317
+ keys[5].pubkey.toString().should.equal(rangeCtxAddress);
318
+ keys[6].pubkey.toString().should.equal(authorityAddress);
319
+ keys[6].isSigner.should.be.true();
320
+ });
321
+ });
322
+ describe('VerifyPubkeyValidity', () => {
323
+ it('should build a verify pubkey validity instruction with inline proof data', async () => {
324
+ const builder = ctBuilder();
325
+ builder.verifyPubkeyValidity({ proofData: proofDataHex });
326
+ const tx = await builder.build();
327
+ const rawInstructions = solTx(tx).instructions;
328
+ rawInstructions.should.have.length(1);
329
+ const data = rawInstructions[0].data;
330
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
331
+ data.length.should.equal(1 + 320); // discriminator + proof data
332
+ data.slice(1).toString('hex').should.equal(proofDataHex);
333
+ // No accounts for inline proof
334
+ rawInstructions[0].keys.should.have.length(0);
335
+ // Verify program id (canonical on-chain id)
336
+ rawInstructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
337
+ });
338
+ it('should build with context state account (fix #3)', async () => {
339
+ const builder = ctBuilder();
340
+ builder.verifyPubkeyValidity({
341
+ contextStateAccountAddress: eqCtxAddress,
342
+ contextStateAuthorityAddress: authorityAddress,
343
+ });
344
+ const tx = await builder.build();
345
+ const rawIx = solTx(tx).instructions[0];
346
+ const data = rawIx.data;
347
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
348
+ // Context state accounts: [contextState(writable), authority]
349
+ rawIx.keys.should.have.length(2);
350
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
351
+ rawIx.keys[0].isWritable.should.be.true();
352
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
353
+ });
354
+ });
355
+ describe('VerifyEqualityProof', () => {
356
+ it('should build with inline proof data', async () => {
357
+ const builder = ctBuilder();
358
+ builder.verifyEqualityProof({ proofData: proofDataHex });
359
+ const tx = await builder.build();
360
+ const data = solTx(tx).instructions[0].data;
361
+ data[0].should.equal(3); // VerifyCiphertextCommitmentEquality discriminator
362
+ data.length.should.equal(1 + 320);
363
+ data.slice(1).toString('hex').should.equal(proofDataHex);
364
+ });
365
+ it('should build with context state offset', async () => {
366
+ const builder = ctBuilder();
367
+ builder.verifyEqualityProof({
368
+ contextStateAccountAddress: eqCtxAddress,
369
+ contextStateAuthorityAddress: authorityAddress,
370
+ offset: 0,
371
+ });
372
+ const tx = await builder.build();
373
+ const rawIx = solTx(tx).instructions[0];
374
+ const data = rawIx.data;
375
+ data[0].should.equal(3);
376
+ data.readUInt32LE(1).should.equal(0); // offset as u32
377
+ // Context state accounts: [contextState(writable), authority]
378
+ rawIx.keys.should.have.length(2);
379
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
380
+ rawIx.keys[0].isWritable.should.be.true();
381
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
382
+ });
383
+ });
384
+ describe('VerifyValidityProof', () => {
385
+ it('should build with inline proof data', async () => {
386
+ const builder = ctBuilder();
387
+ builder.verifyValidityProof({ proofData: proofDataHex });
388
+ const tx = await builder.build();
389
+ const data = solTx(tx).instructions[0].data;
390
+ data[0].should.equal(12); // VerifyBatchedGroupedCiphertext3HandlesValidity
391
+ data.length.should.equal(1 + 320);
392
+ });
393
+ });
394
+ describe('VerifyRangeProof', () => {
395
+ it('should build with inline proof data', async () => {
396
+ const builder = ctBuilder();
397
+ builder.verifyRangeProof({ proofData: '00'.repeat(1000) }); // range proof is ~1000 bytes
398
+ const tx = await builder.build();
399
+ const data = solTx(tx).instructions[0].data;
400
+ data[0].should.equal(7); // VerifyBatchedRangeProofU128
401
+ data.length.should.equal(1 + 1000);
402
+ });
403
+ });
404
+ describe('Multiple instructions (v1 tx simulation)', () => {
405
+ it('should build ApplyPendingBalance + 3 proofs + Transfer in correct order', async () => {
406
+ const builder = ctBuilder();
407
+ builder
408
+ .applyPendingBalance({
409
+ tokenAddress,
410
+ authorityAddress,
411
+ expectedPendingBalanceCreditCounter: '2',
412
+ newDecryptableAvailableBalance: zeroBytes36,
413
+ })
414
+ .verifyEqualityProof({ proofData: proofDataHex })
415
+ .verifyValidityProof({ proofData: proofDataHex })
416
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
417
+ .confidentialTransfer({
418
+ sourceTokenAddress: tokenAddress,
419
+ mintAddress,
420
+ destinationTokenAddress,
421
+ authorityAddress,
422
+ newSourceDecryptableAvailableBalance: zeroBytes36,
423
+ transferAmountAuditorCiphertextLo: zeroBytes64,
424
+ transferAmountAuditorCiphertextHi: zeroBytes64,
425
+ equalityProofInstructionOffset: 1,
426
+ ciphertextValidityProofInstructionOffset: 2,
427
+ rangeProofInstructionOffset: 3,
428
+ });
429
+ const tx = await builder.build();
430
+ const instructions = tx.toJson().instructionsData;
431
+ instructions.should.have.length(5);
432
+ instructions[0].type.should.equal('ApplyPendingBalance');
433
+ instructions[1].type.should.equal('VerifyEqualityProof');
434
+ instructions[2].type.should.equal('VerifyValidityProof');
435
+ instructions[3].type.should.equal('VerifyRangeProof');
436
+ instructions[4].type.should.equal('ConfidentialTransfer');
437
+ // Note: Cannot verify toBroadcastFormat() here because 3 proofs (320+320+1000 bytes)
438
+ // + transfer (169B) exceeds v0 tx size limit (1232B). These are v1 transactions (4132B).
439
+ // The instruction data layouts are verified individually in the tests above.
440
+ });
441
+ it('should build ConfigureAccount + VerifyPubkeyValidity', async () => {
442
+ const builder = ctBuilder();
443
+ builder
444
+ .configureAccount({
445
+ tokenAddress,
446
+ mintAddress,
447
+ authorityAddress,
448
+ elgamalPubkey: '11'.repeat(32),
449
+ decryptableZeroBalance: zeroBytes36,
450
+ maximumPendingBalanceCreditCounter: '65536',
451
+ proofInstructionOffset: 1,
452
+ })
453
+ .verifyPubkeyValidity({ proofData: proofDataHex });
454
+ const tx = await builder.build();
455
+ const instructions = tx.toJson().instructionsData;
456
+ instructions.should.have.length(2);
457
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
458
+ instructions[1].type.should.equal('VerifyPubkeyValidity');
459
+ const rawTx = tx.toBroadcastFormat();
460
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
461
+ });
462
+ });
463
+ describe('Raw transaction validity', () => {
464
+ it('should produce a valid raw transaction', async () => {
465
+ const builder = ctBuilder();
466
+ builder.configureAccount({
467
+ tokenAddress,
468
+ mintAddress,
469
+ authorityAddress,
470
+ elgamalPubkey: '11'.repeat(32),
471
+ decryptableZeroBalance: zeroBytes36,
472
+ maximumPendingBalanceCreditCounter: '65536',
473
+ proofInstructionOffset: 1,
474
+ });
475
+ const tx = await builder.build();
476
+ const rawTx = tx.toBroadcastFormat();
477
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
478
+ });
479
+ });
480
+ describe('Validation', () => {
481
+ it('should reject empty builder', async () => {
482
+ const builder = ctBuilder();
483
+ await builder.build().should.be.rejectedWith(/confidential transfer instruction/);
484
+ });
485
+ it('should reject missing tokenAddress on configureAccount', () => {
486
+ const builder = ctBuilder();
487
+ should_1.default.throws(() => builder.configureAccount({
488
+ tokenAddress: '',
489
+ mintAddress,
490
+ authorityAddress,
491
+ elgamalPubkey: '11'.repeat(32),
492
+ decryptableZeroBalance: zeroBytes36,
493
+ maximumPendingBalanceCreditCounter: '65536',
494
+ proofInstructionOffset: 1,
495
+ }));
496
+ });
497
+ });
498
+ // ─── Fix-specific tests ────────────────────────────────────────────────────
499
+ describe('Fix #1: signed i8 proof instruction offsets', () => {
500
+ it('should correctly encode negative offset on ConfigureAccount', async () => {
501
+ const builder = ctBuilder();
502
+ builder.configureAccount({
503
+ tokenAddress,
504
+ mintAddress,
505
+ authorityAddress,
506
+ elgamalPubkey: '11'.repeat(32),
507
+ decryptableZeroBalance: zeroBytes36,
508
+ maximumPendingBalanceCreditCounter: '65536',
509
+ proofInstructionOffset: -1, // proof is the previous instruction
510
+ });
511
+ const tx = await builder.build();
512
+ const data = solTx(tx).instructions[0].data;
513
+ data[78].should.equal(255); // -1 as i8 = 255 as u8 (two's complement)
514
+ });
515
+ it('should correctly encode negative offset on Withdraw', async () => {
516
+ const builder = ctBuilder();
517
+ builder.confidentialWithdraw({
518
+ tokenAddress,
519
+ mintAddress,
520
+ authorityAddress,
521
+ equalityProofContextStateAddress: eqCtxAddress,
522
+ rangeProofContextStateAddress: rangeCtxAddress,
523
+ amount: '100',
524
+ decimals: 6,
525
+ newDecryptableAvailableBalance: zeroBytes36,
526
+ equalityProofInstructionOffset: -1,
527
+ rangeProofInstructionOffset: -2,
528
+ });
529
+ const tx = await builder.build();
530
+ const data = solTx(tx).instructions[0].data;
531
+ data[47].should.equal(255); // -1 as i8
532
+ data[48].should.equal(254); // -2 as i8
533
+ });
534
+ it('should correctly encode negative offsets on Transfer', async () => {
535
+ const builder = ctBuilder();
536
+ builder.confidentialTransfer({
537
+ sourceTokenAddress: tokenAddress,
538
+ mintAddress,
539
+ destinationTokenAddress,
540
+ authorityAddress,
541
+ equalityProofContextStateAddress: eqCtxAddress,
542
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
543
+ rangeProofContextStateAddress: rangeCtxAddress,
544
+ newSourceDecryptableAvailableBalance: zeroBytes36,
545
+ transferAmountAuditorCiphertextLo: zeroBytes64,
546
+ transferAmountAuditorCiphertextHi: zeroBytes64,
547
+ equalityProofInstructionOffset: -3,
548
+ ciphertextValidityProofInstructionOffset: -2,
549
+ rangeProofInstructionOffset: -1,
550
+ });
551
+ const tx = await builder.build();
552
+ const data = solTx(tx).instructions[0].data;
553
+ data[166].should.equal(253); // -3 as i8
554
+ data[167].should.equal(254); // -2 as i8
555
+ data[168].should.equal(255); // -1 as i8
556
+ });
557
+ });
558
+ describe('Fix #2: instruction order preservation in parser', () => {
559
+ it('should preserve interleaved CT and custom instruction order', async () => {
560
+ const builder = ctBuilder();
561
+ builder
562
+ .applyPendingBalance({
563
+ tokenAddress,
564
+ authorityAddress,
565
+ expectedPendingBalanceCreditCounter: '1',
566
+ newDecryptableAvailableBalance: zeroBytes36,
567
+ })
568
+ .verifyEqualityProof({ proofData: proofDataHex })
569
+ .confidentialTransfer({
570
+ sourceTokenAddress: tokenAddress,
571
+ mintAddress,
572
+ destinationTokenAddress,
573
+ authorityAddress,
574
+ equalityProofContextStateAddress: eqCtxAddress,
575
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
576
+ rangeProofContextStateAddress: rangeCtxAddress,
577
+ newSourceDecryptableAvailableBalance: zeroBytes36,
578
+ transferAmountAuditorCiphertextLo: zeroBytes64,
579
+ transferAmountAuditorCiphertextHi: zeroBytes64,
580
+ equalityProofInstructionOffset: 0,
581
+ ciphertextValidityProofInstructionOffset: 0,
582
+ rangeProofInstructionOffset: 0,
583
+ });
584
+ const tx = await builder.build();
585
+ const instructions = tx.toJson().instructionsData;
586
+ // Order should be: ApplyPendingBalance, VerifyEqualityProof, ConfidentialTransfer
587
+ instructions.should.have.length(3);
588
+ instructions[0].type.should.equal('ApplyPendingBalance');
589
+ instructions[1].type.should.equal('VerifyEqualityProof');
590
+ instructions[2].type.should.equal('ConfidentialTransfer');
591
+ });
592
+ });
593
+ describe('Fix #3: VerifyPubkeyValidity context state mode', () => {
594
+ it('should not throw when only context state accounts are provided (no proofData)', async () => {
595
+ const builder = ctBuilder();
596
+ builder.verifyPubkeyValidity({
597
+ contextStateAccountAddress: eqCtxAddress,
598
+ contextStateAuthorityAddress: authorityAddress,
599
+ });
600
+ const tx = await builder.build();
601
+ const rawIx = solTx(tx).instructions[0];
602
+ // Should produce an offset-based instruction, not throw
603
+ rawIx.data[0].should.equal(4);
604
+ rawIx.keys.should.have.length(2);
605
+ });
606
+ });
607
+ describe('Fix #4: context state address required when offset == 0', () => {
608
+ it('should reject Withdraw with offset 0 but missing equality context state address', async () => {
609
+ const builder = ctBuilder();
610
+ builder.confidentialWithdraw({
611
+ tokenAddress,
612
+ mintAddress,
613
+ authorityAddress,
614
+ rangeProofContextStateAddress: rangeCtxAddress,
615
+ amount: '100',
616
+ decimals: 6,
617
+ newDecryptableAvailableBalance: zeroBytes36,
618
+ equalityProofInstructionOffset: 0, // context state mode but no address
619
+ rangeProofInstructionOffset: 0,
620
+ });
621
+ await builder.build().should.be.rejectedWith(/equalityProofContextStateAddress is required/);
622
+ });
623
+ it('should reject Transfer with offset 0 but missing range context state address', async () => {
624
+ const builder = ctBuilder();
625
+ builder.confidentialTransfer({
626
+ sourceTokenAddress: tokenAddress,
627
+ mintAddress,
628
+ destinationTokenAddress,
629
+ authorityAddress,
630
+ equalityProofContextStateAddress: eqCtxAddress,
631
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
632
+ newSourceDecryptableAvailableBalance: zeroBytes36,
633
+ transferAmountAuditorCiphertextLo: zeroBytes64,
634
+ transferAmountAuditorCiphertextHi: zeroBytes64,
635
+ equalityProofInstructionOffset: 0,
636
+ ciphertextValidityProofInstructionOffset: 0,
637
+ rangeProofInstructionOffset: 0, // context state mode but no address
638
+ });
639
+ await builder.build().should.be.rejectedWith(/rangeProofContextStateAddress is required/);
640
+ });
641
+ });
642
+ describe('Fix #5: numeric string validation', () => {
643
+ it('should reject non-numeric amount on Deposit', async () => {
644
+ const builder = ctBuilder();
645
+ builder.confidentialDeposit({
646
+ tokenAddress,
647
+ mintAddress,
648
+ authorityAddress,
649
+ amount: 'abc',
650
+ decimals: 6,
651
+ });
652
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
653
+ });
654
+ it('should reject negative amount on Deposit', async () => {
655
+ const builder = ctBuilder();
656
+ builder.confidentialDeposit({
657
+ tokenAddress,
658
+ mintAddress,
659
+ authorityAddress,
660
+ amount: '-100',
661
+ decimals: 6,
662
+ });
663
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
664
+ });
665
+ it('should reject non-numeric counter on ApplyPendingBalance', async () => {
666
+ const builder = ctBuilder();
667
+ builder.applyPendingBalance({
668
+ tokenAddress,
669
+ authorityAddress,
670
+ expectedPendingBalanceCreditCounter: 'not-a-number',
671
+ newDecryptableAvailableBalance: zeroBytes36,
672
+ });
673
+ await builder.build().should.be.rejectedWith(/Invalid expectedPendingBalanceCreditCounter/);
674
+ });
675
+ it('should reject non-numeric counter on ConfigureAccount', async () => {
676
+ const builder = ctBuilder();
677
+ builder.configureAccount({
678
+ tokenAddress,
679
+ mintAddress,
680
+ authorityAddress,
681
+ elgamalPubkey: '11'.repeat(32),
682
+ decryptableZeroBalance: zeroBytes36,
683
+ maximumPendingBalanceCreditCounter: 'foo',
684
+ proofInstructionOffset: 1,
685
+ });
686
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter/);
687
+ });
688
+ it('should accept amount of 0 on Deposit', async () => {
689
+ const builder = ctBuilder();
690
+ builder.confidentialDeposit({
691
+ tokenAddress,
692
+ mintAddress,
693
+ authorityAddress,
694
+ amount: '0',
695
+ decimals: 6,
696
+ });
697
+ const tx = await builder.build();
698
+ const data = solTx(tx).instructions[0].data;
699
+ data.readBigUInt64LE(2).toString().should.equal('0');
700
+ });
701
+ });
702
+ describe('Fix #6: canonical ZK proof program ID', () => {
703
+ it('should use canonical zk-elgamal-proof program id', async () => {
704
+ const builder = ctBuilder();
705
+ builder.verifyEqualityProof({ proofData: proofDataHex });
706
+ const tx = await builder.build();
707
+ solTx(tx).instructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
708
+ });
709
+ it('should allow overriding ZK proof program id', async () => {
710
+ const customProgramId = testData.associatedTokenAccounts.accounts[0].pub; // any valid pubkey
711
+ const builder = ctBuilder();
712
+ builder.zkProofProgramId(customProgramId);
713
+ builder.verifyEqualityProof({ proofData: proofDataHex });
714
+ const tx = await builder.build();
715
+ solTx(tx).instructions[0].programId.toString().should.equal(customProgramId);
716
+ });
717
+ });
718
+ describe('Fix #8: from() routing for CT transactions', () => {
719
+ it('should route CT transaction to ConfidentialTransferBuilder on from()', async () => {
720
+ // Build a CT transaction
721
+ const builder = ctBuilder();
722
+ builder.configureAccount({
723
+ tokenAddress,
724
+ mintAddress,
725
+ authorityAddress,
726
+ elgamalPubkey: '11'.repeat(32),
727
+ decryptableZeroBalance: zeroBytes36,
728
+ maximumPendingBalanceCreditCounter: '65536',
729
+ proofInstructionOffset: 1,
730
+ });
731
+ const tx = await builder.build();
732
+ const rawTx = tx.toBroadcastFormat();
733
+ // Parse it back via factory.from()
734
+ const parsedBuilder = factory.from(rawTx);
735
+ // Should be a ConfidentialTransferBuilder, not CustomInstructionBuilder
736
+ parsedBuilder.constructor.name.should.equal('ConfidentialTransferBuilder');
737
+ });
738
+ it('should route non-CT custom transaction to CustomInstructionBuilder on from()', async () => {
739
+ // Build a non-CT custom transaction
740
+ const customBuilder = factory.getCustomInstructionBuilder();
741
+ customBuilder.nonce(recentBlockHash);
742
+ customBuilder.sender(account.pub);
743
+ customBuilder.addCustomInstruction({
744
+ programId: 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
745
+ keys: [],
746
+ data: 'hello',
747
+ });
748
+ const tx = await customBuilder.build();
749
+ const rawTx = tx.toBroadcastFormat();
750
+ // Parse it back via factory.from()
751
+ const parsedBuilder = factory.from(rawTx);
752
+ parsedBuilder.constructor.name.should.equal('CustomInstructionBuilder');
753
+ });
754
+ });
755
+ describe('Fix #9: range validation for decimals and proof offsets', () => {
756
+ it('should reject decimals > 255 on Deposit', async () => {
757
+ const builder = ctBuilder();
758
+ builder.confidentialDeposit({
759
+ tokenAddress,
760
+ mintAddress,
761
+ authorityAddress,
762
+ amount: '100',
763
+ decimals: 256,
764
+ });
765
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
766
+ });
767
+ it('should reject negative decimals on Deposit', async () => {
768
+ const builder = ctBuilder();
769
+ builder.confidentialDeposit({
770
+ tokenAddress,
771
+ mintAddress,
772
+ authorityAddress,
773
+ amount: '100',
774
+ decimals: -1,
775
+ });
776
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
777
+ });
778
+ it('should reject non-integer decimals on Deposit', async () => {
779
+ const builder = ctBuilder();
780
+ builder.confidentialDeposit({
781
+ tokenAddress,
782
+ mintAddress,
783
+ authorityAddress,
784
+ amount: '100',
785
+ decimals: 6.5,
786
+ });
787
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
788
+ });
789
+ it('should reject proof offset > 127 on ConfigureAccount', async () => {
790
+ const builder = ctBuilder();
791
+ builder.configureAccount({
792
+ tokenAddress,
793
+ mintAddress,
794
+ authorityAddress,
795
+ elgamalPubkey: '11'.repeat(32),
796
+ decryptableZeroBalance: zeroBytes36,
797
+ maximumPendingBalanceCreditCounter: '65536',
798
+ proofInstructionOffset: 128,
799
+ });
800
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
801
+ });
802
+ it('should reject proof offset < -128 on ConfigureAccount', async () => {
803
+ const builder = ctBuilder();
804
+ builder.configureAccount({
805
+ tokenAddress,
806
+ mintAddress,
807
+ authorityAddress,
808
+ elgamalPubkey: '11'.repeat(32),
809
+ decryptableZeroBalance: zeroBytes36,
810
+ maximumPendingBalanceCreditCounter: '65536',
811
+ proofInstructionOffset: -129,
812
+ });
813
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
814
+ });
815
+ it('should reject equality proof offset > 127 on Withdraw', async () => {
816
+ const builder = ctBuilder();
817
+ builder.confidentialWithdraw({
818
+ tokenAddress,
819
+ mintAddress,
820
+ authorityAddress,
821
+ equalityProofContextStateAddress: eqCtxAddress,
822
+ rangeProofContextStateAddress: rangeCtxAddress,
823
+ amount: '100',
824
+ decimals: 6,
825
+ newDecryptableAvailableBalance: zeroBytes36,
826
+ equalityProofInstructionOffset: 200,
827
+ rangeProofInstructionOffset: 0,
828
+ });
829
+ await builder.build().should.be.rejectedWith(/Invalid equalityProofInstructionOffset: expected i8/);
830
+ });
831
+ it('should reject range proof offset < -128 on Withdraw', async () => {
832
+ const builder = ctBuilder();
833
+ builder.confidentialWithdraw({
834
+ tokenAddress,
835
+ mintAddress,
836
+ authorityAddress,
837
+ equalityProofContextStateAddress: eqCtxAddress,
838
+ rangeProofContextStateAddress: rangeCtxAddress,
839
+ amount: '100',
840
+ decimals: 6,
841
+ newDecryptableAvailableBalance: zeroBytes36,
842
+ equalityProofInstructionOffset: 0,
843
+ rangeProofInstructionOffset: -200,
844
+ });
845
+ await builder.build().should.be.rejectedWith(/Invalid rangeProofInstructionOffset: expected i8/);
846
+ });
847
+ it('should reject validity proof offset out of i8 range on Transfer', async () => {
848
+ const builder = ctBuilder();
849
+ builder.confidentialTransfer({
850
+ sourceTokenAddress: tokenAddress,
851
+ mintAddress,
852
+ destinationTokenAddress,
853
+ authorityAddress,
854
+ equalityProofContextStateAddress: eqCtxAddress,
855
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
856
+ rangeProofContextStateAddress: rangeCtxAddress,
857
+ newSourceDecryptableAvailableBalance: zeroBytes36,
858
+ transferAmountAuditorCiphertextLo: zeroBytes64,
859
+ transferAmountAuditorCiphertextHi: zeroBytes64,
860
+ equalityProofInstructionOffset: 0,
861
+ ciphertextValidityProofInstructionOffset: 255,
862
+ rangeProofInstructionOffset: 0,
863
+ });
864
+ await builder.build().should.be.rejectedWith(/Invalid ciphertextValidityProofInstructionOffset: expected i8/);
865
+ });
866
+ it('should accept boundary offset values (-128 and 127)', async () => {
867
+ const builder = ctBuilder();
868
+ builder.configureAccount({
869
+ tokenAddress,
870
+ mintAddress,
871
+ authorityAddress,
872
+ elgamalPubkey: '11'.repeat(32),
873
+ decryptableZeroBalance: zeroBytes36,
874
+ maximumPendingBalanceCreditCounter: '65536',
875
+ proofInstructionOffset: 127,
876
+ });
877
+ const tx = await builder.build();
878
+ const data = solTx(tx).instructions[0].data;
879
+ data[78].should.equal(127);
880
+ });
881
+ });
882
+ describe('Fix #10: u64 overflow validation', () => {
883
+ it('should reject amount exceeding u64 max on Deposit', async () => {
884
+ const builder = ctBuilder();
885
+ builder.confidentialDeposit({
886
+ tokenAddress,
887
+ mintAddress,
888
+ authorityAddress,
889
+ amount: '18446744073709551616', // 2^64
890
+ decimals: 6,
891
+ });
892
+ await builder.build().should.be.rejectedWith(/Invalid amount: value exceeds u64 max/);
893
+ });
894
+ it('should accept amount at u64 max on Deposit', async () => {
895
+ const builder = ctBuilder();
896
+ builder.confidentialDeposit({
897
+ tokenAddress,
898
+ mintAddress,
899
+ authorityAddress,
900
+ amount: '18446744073709551615', // 2^64 - 1
901
+ decimals: 6,
902
+ });
903
+ const tx = await builder.build();
904
+ const data = solTx(tx).instructions[0].data;
905
+ data.readBigUInt64LE(2).toString().should.equal('18446744073709551615');
906
+ });
907
+ it('should reject counter exceeding u64 max on ConfigureAccount', async () => {
908
+ const builder = ctBuilder();
909
+ builder.configureAccount({
910
+ tokenAddress,
911
+ mintAddress,
912
+ authorityAddress,
913
+ elgamalPubkey: '11'.repeat(32),
914
+ decryptableZeroBalance: zeroBytes36,
915
+ maximumPendingBalanceCreditCounter: '18446744073709551616', // 2^64
916
+ proofInstructionOffset: 1,
917
+ });
918
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter: value exceeds u64 max/);
919
+ });
920
+ });
921
+ });
922
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBMkQ7QUFDM0Qsb0RBQTRCO0FBQzVCLDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFFekQsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUV2RSwwQ0FBMEM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztJQUN0RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRixNQUFNLHVCQUF1QixHQUFHLDhDQUE4QyxDQUFDO0lBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNyQyw4RUFBOEU7SUFDOUUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFN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Q0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdkIsWUFBWTtnQkFDWixXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixzQkFBc0IsRUFBRSxXQUFXO2dCQUNuQyxrQ0FBa0MsRUFBRSxzQkFBc0IsRUFBRSxPQUFPO2dCQUNuRSxzQkFBc0IsRUFBRSxDQUFDO2FBQzFCLENBQUMsQ0FBQztZQUNILE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLG1FQUFtRSxDQUFDLENBQUM7UUFDcEgsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5UGFpciwgVXRpbHMsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zb2wnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5cbmRlc2NyaWJlKCdTb2xhbmEgQ29uZmlkZW50aWFsIFRyYW5zZmVyIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgnc29sJyk7XG4gIGNvbnN0IGFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXSkuZ2V0S2V5cygpO1xuICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuXG4gIC8vIFRlc3QgYWRkcmVzc2VzIChUb2tlbi0yMDIyIG1pbnQgKyBBVEFzKVxuICBjb25zdCBtaW50QWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzRm9yU29sMjAyMi5taW50SWQ7XG4gIGNvbnN0IHRva2VuQWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzRm9yU29sMjAyMi5hY2NvdW50c1swXS5hdGE7XG4gIGNvbnN0IGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzID0gJ0VObjhhMnRHTVM5YlI1WFY3c21HSEp2Tmd6a3l4Sm1uRDJlVXZReFk1alNQJztcbiAgY29uc3QgYXV0aG9yaXR5QWRkcmVzcyA9IGFjY291bnQucHViO1xuICAvLyBWYWxpZCBiYXNlNTggYWRkcmVzc2VzIGZvciBjb250ZXh0IHN0YXRlIGFjY291bnRzIChhbnkgdmFsaWQgU29sYW5hIHB1YmtleSlcbiAgY29uc3QgZXFDdHhBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0uYXRhO1xuICBjb25zdCB2YWxpZGl0eUN0eEFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50cy5hY2NvdW50c1swXS5wdWI7XG4gIGNvbnN0IHJhbmdlQ3R4QWRkcmVzcyA9IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWI7XG5cbiAgLy8gSGV4IHRlc3QgZGF0YVxuICBjb25zdCB6ZXJvQnl0ZXMzNiA9ICcwMCcucmVwZWF0KDM2KTtcbiAgY29uc3QgemVyb0J5dGVzNjQgPSAnMDAnLnJlcGVhdCg2NCk7XG4gIGNvbnN0IHByb29mRGF0YUhleCA9ICcwMCcucmVwZWF0KDMyMCk7IC8vIHR5cGljYWwgZXF1YWxpdHkgcHJvb2Ygc2l6ZVxuXG4gIGNvbnN0IGN0QnVpbGRlciA9ICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldENvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEFjY2VzcyB0aGUgcmF3IFNvbGFuYSBUcmFuc2FjdGlvbiBmcm9tIHRoZSBidWlsdCB0eCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBzb2xUeCA9ICh0eDogYW55KTogYW55ID0+ICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb247XG5cbiAgZGVzY3JpYmUoJ0NvbmZpZ3VyZUFjY291bnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIGNvbmZpZ3VyZSBhY2NvdW50IGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA3OS1ieXRlIGxheW91dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVsZ2FtYWxQdWJrZXk6ICcxMScucmVwZWF0KDMyKSxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSByYXcgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNzkpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoMik7IC8vIENvbmZpZ3VyZUFjY291bnRcbiAgICAgIGRhdGEuc2xpY2UoMiwgMzQpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoJzExJy5yZXBlYXQoMzIpKTsgLy8gbmV3X2FjY291bnRfZWxnYW1hbF9wdWJrZXlcbiAgICAgIGRhdGEuc2xpY2UoMzQsIDcwKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHplcm9CeXRlczM2KTsgLy8gZGVjcnlwdGFibGVfemVyb19iYWxhbmNlXG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSg3MCkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzY1NTM2Jyk7IC8vIG1heCBwZW5kaW5nIGJhbGFuY2UgY3JlZGl0IGNvdW50ZXJcbiAgICAgIGRhdGFbNzhdLnNob3VsZC5lcXVhbCgxKTsgLy8gcHJvb2ZfaW5zdHJ1Y3Rpb25fb2Zmc2V0XG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50c1xuICAgICAgY29uc3Qga2V5cyA9IHJhd0luc3RydWN0aW9uc1swXS5rZXlzO1xuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNCk7XG4gICAgICBrZXlzWzBdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MpO1xuICAgICAga2V5c1swXS5pc1dyaXRhYmxlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXlzWzFdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtaW50QWRkcmVzcyk7XG4gICAgICBrZXlzWzFdLmlzV3JpdGFibGUuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnU3lzdmFyMW5zdHJ1Y3Rpb25zMTExMTExMTExMTExMTExMTExMTExMTExMScpOyAvLyBpbnN0cnVjdGlvbnMgc3lzdmFyXG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbM10uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGNvbnRleHQgc3RhdGUgYWRkcmVzcyB3aGVuIHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dFN0YXRlQWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVsZ2FtYWxQdWJrZXk6ICcxMScucmVwZWF0KDMyKSxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zU3lzdmFyT3JDb250ZXh0U3RhdGVBZGRyZXNzOiBjb250ZXh0U3RhdGVBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGtleXMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChjb250ZXh0U3RhdGVBZGRyZXNzKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzc4XS5zaG91bGQuZXF1YWwoMCk7IC8vIHByb29mX2luc3RydWN0aW9uX29mZnNldCA9IDAgKGNvbnRleHQgc3RhdGUpXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcHBseVBlbmRpbmdCYWxhbmNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gYXBwbHkgcGVuZGluZyBiYWxhbmNlIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0Ni1ieXRlIGxheW91dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuYXBwbHlQZW5kaW5nQmFsYW5jZSh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXhwZWN0ZWRQZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICczJyxcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHJhd0luc3RydWN0aW9ucyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnM7XG4gICAgICByYXdJbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgZGF0YSA9IHJhd0luc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDQ2KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDgpOyAvLyBBcHBseVBlbmRpbmdCYWxhbmNlXG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMycpOyAvLyBleHBlY3RlZF9wZW5kaW5nX2JhbGFuY2VfY3JlZGl0X2NvdW50ZXJcbiAgICAgIGRhdGEuc2xpY2UoMTAsIDQ2KS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHplcm9CeXRlczM2KTsgLy8gbmV3X2RlY3J5cHRhYmxlX2F2YWlsYWJsZV9iYWxhbmNlXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1sxXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVwb3NpdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVwb3NpdCBpbnN0cnVjdGlvbiB3aXRoIGNvcnJlY3QgMTEtYnl0ZSBsYXlvdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsRGVwb3NpdCcpO1xuXG4gICAgICBjb25zdCByYXdJbnN0cnVjdGlvbnMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zO1xuICAgICAgcmF3SW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxMSk7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCgyNyk7IC8vIENvbmZpZGVudGlhbFRyYW5zZmVyRXh0ZW5zaW9uXG4gICAgICBkYXRhWzFdLnNob3VsZC5lcXVhbCg1KTsgLy8gRGVwb3NpdFxuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTsgLy8gYW1vdW50XG4gICAgICBkYXRhWzEwXS5zaG91bGQuZXF1YWwoNik7IC8vIGRlY2ltYWxzXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgbWludCwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1syXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2l0aGRyYXcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHdpdGhkcmF3IGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0OS1ieXRlIGxheW91dCBhbmQgaW5saW5lIHByb29mcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsV2l0aGRyYXcnKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDkpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoNik7IC8vIFdpdGhkcmF3XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNTAwMDAwJyk7IC8vIGFtb3VudFxuICAgICAgZGF0YVsxMF0uc2hvdWxkLmVxdWFsKDYpOyAvLyBkZWNpbWFsc1xuICAgICAgZGF0YS5zbGljZSgxMSwgNDcpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBuZXdfZGVjcnlwdGFibGVcbiAgICAgIGRhdGFbNDddLnNob3VsZC5lcXVhbCgxKTsgLy8gZXF1YWxpdHkgcHJvb2Ygb2Zmc2V0XG4gICAgICBkYXRhWzQ4XS5zaG91bGQuZXF1YWwoMik7IC8vIHJhbmdlIHByb29mIG9mZnNldFxuXG4gICAgICAvLyBWZXJpZnkgYWNjb3VudHM6IFt0b2tlbih3cml0YWJsZSksIG1pbnQsIHN5c3ZhciwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbM10uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFt0b2tlbiwgbWludCwgZXFDdHgsIHJnQ3R4LCBhdXRob3JpdHldIOKAlCBubyBzeXN2YXIgc2luY2UgYWxsIHByb29mcyB1c2UgY29udGV4dCBzdGF0ZVxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwocmFuZ2VDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uZmlkZW50aWFsVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCAxNjktYnl0ZSBsYXlvdXQgYW5kIGlubGluZSBwcm9vZnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMTY5KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDcpOyAvLyBUcmFuc2ZlclxuICAgICAgZGF0YS5zbGljZSgyLCAzOCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXMzNik7IC8vIG5ld19zb3VyY2VfZGVjcnlwdGFibGVcbiAgICAgIGRhdGEuc2xpY2UoMzgsIDEwMikudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXM2NCk7IC8vIGF1ZGl0b3JfY3RfbG9cbiAgICAgIGRhdGEuc2xpY2UoMTAyLCAxNjYpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzNjQpOyAvLyBhdWRpdG9yX2N0X2hpXG4gICAgICBkYXRhWzE2Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBlcXVhbGl0eSBwcm9vZiBvZmZzZXRcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMik7IC8vIHZhbGlkaXR5IHByb29mIG9mZnNldFxuICAgICAgZGF0YVsxNjhdLnNob3VsZC5lcXVhbCgzKTsgLy8gcmFuZ2UgcHJvb2Ygb2Zmc2V0XG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3NvdXJjZSh3cml0YWJsZSksIG1pbnQsIGRlc3Qod3JpdGFibGUpLCBzeXN2YXIsIGF1dGhvcml0eShzaWduZXIpXVxuICAgICAgY29uc3Qga2V5cyA9IHJhd0luc3RydWN0aW9uc1swXS5rZXlzO1xuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzBdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MpO1xuICAgICAga2V5c1swXS5pc1dyaXRhYmxlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXlzWzFdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtaW50QWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvblRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzRdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFtzb3VyY2UsIG1pbnQsIGRlc3QsIGVxQ3R4LCB2YWxpZGl0eUN0eCwgcmFuZ2VDdHgsIGF1dGhvcml0eV0g4oCUIG5vIHN5c3ZhclxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodmFsaWRpdHlDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHJhbmdlQ3R4QWRkcmVzcyk7XG4gICAgICBrZXlzWzZdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNl0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB2ZXJpZnkgcHVia2V5IHZhbGlkaXR5IGluc3RydWN0aW9uIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCg0KTsgLy8gVmVyaWZ5UHVia2V5VmFsaWRpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApOyAvLyBkaXNjcmltaW5hdG9yICsgcHJvb2YgZGF0YVxuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG5cbiAgICAgIC8vIE5vIGFjY291bnRzIGZvciBpbmxpbmUgcHJvb2ZcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHByb2dyYW0gaWQgKGNhbm9uaWNhbCBvbi1jaGFpbiBpZClcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJ1prRTFHYW1hMVByb29mMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBjb250ZXh0IHN0YXRlIGFjY291bnQgKGZpeCAjMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHtcbiAgICAgICAgY29udGV4dFN0YXRlQWNjb3VudEFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY29udGV4dFN0YXRlQXV0aG9yaXR5QWRkcmVzczogYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0l4ID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJeC5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoNCk7IC8vIFZlcmlmeVB1YmtleVZhbGlkaXR5IGRpc2NyaW1pbmF0b3JcbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5RXF1YWxpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMyk7IC8vIFZlcmlmeUNpcGhlcnRleHRDb21taXRtZW50RXF1YWxpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApO1xuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggY29udGV4dCBzdGF0ZSBvZmZzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2Yoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdJeCA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF07XG4gICAgICBjb25zdCBkYXRhID0gcmF3SXguZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgZGF0YS5yZWFkVUludDMyTEUoMSkuc2hvdWxkLmVxdWFsKDApOyAvLyBvZmZzZXQgYXMgdTMyXG5cbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5VmFsaWRpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVZhbGlkaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMTIpOyAvLyBWZXJpZnlCYXRjaGVkR3JvdXBlZENpcGhlcnRleHQzSGFuZGxlc1ZhbGlkaXR5XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMSArIDMyMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnlSYW5nZVByb29mJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBpbmxpbmUgcHJvb2YgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UmFuZ2VQcm9vZih7IHByb29mRGF0YTogJzAwJy5yZXBlYXQoMTAwMCkgfSk7IC8vIHJhbmdlIHByb29mIGlzIH4xMDAwIGJ5dGVzXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDcpOyAvLyBWZXJpZnlCYXRjaGVkUmFuZ2VQcm9vZlUxMjhcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxICsgMTAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNdWx0aXBsZSBpbnN0cnVjdGlvbnMgKHYxIHR4IHNpbXVsYXRpb24pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgQXBwbHlQZW5kaW5nQmFsYW5jZSArIDMgcHJvb2ZzICsgVHJhbnNmZXIgaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFwcGx5UGVuZGluZ0JhbGFuY2Uoe1xuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnMicsXG4gICAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgfSlcbiAgICAgICAgLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgICAudmVyaWZ5VmFsaWRpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pXG4gICAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgICAuY29uZmlkZW50aWFsVHJhbnNmZXIoe1xuICAgICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAzLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCg1KTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdWZXJpZnlFcXVhbGl0eVByb29mJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVZhbGlkaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1szXS50eXBlLnNob3VsZC5lcXVhbCgnVmVyaWZ5UmFuZ2VQcm9vZicpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzRdLnR5cGUuc2hvdWxkLmVxdWFsKCdDb25maWRlbnRpYWxUcmFuc2ZlcicpO1xuXG4gICAgICAvLyBOb3RlOiBDYW5ub3QgdmVyaWZ5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgaGVyZSBiZWNhdXNlIDMgcHJvb2ZzICgzMjArMzIwKzEwMDAgYnl0ZXMpXG4gICAgICAvLyArIHRyYW5zZmVyICgxNjlCKSBleGNlZWRzIHYwIHR4IHNpemUgbGltaXQgKDEyMzJCKS4gVGhlc2UgYXJlIHYxIHRyYW5zYWN0aW9ucyAoNDEzMkIpLlxuICAgICAgLy8gVGhlIGluc3RydWN0aW9uIGRhdGEgbGF5b3V0cyBhcmUgdmVyaWZpZWQgaW5kaXZpZHVhbGx5IGluIHRoZSB0ZXN0cyBhYm92ZS5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgQ29uZmlndXJlQWNjb3VudCArIFZlcmlmeVB1YmtleVZhbGlkaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgZWxnYW1hbFB1YmtleTogJzExJy5yZXBlYXQoMzIpLFxuICAgICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgICAgfSlcbiAgICAgICAgLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gdHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YTtcbiAgICAgIGluc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgICBpbnN0cnVjdGlvbnNbMF0udHlwZS5zaG91bGQuZXF1YWwoJ0NvbmZpZ3VyZUNvbmZpZGVudGlhbFRyYW5zZmVyQWNjb3VudCcpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdWZXJpZnlQdWJrZXlWYWxpZGl0eScpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1JhdyB0cmFuc2FjdGlvbiB2YWxpZGl0eScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgYSB2YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlbGdhbWFsUHVia2V5OiAnMTEnLnJlcGVhdCgzMiksXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IGJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtaXNzaW5nIHRva2VuQWRkcmVzcyBvbiBjb25maWd1cmVBY2NvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PlxuICAgICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICAgIHRva2VuQWRkcmVzczogJycsXG4gICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBlbGdhbWFsUHVia2V5OiAnMTEnLnJlcGVhdCgzMiksXG4gICAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8g4pSA4pSA4pSAIEZpeC1zcGVjaWZpYyB0ZXN0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBkZXNjcmliZSgnRml4ICMxOiBzaWduZWQgaTggcHJvb2YgaW5zdHJ1Y3Rpb24gb2Zmc2V0cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBlbmNvZGUgbmVnYXRpdmUgb2Zmc2V0IG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlbGdhbWFsUHVia2V5OiAnMTEnLnJlcGVhdCgzMiksXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSwgLy8gcHJvb2YgaXMgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs3OF0uc2hvdWxkLmVxdWFsKDI1NSk7IC8vIC0xIGFzIGk4ID0gMjU1IGFzIHU4ICh0d28ncyBjb21wbGVtZW50KVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldCBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ3XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICAgIGRhdGFbNDhdLnNob3VsZC5lcXVhbCgyNTQpOyAvLyAtMiBhcyBpOFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldHMgb24gVHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogLTMsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0yLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMTY2XS5zaG91bGQuZXF1YWwoMjUzKTsgLy8gLTMgYXMgaThcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMjU0KTsgLy8gLTIgYXMgaThcbiAgICAgIGRhdGFbMTY4XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMjogaW5zdHJ1Y3Rpb24gb3JkZXIgcHJlc2VydmF0aW9uIGluIHBhcnNlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGludGVybGVhdmVkIENUIGFuZCBjdXN0b20gaW5zdHJ1Y3Rpb24gb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzEnLFxuICAgICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIH0pXG4gICAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgICBzb3VyY2VUb2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICAvLyBPcmRlciBzaG91bGQgYmU6IEFwcGx5UGVuZGluZ0JhbGFuY2UsIFZlcmlmeUVxdWFsaXR5UHJvb2YsIENvbmZpZGVudGlhbFRyYW5zZmVyXG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeUVxdWFsaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1syXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMzogVmVyaWZ5UHVia2V5VmFsaWRpdHkgY29udGV4dCBzdGF0ZSBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IHdoZW4gb25seSBjb250ZXh0IHN0YXRlIGFjY291bnRzIGFyZSBwcm92aWRlZCAobm8gcHJvb2ZEYXRhKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UHVia2V5VmFsaWRpdHkoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SXggPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdO1xuICAgICAgLy8gU2hvdWxkIHByb2R1Y2UgYW4gb2Zmc2V0LWJhc2VkIGluc3RydWN0aW9uLCBub3QgdGhyb3dcbiAgICAgIHJhd0l4LmRhdGFbMF0uc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgcmF3SXgua2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzQ6IGNvbnRleHQgc3RhdGUgYWRkcmVzcyByZXF1aXJlZCB3aGVuIG9mZnNldCA9PSAwJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IFdpdGhkcmF3IHdpdGggb2Zmc2V0IDAgYnV0IG1pc3NpbmcgZXF1YWxpdHkgY29udGV4dCBzdGF0ZSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxXaXRoZHJhdyh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsIC8vIGNvbnRleHQgc3RhdGUgbW9kZSBidXQgbm8gYWRkcmVzc1xuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzcyBpcyByZXF1aXJlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgVHJhbnNmZXIgd2l0aCBvZmZzZXQgMCBidXQgbWlzc2luZyByYW5nZSBjb250ZXh0IHN0YXRlIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLCAvLyBjb250ZXh0IHN0YXRlIG1vZGUgYnV0IG5vIGFkZHJlc3NcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzIGlzIHJlcXVpcmVkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzU6IG51bWVyaWMgc3RyaW5nIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgYW1vdW50IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICdhYmMnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiBleHBlY3RlZCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmcvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudCBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnLTEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBhbW91bnQ6IGV4cGVjdGVkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgY291bnRlciBvbiBBcHBseVBlbmRpbmdCYWxhbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ25vdC1hLW51bWJlcicsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tbnVtZXJpYyBjb3VudGVyIG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlbGdhbWFsUHVia2V5OiAnMTEnLnJlcGVhdCgzMiksXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnZm9vJyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlci8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYW1vdW50IG9mIDAgb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICM2OiBjYW5vbmljYWwgWksgcHJvb2YgcHJvZ3JhbSBJRCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHVzZSBjYW5vbmljYWwgemstZWxnYW1hbC1wcm9vZiBwcm9ncmFtIGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJ1prRTFHYW1hMVByb29mMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWxsb3cgb3ZlcnJpZGluZyBaSyBwcm9vZiBwcm9ncmFtIGlkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tUHJvZ3JhbUlkID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViOyAvLyBhbnkgdmFsaWQgcHVia2V5XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnprUHJvb2ZQcm9ncmFtSWQoY3VzdG9tUHJvZ3JhbUlkKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5RXF1YWxpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGN1c3RvbVByb2dyYW1JZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzg6IGZyb20oKSByb3V0aW5nIGZvciBDVCB0cmFuc2FjdGlvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByb3V0ZSBDVCB0cmFuc2FjdGlvbiB0byBDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIgb24gZnJvbSgpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBDVCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZWxnYW1hbFB1YmtleTogJzExJy5yZXBlYXQoMzIpLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gUGFyc2UgaXQgYmFjayB2aWEgZmFjdG9yeS5mcm9tKClcbiAgICAgIGNvbnN0IHBhcnNlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgLy8gU2hvdWxkIGJlIGEgQ29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLCBub3QgQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyXG4gICAgICBwYXJzZWRCdWlsZGVyLmNvbnN0cnVjdG9yLm5hbWUuc2hvdWxkLmVxdWFsKCdDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcm91dGUgbm9uLUNUIGN1c3RvbSB0cmFuc2FjdGlvbiB0byBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIgb24gZnJvbSgpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gQnVpbGQgYSBub24tQ1QgY3VzdG9tIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCBjdXN0b21CdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGN1c3RvbUJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIGN1c3RvbUJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICAgIGN1c3RvbUJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oe1xuICAgICAgICBwcm9ncmFtSWQ6ICdNZW1vU3E0Z3FBQkFYS2I5NnFuSDhUeXNOY1d4TXlXQ3FYZ0RMR21mY0hyJyxcbiAgICAgICAga2V5czogW10sXG4gICAgICAgIGRhdGE6ICdoZWxsbycsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBjdXN0b21CdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIC8vIFBhcnNlIGl0IGJhY2sgdmlhIGZhY3RvcnkuZnJvbSgpXG4gICAgICBjb25zdCBwYXJzZWRCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHJhd1R4KTtcbiAgICAgIHBhcnNlZEJ1aWxkZXIuY29uc3RydWN0b3IubmFtZS5zaG91bGQuZXF1YWwoJ0N1c3RvbUluc3RydWN0aW9uQnVpbGRlcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICM5OiByYW5nZSB2YWxpZGF0aW9uIGZvciBkZWNpbWFscyBhbmQgcHJvb2Ygb2Zmc2V0cycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBkZWNpbWFscyA+IDI1NSBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDI1NixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgZGVjaW1hbHM6IGV4cGVjdGVkIHU4IFxcKDAtMjU1XFwpLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBuZWdhdGl2ZSBkZWNpbWFscyBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IC0xLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZWNpbWFsczogZXhwZWN0ZWQgdTggXFwoMC0yNTVcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5vbi1pbnRlZ2VyIGRlY2ltYWxzIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNi41LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZWNpbWFsczogZXhwZWN0ZWQgdTggXFwoMC0yNTVcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHByb29mIG9mZnNldCA+IDEyNyBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZWxnYW1hbFB1YmtleTogJzExJy5yZXBlYXQoMzIpLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMTI4LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOCBcXCgtMTI4IHRvIDEyN1xcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0IDwgLTEyOCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZWxnYW1hbFB1YmtleTogJzExJy5yZXBlYXQoMzIpLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogLTEyOSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogZXhwZWN0ZWQgaTggXFwoLTEyOCB0byAxMjdcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVxdWFsaXR5IHByb29mIG9mZnNldCA+IDEyNyBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyMDAsXG4gICAgICAgIHJhbmdlUHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcmFuZ2UgcHJvb2Ygb2Zmc2V0IDwgLTEyOCBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0yMDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIHJhbmdlUHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogZXhwZWN0ZWQgaTgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHZhbGlkaXR5IHByb29mIG9mZnNldCBvdXQgb2YgaTggcmFuZ2Ugb24gVHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMjU1LFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBib3VuZGFyeSBvZmZzZXQgdmFsdWVzICgtMTI4IGFuZCAxMjcpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZWxnYW1hbFB1YmtleTogJzExJy5yZXBlYXQoMzIpLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMTI3LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbNzhdLnNob3VsZC5lcXVhbCgxMjcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICMxMDogdTY0IG92ZXJmbG93IHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYW1vdW50IGV4Y2VlZGluZyB1NjQgbWF4IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNicsIC8vIDJeNjRcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGFtb3VudDogdmFsdWUgZXhjZWVkcyB1NjQgbWF4Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBhbW91bnQgYXQgdTY0IG1heCBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTg0NDY3NDQwNzM3MDk1NTE2MTUnLCAvLyAyXjY0IC0gMVxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMTg0NDY3NDQwNzM3MDk1NTE2MTUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IGNvdW50ZXIgZXhjZWVkaW5nIHU2NCBtYXggb24gQ29uZmlndXJlQWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVsZ2FtYWxQdWJrZXk6ICcxMScucmVwZWF0KDMyKSxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNicsIC8vIDJeNjRcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogdmFsdWUgZXhjZWVkcyB1NjQgbWF4Lyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=