@aztec/end-to-end 0.0.1-commit.f295ac2 → 0.0.1-commit.f504929

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 (208) hide show
  1. package/dest/bench/client_flows/client_flows_benchmark.d.ts +2 -2
  2. package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
  3. package/dest/bench/client_flows/client_flows_benchmark.js +39 -23
  4. package/dest/bench/client_flows/config.d.ts +2 -2
  5. package/dest/bench/client_flows/config.d.ts.map +1 -1
  6. package/dest/bench/client_flows/config.js +18 -0
  7. package/dest/bench/utils.d.ts +5 -4
  8. package/dest/bench/utils.d.ts.map +1 -1
  9. package/dest/bench/utils.js +13 -8
  10. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
  11. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
  12. package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +27 -18
  13. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
  14. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
  15. package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
  16. package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
  17. package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
  18. package/dest/e2e_epochs/epochs_test.d.ts +15 -7
  19. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  20. package/dest/e2e_epochs/epochs_test.js +86 -39
  21. package/dest/e2e_fees/bridging_race.notest.js +1 -1
  22. package/dest/e2e_fees/fees_test.d.ts +2 -2
  23. package/dest/e2e_fees/fees_test.d.ts.map +1 -1
  24. package/dest/e2e_fees/fees_test.js +16 -16
  25. package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
  26. package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
  27. package/dest/e2e_l1_publisher/write_json.js +1 -7
  28. package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
  29. package/dest/e2e_p2p/p2p_network.d.ts +4 -3
  30. package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
  31. package/dest/e2e_p2p/p2p_network.js +28 -7
  32. package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
  33. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
  34. package/dest/e2e_p2p/reqresp/utils.js +177 -0
  35. package/dest/e2e_p2p/shared.d.ts +20 -6
  36. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  37. package/dest/e2e_p2p/shared.js +38 -18
  38. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
  39. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
  40. package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
  41. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
  42. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
  43. package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
  44. package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
  45. package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
  46. package/dest/e2e_token_contract/token_contract_test.js +20 -10
  47. package/dest/fixtures/authwit_proxy.d.ts +15 -0
  48. package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
  49. package/dest/fixtures/authwit_proxy.js +30 -0
  50. package/dest/fixtures/e2e_prover_test.d.ts +4 -4
  51. package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
  52. package/dest/fixtures/e2e_prover_test.js +41 -45
  53. package/dest/fixtures/elu_monitor.d.ts +21 -0
  54. package/dest/fixtures/elu_monitor.d.ts.map +1 -0
  55. package/dest/fixtures/elu_monitor.js +102 -0
  56. package/dest/fixtures/fixtures.d.ts +5 -1
  57. package/dest/fixtures/fixtures.d.ts.map +1 -1
  58. package/dest/fixtures/fixtures.js +6 -0
  59. package/dest/fixtures/ha_setup.d.ts +71 -0
  60. package/dest/fixtures/ha_setup.d.ts.map +1 -0
  61. package/dest/fixtures/ha_setup.js +116 -0
  62. package/dest/fixtures/index.d.ts +2 -1
  63. package/dest/fixtures/index.d.ts.map +1 -1
  64. package/dest/fixtures/index.js +1 -0
  65. package/dest/fixtures/setup.d.ts +43 -25
  66. package/dest/fixtures/setup.d.ts.map +1 -1
  67. package/dest/fixtures/setup.js +90 -169
  68. package/dest/fixtures/setup_p2p_test.d.ts +16 -9
  69. package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
  70. package/dest/fixtures/setup_p2p_test.js +40 -29
  71. package/dest/fixtures/token_utils.d.ts +2 -2
  72. package/dest/fixtures/token_utils.d.ts.map +1 -1
  73. package/dest/fixtures/token_utils.js +12 -8
  74. package/dest/shared/cross_chain_test_harness.d.ts +3 -4
  75. package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
  76. package/dest/shared/cross_chain_test_harness.js +24 -24
  77. package/dest/shared/gas_portal_test_harness.js +3 -3
  78. package/dest/shared/index.d.ts +2 -1
  79. package/dest/shared/index.d.ts.map +1 -1
  80. package/dest/shared/index.js +1 -0
  81. package/dest/shared/jest_setup.js +41 -1
  82. package/dest/shared/mock_state_view.d.ts +86 -0
  83. package/dest/shared/mock_state_view.d.ts.map +1 -0
  84. package/dest/shared/mock_state_view.js +186 -0
  85. package/dest/shared/submit-transactions.d.ts +4 -4
  86. package/dest/shared/submit-transactions.d.ts.map +1 -1
  87. package/dest/shared/submit-transactions.js +9 -11
  88. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  89. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  90. package/dest/shared/uniswap_l1_l2.js +24 -22
  91. package/dest/simulators/lending_simulator.d.ts +1 -1
  92. package/dest/simulators/lending_simulator.d.ts.map +1 -1
  93. package/dest/simulators/lending_simulator.js +4 -4
  94. package/dest/simulators/token_simulator.d.ts +1 -1
  95. package/dest/simulators/token_simulator.d.ts.map +1 -1
  96. package/dest/simulators/token_simulator.js +3 -24
  97. package/dest/spartan/setup_test_wallets.d.ts +9 -2
  98. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  99. package/dest/spartan/setup_test_wallets.js +93 -35
  100. package/dest/spartan/tx_metrics.d.ts +48 -2
  101. package/dest/spartan/tx_metrics.d.ts.map +1 -1
  102. package/dest/spartan/tx_metrics.js +310 -6
  103. package/dest/spartan/utils/bot.d.ts +28 -0
  104. package/dest/spartan/utils/bot.d.ts.map +1 -0
  105. package/dest/spartan/utils/bot.js +142 -0
  106. package/dest/spartan/utils/chaos.d.ts +79 -0
  107. package/dest/spartan/utils/chaos.d.ts.map +1 -0
  108. package/dest/spartan/utils/chaos.js +142 -0
  109. package/dest/spartan/utils/clients.d.ts +39 -0
  110. package/dest/spartan/utils/clients.d.ts.map +1 -0
  111. package/dest/spartan/utils/clients.js +90 -0
  112. package/dest/spartan/utils/config.d.ts +42 -0
  113. package/dest/spartan/utils/config.d.ts.map +1 -0
  114. package/dest/spartan/utils/config.js +22 -0
  115. package/dest/spartan/utils/health.d.ts +63 -0
  116. package/dest/spartan/utils/health.d.ts.map +1 -0
  117. package/dest/spartan/utils/health.js +202 -0
  118. package/dest/spartan/utils/helm.d.ts +15 -0
  119. package/dest/spartan/utils/helm.d.ts.map +1 -0
  120. package/dest/spartan/utils/helm.js +47 -0
  121. package/dest/spartan/utils/index.d.ts +10 -0
  122. package/dest/spartan/utils/index.d.ts.map +1 -0
  123. package/dest/spartan/utils/index.js +20 -0
  124. package/dest/spartan/utils/k8s.d.ts +128 -0
  125. package/dest/spartan/utils/k8s.d.ts.map +1 -0
  126. package/dest/spartan/utils/k8s.js +381 -0
  127. package/dest/spartan/utils/nodes.d.ts +40 -0
  128. package/dest/spartan/utils/nodes.d.ts.map +1 -0
  129. package/dest/spartan/utils/nodes.js +461 -0
  130. package/dest/spartan/utils/scripts.d.ts +30 -0
  131. package/dest/spartan/utils/scripts.d.ts.map +1 -0
  132. package/dest/spartan/utils/scripts.js +81 -0
  133. package/dest/spartan/utils.d.ts +2 -260
  134. package/dest/spartan/utils.d.ts.map +1 -1
  135. package/dest/spartan/utils.js +1 -942
  136. package/dest/test-wallet/test_wallet.d.ts +83 -0
  137. package/dest/test-wallet/test_wallet.d.ts.map +1 -0
  138. package/dest/test-wallet/test_wallet.js +214 -0
  139. package/dest/test-wallet/utils.d.ts +41 -0
  140. package/dest/test-wallet/utils.d.ts.map +1 -0
  141. package/dest/test-wallet/utils.js +71 -0
  142. package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
  143. package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
  144. package/dest/test-wallet/wallet_worker_script.js +48 -0
  145. package/dest/test-wallet/worker_wallet.d.ts +52 -0
  146. package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
  147. package/dest/test-wallet/worker_wallet.js +151 -0
  148. package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
  149. package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
  150. package/dest/test-wallet/worker_wallet_schema.js +10 -0
  151. package/package.json +46 -43
  152. package/src/bench/client_flows/client_flows_benchmark.ts +45 -57
  153. package/src/bench/client_flows/config.ts +9 -1
  154. package/src/bench/utils.ts +15 -8
  155. package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +33 -23
  156. package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
  157. package/src/e2e_deploy_contract/deploy_test.ts +3 -3
  158. package/src/e2e_epochs/epochs_test.ts +129 -93
  159. package/src/e2e_fees/bridging_race.notest.ts +2 -5
  160. package/src/e2e_fees/fees_test.ts +24 -39
  161. package/src/e2e_l1_publisher/write_json.ts +3 -8
  162. package/src/e2e_nested_contract/nested_contract_test.ts +7 -7
  163. package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
  164. package/src/e2e_p2p/p2p_network.ts +49 -17
  165. package/src/e2e_p2p/reqresp/utils.ts +235 -0
  166. package/src/e2e_p2p/shared.ts +66 -23
  167. package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
  168. package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
  169. package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
  170. package/src/e2e_token_contract/token_contract_test.ts +27 -12
  171. package/src/fixtures/authwit_proxy.ts +50 -0
  172. package/src/fixtures/dumps/epoch_proof_result.json +1 -1
  173. package/src/fixtures/e2e_prover_test.ts +43 -52
  174. package/src/fixtures/elu_monitor.ts +126 -0
  175. package/src/fixtures/fixtures.ts +10 -0
  176. package/src/fixtures/ha_setup.ts +186 -0
  177. package/src/fixtures/index.ts +1 -0
  178. package/src/fixtures/setup.ts +120 -233
  179. package/src/fixtures/setup_p2p_test.ts +40 -44
  180. package/src/fixtures/token_utils.ts +10 -6
  181. package/src/guides/up_quick_start.sh +3 -3
  182. package/src/shared/cross_chain_test_harness.ts +24 -34
  183. package/src/shared/gas_portal_test_harness.ts +2 -2
  184. package/src/shared/index.ts +1 -0
  185. package/src/shared/jest_setup.ts +51 -1
  186. package/src/shared/mock_state_view.ts +188 -0
  187. package/src/shared/submit-transactions.ts +11 -16
  188. package/src/shared/uniswap_l1_l2.ts +26 -33
  189. package/src/simulators/lending_simulator.ts +6 -4
  190. package/src/simulators/token_simulator.ts +6 -30
  191. package/src/spartan/setup_test_wallets.ts +120 -25
  192. package/src/spartan/tx_metrics.ts +232 -9
  193. package/src/spartan/utils/bot.ts +188 -0
  194. package/src/spartan/utils/chaos.ts +253 -0
  195. package/src/spartan/utils/clients.ts +100 -0
  196. package/src/spartan/utils/config.ts +28 -0
  197. package/src/spartan/utils/health.ts +255 -0
  198. package/src/spartan/utils/helm.ts +84 -0
  199. package/src/spartan/utils/index.ts +68 -0
  200. package/src/spartan/utils/k8s.ts +535 -0
  201. package/src/spartan/utils/nodes.ts +543 -0
  202. package/src/spartan/utils/scripts.ts +99 -0
  203. package/src/spartan/utils.ts +1 -1246
  204. package/src/test-wallet/test_wallet.ts +306 -0
  205. package/src/test-wallet/utils.ts +112 -0
  206. package/src/test-wallet/wallet_worker_script.ts +60 -0
  207. package/src/test-wallet/worker_wallet.ts +213 -0
  208. package/src/test-wallet/worker_wallet_schema.ts +13 -0
@@ -1 +1 @@
1
- {"proof":"0x00004d6006f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a2590000000000000000000000000000000000000000000000000000000000000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd4600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cf1e314549c5109330000000000000000000000000000000000000000000000078ab65cae0766dac4000000000000000000000000000000000000000000000006d9729dd2114d251600000000000000000000000000000000000000000000000000025bb48088e2d6000000000000000000000000000000000000000000000004112c333273480d9d00000000000000000000000000000000000000000000000e79ddc992614451e3000000000000000000000000000000000000000000000005d880c4e49e3909410000000000000000000000000000000000000000000000000001adc707a50e7500000000000000000000000000000000000000000000000591960a3c52d5a331000000000000000000000000000000000000000000000005d69c43aaa65acc860000000000000000000000000000000000000000000000011ce4d0df71d9b0da00000000000000000000000000000000000000000000000000007c4b84e96f1200000000000000000000000000000000000000000000000e796d0a9ec64b048d00000000000000000000000000000000000000000000000a9f1811bacc20b1ef0000000000000000000000000000000000000000000000081959aa974bf5661900000000000000000000000000000000000000000000000000014ac071abce30000000000000000000000000000000ca9d55b6e986c398073827360972cbdd6900000000000000000000000000000000001099819f900ee75e8a6ab54c59fa4000000000000000000000000000000081180a8b96072c3f4246e9a036d07f3507000000000000000000000000000000000027d2cbe77a3e0edefc570e90c90b9f000000000000000000000000000000d6ee6d7b1ba024766d6f835521249b7ae4000000000000000000000000000000000016a0da7d14c7230116a9948f6550ca00000000000000000000000000000019227c5f9b9bc32f21583696973ff92ffe00000000000000000000000000000000002e72b67d18384e0ea627c38592ab76000000000000000000000000000000f4ec1a574da16cc52af9cfe52a0a88ac0800000000000000000000000000000000002dd342a68d2d19b030ec0b82734484000000000000000000000000000000f24ff72c85a62ed5b9cdb3ab52878e5d6600000000000000000000000000000000000f7afb370a128f12d63e3649ae47790000000000000000000000000000004b35876712ed72f6999ccf4346aea9dc8800000000000000000000000000000000000b9c4ede9e05409f4df0b886e12a1e000000000000000000000000000000f4338b85257350c3bbafb99d2c1464cb8100000000000000000000000000000000002efbe244cd2cfd9aa0c8f71e50c96200000000000000000000000000000054f2bc452d87e94668fa54fdb54790c9b0000000000000000000000000000000000025980f026372c596860eda2a791d9b00000000000000000000000000000047dd57b3275e8f09905f26b7bc44e48bba0000000000000000000000000000000000010988e60c8f065cf95a1c9a292364000000000000000000000000000000c9119a149e8374416e40f7586311a3861f00000000000000000000000000000000002ad3d93fb74b1be165a915ad72a3380000000000000000000000000000000148b87898085b1b8b915c1878b2a188d000000000000000000000000000000000002a91ee00ef56a5964ff759ca2990ec00000000000000000000000000000091163f22963ea9894fdc40b2516296029f00000000000000000000000000000000001db9fdde7620ad93d46e0fad2cdd1f0000000000000000000000000000005ce65ed82881f4f78356cbe6d94699849c000000000000000000000000000000000014250c7cd0c960952568293d732d20000000000000000000000000000000cde964c7dbc45d7bea0e22c409d3f4bf960000000000000000000000000000000000016cfaf8940e476cdc1852d5a9172d000000000000000000000000000000ca8d4a2f2ec921c4b8f591c2c27dbdd8ae000000000000000000000000000000000027d9c460264941701fcd49bca2b2f61db5f435f1c9b1b0f491d38cf071b8cc67cb453563b2b60c99daaf55a85360d412ae5a3cef67ee78c3be7229910f9f90c068a3131606ba84aa07463e47ac9f2d2fa7f383cb9bda2055d025ba59925a45d09bbc3abf2a607ca649a641fbf19225033120e4db3ca51d56e3ac61527718a0a5f9d106973575780d8803c89bd9e7be0fa40d87661532cbf29108288ae6a1ceae9eb3fea4d2c7a767f4196a8d4117c52bd771c13a22a6986d53dc0734cc775e2b47c6538d0dd5f82ca62ea90010607802774fe2ae0ded6cc0fb00f591b98a8a17e9a1b0592973bcef46339b184bf1660220da8db31103b2f88257f3a6a49c41ed8895a8c759621d5994e7b71b3959c72c4290a83a957c5d7ec3305efc4137c921bc019382bb97aa434a5b206e60258a2c6283d5e2fa72db956e03a261af9807fb352d8394e8a3f8f497604c586cc43808ba9508f19dcd2c88ebdf68f7faf36d5a4ec4b5355c318734e8273a864d923c0d122ead90fb432d9beda2e8ba40fd5132ba52aa3def71f2893378e49b0c65eb0b88e36f6e25b4d27c975fa867555b51cbfd9412744819e753db95c7fa1087dd0965cf48bc50a9e96cbc1b1ce8b2ca27132029dc01101c7e1a13cac34ce8fe0128c1d28e4d69f5057c8eb4de3cd1406dbdb46f45881b41481faf3942ad75aa5612ce5af105c235ef077fae32c577a820333addc7d22ee9917dfe1823b8ff645023a789b1287e074fc0d44e1ddf5c64dd272a6ab61cdab64b9c22e95a0beeaee52b960f0eb444467e546c409a7def039a1ffe2323c7609b807d184b0207cecef406f5e7a413f18d01a6c9cd20fddcee991b2e66c646d2133bb4f296ba1465fb042e3308b159399371602a4600934b56b48c93e145ef89b8ce32e0c4319420852a260fc934bb5b2ddc0e0487fe59a88b074f579df8bc93218b7a750e7656885a450e7e8e3acc01c991025dfa5c3a0c733c02b51b4596ed1b6cca3da27a5aab6f81059fca6c74e504744b8e4f4fcf34be13c1c641e0fa69cec87fe2e61d3828f5ca2c3dd4e23ab8365dff18bf503ff9298b0f7cc5f79640672faa67f6c15a82dd6019b949fb94e03235adfec37cddf6e0c2db7803662f70f700a4134f05db1b7f331aabb24920355a935d257979d043b6f419fb652bb0ac3354a5cad5c22ce0b029083005d775aec13fe5215f2998092ce9d9c6b59e876900ba4a218b02112eabdc30339b7d9b74c357275ee52c2e92e9f840fee659f063205ee913b8771108cd7205061a27fa68b0a5d11ee01390ecf9db47180fd044e5b8e68f20876cb59d884a0634bce681ce910d3839decccbb99548e4b2c48ab58008138387a88edbd3bf541217acce5c99b311743f0a885ab4fc5be60dbd12e3691c9fcded433f2f23cfb02b5baaade2dc7bea9687c53ae5cf93f89ddac6bd8a898b1933a87ad4bb9a16ce069c746023a2d0aa491466b442061961118dcd93432104a203dd855a6a75268d06ef585e2f552d811ca934b2a17e7ce192d56bccdd8262e621a8cc0be364cbd4119113909bcef03f3d310d79c12987f7e2b9a5dd5e76438542e66c6ffb48a32f0baca42f56b4d0387f8ae9548347a56c0b7fed358db3e8a6b2267f0f4186b6a305bab73106ea0559c0c38c8b8f91b56ff8826107e411a14512aa75d9dfea89e51233560d096fb5ede83cb4925de73194869a980b0e3e4f362125d5ff962c13e60b7b5445901eb8aad7c273af9ad2154914b6d87791dee5348803b5f07b63cacc0fe976fd85339a6192505b8b1bf27e0a3947b87e57b803e091afe80a04b88f370722c07c87b4163022c8a45916f0232d73770f3186094533fa2cef9cd818384c0ddd0c4b7802230ae60738f44ac6dfaa3389a3fbbb103c5948ee0262c45f1c4619b30f1fe28037be4f630cc577705107bf585c8183c4b74fe16b9ab6f8c6dba016585ba8ce2bf3e24c49f75fedfc588b10b3d46d4b400c49335b6cee47ca48ed1aeb8bdfd317556091d058b2d82713ddfc91adae10e46be3d90c02bd11c8761e10118eace939f78fb4b27a698ec4e0660bcc540a7c6f921152185a748d5932ea10622bbbc32f885edec3a69cee3773be88a2d58199243b961efb6d4f85468f5d1d3b7315511da9a1138808b18e684baffb1ca91f77901e9928b5e31492e037600e15f1818fcf0970b973bbf36363a463c156abb1d417f1b9e674720beb55647c1bc7e1ef4a8fed5d330baef509cace450e5a5284728d158b39729aa5c09017f21ae28c00e7d7c53ff73e934226723e2f54ff4d20335249473988d3c769e0866720b787e351441001b269c93c71a16a4308f079e8506fbffb3e8fcdbd279dc03003b0e7b77b29093846aeb08ac57b63e9e6ca5da9ff9a92da45ad62a2851dce1617d2a88bb172e575a8fa2ea2b2a73947d8e0bd1e5258fe80b1f23427df5bfd1d0c22f8ca454458f49c05d75a7e015a7adaac6b6a680f2a1f847b8f163a64714b156ee53bd2b5bc153cbac4b9b180b5eda314f86176b9c3f848aff8967e1be2460e45a56ef2c2e5d2a6a432d6b68f99ee6d5bb23934cee0752286dc5e3bebf0b51fd1057ecbe5cdb0777521739a2327d621a2dbb14cf95d64fe5781595e63dead24cf5131c82145bd4d92ed504e9a60893596cdf437fa87481fbe335d33320fe42a330d852b76c0aa33dcb22045d4124e63869a825b672655be11f1539e7fd7ec1d925673b23327ac733382033d7526b09e7816787b77f4025dd8ff9560cd39b607474d881e61d07160c81c07df3d19c9ef9279ed9b9a87fd1b302f2785e6d030135a68128b627337aae616fb0c44ac0904a728e56f32b48a05c43fbca7193b3c0cbaee34a10be73cb5efb067e0a6f639fea08c4cfd9054de1dbcf775f97690502d6c3802b5407c5bb25ef4c51c82dd15622eff5c0dc883975d210126340293c608be656b21422672140c9e218cd85d7a06d0a212266afda817112a23263c790319fdfc82e8ddc9bba8ac8fc18ebb4b74655ce6a87e4fba40888f391e4483a22f17cb0e241ad558f67f921a28be36647e025291b8c3563c0d4195eec985b4b7f31cebd69fd1277c3b71f6a95c2a95745799bac4bfc84d2d8180a3352d6e7c5ec11e9470e104ed350bf8adabf8a5fb98e720f31d8d43b89260c2edb61fd9200a002b069ac3f27375d0a7a99c30137298490a133441e1659a869a6a1738969f55650ae5e20015818c4abd45165534290130c85af0656687023c6771d9b8e96507c02b0afa988c0a3329876aa1cfadbb760660dea99f70828bfe29c5272b7b128f220708fedb4747e814da49a8223d67d398335cd60746db92f3bc2fb4dee71aeb362bc028e3a57b7c3b084aa1a3d7d091fc348d7e6c66ad39307b7bb150b023d76a017cbd7259a19175f3d12a4049dbb68cd9bcc1d90e247fe3e7575b9be5548ecb1303e4899b05ed3fe96c6daa0159a41e5caf66600d0fe9776113d4ec10e32a4a1f17c4577e3e940b49c068b65f30d171a3ed813ec34c3c6a891f76c3aada0b851003e6d72ee3374d19ddd79b82631d45934204c3707e2c53f6249252b1efb95e1b944e13ea3442a2b425c64caa62e80d5a8770526dff7473d4f980773b3087040fb1e72eca5d56620add7fb2772dc91481d845d7e69c2cac5d11bfe8476cddaa119a19be2f7d19a0d6cf00dde3cc7727b829497629abc11ca4c2e173169b12bc284478c0b48994489cb12d0313b8bb5fbc3f397e6433fd13e6f20a9945a128441a52d9e2b37bdb97aefff765a8757deec39f6da1e2c5221d6e3eebfafd98f1471356c5e502404156f8ffca15d9020bc4c34a9f37b35a8759ee0dd42cc5f01eeb00fd87fc66bfc33b91e0f1462a6df820f8d06e5286d8f2b6a8f2f28cdf3b869e2347e75edb5dade6a2341fd6119ce9b236e2f8b103c95112de486515b7ef021625dd028a3009bcb2001879d0656d3f538b2181096e10afaa8741f69ae7149a9620e4005c11c98c438e7d9a9d13eda86a81031e59d5297df58ab48c33a22fc0e00e44373fb8eb35fb90540370844e2368e67f5f51f296af41afb124c5790c307f19a15d5e07a6d8615b623e0e0938b71797048cd0124124983b6ee83f476917c80aa5d7e6ff05d2e6a0871beaddb9e6cedcf9c291fe353896accd666121822ea2184f582f6ac8ec7dd9219b915ec779ee54f5d3cd398680fc81412943f8a9285f09eed8558d9a143946f77d90e49643e4088cd905eafbc32c117491ac81bd7d8703789147fc529acf0d61b7a43545a58a776d881fd9b88b39424b5ffb2c29bd6003bef49bdf90fd9119c2d3b1dbfa1f21464f9429a7977716873c9f4ce112777b1a9dc0f03761819893c52014c0e734b1bb58eb4e8c4817b727fa3766e6b5da8f0e45d6ef3bbed7662348782f6a74fe492711a610751aac932e014c32a3da7c312c73dbe8d0e04868315b24722c96b397eb20f4f071c40c58db960ff6acad6a552673df936d8d40e23a027a917fa2779fc7edb284a155773c725cd73955ea7abc2cc4889333eaa6809996e123959a3a3f8d83c96759ce9e3f7c6c09730bbdd98c1aa07c0680a3d9e6dd843d24e7fe49ec9d21a62d54bff6f64a9ee5e08fb11c3a2f8ad777f36bf832803321bc86f1f4a4f72a2eb1fb41913a6cc6dccdbdc340760ffdaff52d1f1245c0d8334d72f5cf99bdac2be88f755d6c37a8214f12bf49e7153b7e75165d3d6920173724eb228e37c3d3e869772d7e982b350e29c07bfa6311e701c78009064faa24e89582b68e68440c660c810f11d316d670f4aa66e05314c04145895b8d875b1b4dccbe89457ebd946fe0523dbe7ddf5fae64aaea32bb0a84ad33f4b8005c00eb2535d0a9ccb8af87ca7f42a78503ab8a07acd630363f2e1a87cb164e41fcf1be838f39a66288ea938fe72275a6db9cfd23b5a51ffd0a1d8ab5b1ceade4fed78376d97a2ae58b1c68c4a53350511df91ff5710ee2fa4e1649055bb19084952ada33df6ea0c8e0f1e549a2f1e6fbf1988fdf00184c98be1431b48ee04df9088e873dd33ef27eb0256512d25f8c0435cf698d52271f82872ec03f71561862b3435535f6e71f1b075d9d544d45ecc11695b695deb45d750026c294d56366e281ab66f2dd3994a5ac3a14ce157aa5d566db035b00aebc0f801e232803cca81f368079508e3a55a9e8c0914d719f7dcab5c4540d050097c61f2e0137a33b9d4e9c67c0b93a22a3b77bed25dac563925b1077627300712f42751b034ec5b3d57085922c3e7e7359bf4694070e43519adb125ea0fa5b964b20a512d95dd6694bd85101318c90fe2e1267efa53c6496c9e076368292c53c4ee56b19c683ea9f5b1fc87532eccdb8fad939f3687f42694b6af100fa1cbc6c27c8102ae94ca0d7c16c9e8ac6ccb18453be033acbf503e4811e59513b058c4ee7defe1b405e22adf7095fc5c8d4eefbb0f50989d6888e6fc9feeea9cf4e198f320a0b0812e27e24b7d3da6e853fdab5c92f85cfd8dd411c6d6c89fb3edb60e4fc3c670c8fc09cedbf16e9c156ef9bdf4f3af22f9901aa20dda1848c8aac42e59984b4031093542cecf7d2c3a039af76683801b33641e348ed611ac1013d83185c118926cd7af617c3ff1f9fdd3837eed0139bfe0d0432bea5f34a65a36a0a873846b028aa1680748beeffe1a802c1659cc25c9acf2f91fe6bb8dadd4436a80b9370e914d13105c4dbeb1bd584ce3987ae2ff62b245d26b2529874d1f49fd9449e6ad61a8993ef077f2bd170851e3eb51ba4639d81ff2fd9196e8d062227d1c1c344e412d030082a057b6dfd0d5036fd87155a2d759bfdc47245d2e55c553ee876dbc509aeaef065e60c37b09b8989af2f54c604047063bc040e07fad0677c2517f56b1b703eec763782336c9a5863ca6e1f2f52346b4586d2447d552f4f8a68cee8d4257b0fe89f35d6b5cf9d1aecfd13e5295f726f06b75a2ed43a0db405b3f1529f2beb899ac04e4b50cf45a7b68765ef92ab03785519983349f9d884ff92583e0120d9a298acd1dd9ee8234b9c35d6978ff9a282f826c41be47e647e48235ba2ee300fa16102f76dde521ddc19d186b73c27ff9b3b341d1d8ccb71664c02b74a4421d22b2ae4d624350dc2cfadb8202659a381c7d458ed1926d8cde3f3bafdc4022dcba972fbff1cbd43002e205287081e346aa39eb981df15dd01008bffe8375a0f7f302db96bbc960c5f1b44186a28c22f3efd2464fb058313bcd623d68cf3ee1424dbf0dd7f14784dc6874ce573e88dec8bf168a30d724f389436c4a1bbf2141a6307ee84eb712e53b73a93361b7ed19949e68884fb50f7782a172716c134e2030140bf394b092573ecfcc9771fe2320b4b4f1e7462af1a510ec78d9317fd51281ab64c26c0b69ff6dda6ec0528186ad0faea1e1f835a8a03d55265c99647d21dc60b01daa3c3a826a71e7a81d424ed4ef70548004185d1c394a6a4c91c75e520a1665d716cc07e8db3490df6f48695e59fd24df7936adf11fd6c76f3b93fc61af47d4f13c560bcd9f66e0be39f31fe9e01f103bda296ca7a24a1369197a2ad04e2eac8c21f92e029ac27cb43e84940b5c07e9612329c5fd30fbb79dbddd0a226da1b0cddcb5ebe352dfef7e8214a5340477d4b63f597bb991de61ace715c7503c9c99ae748d77219ef2c7afcaf2db0a0ce84f0888f8f92834caf45fa72acf81bd0a24d39f36eddbe02a9ff88b0ab7252df0c39b70805c199bc2d72855b069f13f9e8f0990780814ff0852b103ccd7bea5e80e118bbf517223edf1058498f070ffd27cf08f39ba10af54803457db4066b029146c7399e1ef16e54ff7e494e1b02d84c168f6c2a12450279dbc4544c0dbeb745c86fc87632dfe85ca8fc439d7a3053a9b1c63c64bb32940ae3a3cdba614ddd6ff98b102f6fb680684257b655452b3082fc1456ddb5eb551a5652fc46bb553ca9bfe5fd72c710a0413c4b7e5b200b37ee615524093473b99318f268a2ccef91d09ca66aa77bfa32bbc9149076dd272834a4848f29eb304a652567b5f6ee9a2d42a6c431669f71ba6bf58a2a982c1e28c5cd23179ce6f559c5f5132bd2b698b3161724d96335077f67dd22fee9951b852b6f5169f1194c61a9c526f2fbf8f59e3f9d58ccf91a655ab60edaccfa32042fea7b8a4c37f7afa5dad12747f6de96fc9327c4cf0abb75ac2322aa90d87b13816f3db7113c9114f403bc0fe5573ae876d9930e8ea7af5e48125cd50b371d2565e4cdfb5923b279a6dd8230e58e3b5afa585fee6674d6e5716db5a2464abf23163d7a16ca25c7ebbd95f03498337faf402c703b4c0867a3d39cc707d4dece2281551441763c2b90e0cd7fd734a34bccce474462352281c5830502f5e247050b1d1c46d7897740af413cb9c46018f2eeec615c65ab5a7965ec4b35391daacf0413d252d650f28c2efbbe4aac18145370a218b8a1d79e24ae8906fcabcbc530207e7de442ddd569c4763e77a97d200ae2be108367ac43d3d366bc0c36982e38228b2be51f841a9cfdb98c9f42cab2e34ee55afb8ed45b9430eb848967ae9cb2049aba7b95ae916910b49ccc9787901a2ec6f851f8a0ab7021fa43fbeffc93cc06facafaefd92b11704a252d5ad6e16f17ae8a9b1998a561789934b901b4159e03b0fbb480bdfb6f663959c4b29562d01e8a775b9c44b9e1a62d2ba4a2d85685066b847dcb0f8dcc4496b10041d5bc6234e0ecf76497a0193e7e7aa2609b300616b10c3692f12f4b265f2639d408d25dac1acee6c59600a0f01b98fbd5dc463b040214f30d7b358346351c2825f8104f1546f13387059c8b39f07a9c1863194d2b73c577664b978c19b6bcd65e64afd4927e78ec1d8626ecef2116052ace280816fc1b1cc186d0f276153d9038b7b2b3bc077f9c8a3ce84fba4484b000a8d47d19f9e5328cb52ddab8b88ef9abf4e9f84e7fd97df6740733a16d85a98cd4569624b3f2e5ff7f8d254e5ef53286e60c710b446acac2704137a72f156720f855cc0255a3365ce594033b07eef0c3033ce98118f564819ef65801f53bc1e0a34a0e21abc7411fc71c396e42edae13f5f807f7a2f79b8c85f804be41070f664a2c571c164582c928f7991d0b22e25d1f3319f1b60a61f7515b50b5889d9f4bb860b5145a3e6522506fa7aa34c7f87ee7656ee848185591f8f5f483af0ad1485186d31d613ef216c8789674a42073931c81ccabd884b77ba1479cbfa6aa3f3ed1b9a420f7ce535d19d4da400fe4c32c981e2087aa0c29d1f0142ff5a9c153ddca84062e79406b8426c4f97924950b9ef82f6a097abce445a09f7f869030148c9f7a72195870a9eeea8aa29aa93ec2921103c5bd3432207786381afb0ee572f2ceccf0021d5a2ce58679660f61d0d2619a3449489dcdc282f178223ed4f4636cbdfcc2118d31fba11378eb82c9ff5bc03bd69f198fbf63a5f6befb633be1a9e8e2bbdb133751ac604cce3cec313b48633719e9dd0b8a7916771a4b945c48996d13909c2fb952d39ac4adb75ecc2a4cf5db2178ad83ac95355ed862621304fb3d86fac62c61cca81abb5b628bd37472ba4bf4dbb3b2667eaf3b476ad980d87561512d9a10317c74dd2157b5e6181f1ef7c73438b3a4d394c401ce9215d3d03e4d3fe9e8105e648c5c684be8cc1c57c6e7bc70e29a47dd1bb5663d9b49b0b8ff3e7456be1113c8c8eb409d034d5688d6d148d416a0fa3945dc3860f23ff1ee6f4d8ac219118a28944db7061c51457c09bf97c8871a6ba6fc71849ec5baa7420709bc53b21aedfedc384f01d9c01e0091ff2736074143cb080baafff845ddefff7700808e274a56bf03d38c256536603878e346d0f47ed7002e7da6347b63a996f4fff76b2e000b11d6acde02c82d54c02c6093f099b481dce32022d817f21968a9dfd4a623822000dc618333f1929e149b18176c476ae4962042cb735a78a9b38eb30dc629a45947e5259217eec6266b3245b6589abff779e7b07d875fa903304ee96a1c16f5ccb122445362c13a16d2396e55666509342b9a9007337c0f22ab153a07920000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001402f7659df3ce4b0bfa819b34f29c0f800d94162e03d2a4be37a2198f936ed70db4e58202eab407bdba483e989c8111922c71128e041a66da0d33f4835259d402d89783ff57170ab96b3aff910be4d2b64533b63d1c40433ed765c8a94cc6332e5f83b76282da1f46f08356349ad2582f792eb17a2673e895da46e01c2c8f350aab4e3cb5da218e9e596ba882ef9d62d950553b7f4f7ec360802011f5e85ff91bf63aafcdd53c44fe2db368a87455f21216924ef69539245eedfe6c6d32fb261564f88acfb671f82dec451fc8d19fa8a83ceb159999bd06396dba6a273bd093099f70a592e3cd931487dc21b8579419924a55b1eb48acd718d81d2188f854a22d2382f46605ffa664d0bbd3db337760273af98b957ad443d4304a08548aecaa1a4d6ed4e7169cd76a91b9fc30a006c4d32de3b2191fd868422affb2b6425a0e1d408d02105c088eec9cafab13a5c8581e09c0d7b46230ac8ce3eb78a18e0a9e300e2e5755002c308852d2d7a63bb4fcbb44b465bdedbfa618948505cc4b7ba23038d231dc8a11bfd7c078c21684edcb89b585bbe94ff795bbf76ad19642ab2d04c59ae6995141156908b56567f1aa2ff9fde626abda743706f3732c97460da423232162662b2d1ada17aa317cc8eaa705a07664c549b68f68837509f545c4f21f89a1cf2e9bf58f4c3826abd7e36442159374b0b9fbf1f068455ee46d5fab89217b00e1d5b92e9eb8e080ebde50fb3b142f2c7ad82359e56e7cfc08ecd802ab089aa2a8f458d4c5d20d5b4af86d7e93679d733ba41771d2c600b9841c012732215d655092a96f71ea81cf619fdbad73841d58444ee320316dc33a9a6247cc7f00636ddb0f5195c8cf49d66df0d2fa81e71bd0697589d7d16e9d66736e4ab21a1862ca3242544f5944ecfae168e77553b865263a1b5c4015284476549d4341ff0f0a9ff123dc5981de4646f53305305acddbf6879e0cb5e1913a2db655b2c3fb0e471d707375a93f30c500c1e6d84c2482e67f8781e2e7a970a7a5b819c179602dd80ef283ff3b9c6ecc7644d3995492acd0c6b34ce7a042b67ce44de924a5cf2895daf8f1953387d27048afad60b6625707aedfa2280a4dcf7800605534119f0a403b2e983004fdfc563ea25be5a8fbeec9a7977866e39376defe79a02c600816a39dd8f7151193c9acaf5ff453f9fb0f1287a54b886b3a73d22e7a8f350a7423abe64976b74963111ac5d96927dcd77d9c42e226815ef093e7aee71910f2410a4871f6f2f3fbc119cd73de82053a670e2d8271532c74dfc10b6f21e27f6d1623029782b7b3325589642a9b62b5646228f7761dddbfecdbe601dfe68dfdb4b100c68140a2e0c1f8547a8907d10c97228ef4ed84d836ec90895a8041c3b2f18323202006853989462ddd65da3e0fc9f341af8c027f49dfc3b6f450401c3bc61f05651b24f3cbfcb90076d8b52a653d214e5defa2a91106a01dd8b97701e7dad4166e196a20a4d78ee1d4fd6b759ebe21dc4749546367c3c8cc5ede0d04684b6101c3691c0bbaff670529eeccda5bd603065f4badb3b420f7ac3cd6df3cae9ce81427a4594869cc7ef87a05bd16d9fec0755be22d8379ec4455e3673e5e6e296110b58c1fbf16379a111301021f14f72bdb1d6823cfe3c3b0845ef2ecb4e14d1010af6857f22c5a75427ce225894454333b6cc21cbb530b73b62577773d55dd3d110f67b79bff7bf6bc29e6ea7d626e555374bc721c310bb584b06b0489ccc6f50060dcca1e966da7b611ee59a6aab337543b38f5523da01b751fabfcfcfde70a0000000000000000000000000000006e99400a2e669210b323b13e4a559562340000000000000000000000000000000000113587ff735be1bd07037d32afa6c20000000000000000000000000000006d61fb1ba9632b8cbc76132b5b2a4f5dbf0000000000000000000000000000000000264a56b9aaebc291ff766c2368d7b20000000000000000000000000000007fb5b38f675b9dd9adf1119e77bf6d1b2500000000000000000000000000000000001b5f6eecfd877030f4b801591720c400000000000000000000000000000044a28ec206f26f99a7fe98bdfb82bd225d000000000000000000000000000000000002dff7548595122ed0e4f353f5ad32000000000000000000000000000000bbc30b9415db001f70fdd8987beb1c3e9c00000000000000000000000000000000002d8652e9ad4e0a4c2ca8eda205c27c00000000000000000000000000000087b1b7f5e9abe2f8dc781bdac7fff1aa1100000000000000000000000000000000000d95630725a26fe91e15b78056b1500000000000000000000000000000009350c0aecfa2f72e376bf403ec8721f86d00000000000000000000000000000000000c6d69390ac401c6fc8096c173b49f000000000000000000000000000000b9a4dea2978f80a7fd5c8e51be6532ad97000000000000000000000000000000000015ac99e0063363eba179d9bddf370500000000000000000000000000000029692467d705f2920dcf22b32f79fd3be80000000000000000000000000000000000079354a1a7faf934f32b3869c64d6b000000000000000000000000000000f2617d01e89a14e588bd8f6a599b8f9e8f00000000000000000000000000000000002026b9dc6c9c2ea6c9b6d97ad5e7cf00000000000000000000000000000073167a42c43fb98d38ff8f48623b8027d400000000000000000000000000000000000d68131afcb0dd20f4972cf543772b000000000000000000000000000000afaf580c7bf00931cd0c4102f8aaa7fcbb00000000000000000000000000000000000c7217eaf7d8bb18f8748c77bdb31e0000000000000000000000000000000ed9d41f73191606c11301a7b542dcfea400000000000000000000000000000000001fd2713b9e5b9e5117fe3732873c9400000000000000000000000000000091750a4e48f1feefffe3c4cc8dfa11b384000000000000000000000000000000000020c1023a70b1d27bca3d24b06d5579000000000000000000000000000000d74a7d51338e01a28b236c60ff8fbbf394000000000000000000000000000000000004e1232c30bfcce815402234f0713f0000000000000000000000000000006bde145ebdd90ca2a689e65943777fd80600000000000000000000000000000000002df07a18ed3fe8b2c070a57c944bbc000000000000000000000000000000d5b24ca3dc8e1f9d29e2a17ade852f1b7b000000000000000000000000000000000026360c3bda49bc3f5f5093c2a1c5d5000000000000000000000000000000dba886e62edf0787e22c73d9fa6ade05830000000000000000000000000000000000178848e705cb1df7f400459540a5e700000000000000000000000000000025170aa9b693320182c04029c5e7e4121900000000000000000000000000000000000bd42d893c4e1c614c357437d6bc74000000000000000000000000000000c4ecd919483c1a2ab845f12dc62077900b000000000000000000000000000000000022f1c6248535576a0717d01d4bf1ea000000000000000000000000000000965739e421592c66c4afb6565d07df6a5900000000000000000000000000000000000c66b846cea6387827a86b53f06a69000000000000000000000000000000460c41dff84a6bce3104c5f6c492c66f7c0000000000000000000000000000000000064f261a0890bd5ef9598cf92611d7000000000000000000000000000000de718a32a28cfaa98d7295000e72c06fc6000000000000000000000000000000000009015a08cdef623230553bbef5b9ac000000000000000000000000000000b7858366c56a0c3da72210cb7b47ebd3ad000000000000000000000000000000000012c80e071fb1aff3b4afc0d80c0902000000000000000000000000000000b32fcd0ca6d0c4e2a35634876ae6b4bcfc00000000000000000000000000000000002295aec998986d3260001b2652da8500000000000000000000000000000073ea51d2509a870718aa82b7f00e974ad2000000000000000000000000000000000023324c74a3b371c2f5e5b31ccfbce80000000000000000000000000000000e2b8a28a33389a4c09c8af5d4e7422ea700000000000000000000000000000000000041d2e62390a06022c514c42745300000000000000000000000000000002b5f6ed66337998236038a6fff1fc69502000000000000000000000000000000000023d1351f04cd9ef7abe1048ddf6c3e000000000000000000000000000000ce251683e0567843df829e63031f4350df00000000000000000000000000000000002ec340753bd9e99424e8910d75ab02000000000000000000000000000000d35ee5cb042d4aec737803c5dea2630c1b00000000000000000000000000000000000daac357d6549124e57d6eedc0b98c000000000000000000000000000000b0309944ea7e471a09fd971bfb9c36c7e7000000000000000000000000000000000007a368b4c1f6e35c0a480af8414da900000000000000000000000000000021f1225266bea5ab62e97d6c3e2fd7048000000000000000000000000000000000000a9599125c1c84e9f03acd8fcf7a1f0000000000000000000000000000004f93b5557f54eeb37238973013387e6efc00000000000000000000000000000000002a543ca44d941e21b40b2aeaffd067000000000000000000000000000000a3ffd818a85aff4e9590b851012624dcd200000000000000000000000000000000000db87fb229661e5b4f3c1491b7036a00000000000000000000000000000087c95c65ed8c8c03b7ff4c8b83dab94254000000000000000000000000000000000004670b0675c3aa38c1e2fd7d32b6ea000000000000000000000000000000a602a4b43bf305b4c888b9a3ba01964ac3000000000000000000000000000000000012ab08c2a76a1a8f30626d315d20da0000000000000000000000000000005fb41fc6841b45666f000ec89dc579a2e800000000000000000000000000000000002d975efc23a624beb991500f03d4da0000000000000000000000000000004b7702c931ece3321f98d33e85c557ef13000000000000000000000000000000000007bac1ea635e4f038b3a994679d54d0000000000000000000000000000000d079e5da08c9dcb4de83eb932d9c9903c00000000000000000000000000000000000682058115f71bc5f523d1d22e30a600000000000000000000000000000054fd9150dcee9f00d909983a171c0a599500000000000000000000000000000000002d48075b83ac71ac534ae7d2aa536f000000000000000000000000000000ed5a96f25e597e90a24fb0c975b83a94a80000000000000000000000000000000000286dd35274d7ceddfadc89056807f8000000000000000000000000000000c00e574323056ecdbb5d95b5a47edd2aba00000000000000000000000000000000001608e6ba98f975d660532fe37b3a4e000000000000000000000000000000544f7a22b7c1d9abbde125f75aefd6aaa5000000000000000000000000000000000020ea76d9fa9beca8380bb22786eb610000000000000000000000000000007ccab9b2d3cf3fde1b40b5f4b8f805b8a10000000000000000000000000000000000209c01f19dc726d266498735ce39ff0000000000000000000000000000006623a5a32ef26f9cba849c2a3b5d83f4d0000000000000000000000000000000000008b8b0ca5a59ef76e1cf60c225e528000000000000000000000000000000b56ec3076bdb7efb74026f41615800a0d600000000000000000000000000000000001423b8dea35a8c0a50385d1b3fd90a0000000000000000000000000000002d1e81446b8c8b2f0ffc3e938cb93b9abc0000000000000000000000000000000000128e448ffc3b1d09bb6783e8058d6d0000000000000000000000000000007dd79fa7035ce3f454326310495ee858a7000000000000000000000000000000000000efb75639b2a3995e71dd437a87fe0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002f6e89e0c65369b14dcc2c500f1653e2ba0053cde393ff12a24aa7de7199043904f6e693ca4adb84f584bba58973a656fea999d21d2efed64d68ef99bdce42e8224cb7be17d12a3223468b5ad8b342779c65f128f23a4a871ff9ea0dac5f94ac19511f9f9e02b4e6cad2370327ba5cfd9f56a1eb61ecf26002ceaec5956a3e0c07cf7141c8ab2e596ab54faebe21f755ba27fd7827a62aa79077e68dffc9a5db202e77fc3a7b1ee01c71e10b4364e1d2f60b3914f243ce8cd2f618fc654680af1d043d652ea6e0f94a1ff8184d1801b34e194007dbcae2e2cc17bc7a07112d2c24cae6f901fd2ac5aa4b4d5f57a80f4ca19132fdb8394094abb6b644bc1eeaf60623ffd184eb42d69422fe3c8e7e0a5484104237c6d958ceeedf99115ebb23560a4ee4d99bd2cc2d9849764fb6559e84ab8c1d0e7b95035151f352b79276cf9e0b5c1b63ce6c1617492d76d8e142dda684bcb496c4cdde8690daddb45be1dbd127bb04a18858b34bacc49be594a39529f480c2aff0b8b67833e7953543f9a4a0057a24f76635c33bebfbc2781a62109d5210a5b13481ad512ddf9c36489be1c00d8989acb1cf7a2e02d624709d64b4aaecb354be0042c31be8c1a0711005482f27a30debe3a61beec341ea0be8357862e8eef1611d25a3aa5ef24d10e086e55d20781cb4cc82d176856102ed95e23228a3fcc1018c82af19eaff112f49ff2781177c7fab42b6ce9d966bc00cd97599627593135e2303cc474f901e61b9b89027069fc33f61a60b3e3bf3ae214db2fe8b94eccde58ffa6439c880bdd8d36f88d2241abbfe0d66f0d9293cd917e89d821159777eaaf33b161f1a486086ff4731dc16ea174843bc9db2c00b4d44221a51d99201bc6f9bbea6cc0c76750f9ea7adb117f445ef3bdbaeec5f74bdcc560dfb38070d574c5a36868d7e259599d32b44a015d26a96cf4ecf6b87753b90cfde8f7126bf21a2644bd8f4ef3c0496eb9b2fdc200267b60b708a173e0d9cf60d568bb809f330e66d07fcee343a558487037afb041f2f05543014ce39617d817df11c8bc033dca9b7879ff2e94653c5f4b979081c1ad70b66e6e75726d2a35d17bd4f1c63a0da3cf0ce7868061f4a6f0071dda90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006433fe684a939fe75a79663e5496d1680000000000000000000000000000000000000ba38b32961bbbd1dfb4742ae9ed5e000000000000000000000000000000638380b39c287b4e608ce046004a50e60600000000000000000000000000000000002b3900dc5cf28d0d8c086719f213ed0000000000000000000000000000005a49a0137d2c4bb49fb4aa0728b8989e97000000000000000000000000000000000027ebfae78d513cdef72f79f46392d3000000000000000000000000000000ca4f7981894ec601389fbb86e8c0941d7f00000000000000000000000000000000000604b2124e61269498e2e20f005a19000000b3","publicInputs":"0x06f32a63ab1a10c44b40a14c94fd4e693830a91920a63778c91df75b67c3a25900000001221894f21cae5e98d0c7a1a2658eaf169b0688cf8348dc7be4d5a944d568bd46000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb00087e2b1632207a64d2be3430a622118411f15477dcf399a057660b8e566041001c2aa1e8a9c646939d1d0d3a1b789e2eb024aa538a4c7864db736646faf6cc0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e586311f1581539435ce58c90ec4a9d291746a8b33999d1654faffb07f382db2efd3fd6b542f09e9f76c84337f46370f67729ce54c815d35866b4cb2a2672030000000000000000000000000000000000000000000000000000000000000000003f1c36600e57c2c3556b97fe6d9919a7c418380b539dcf74182dacf5baea2e16743433c1b3d551429cfbc09ab7899d4e14d2b5786a3243e29bc9c6c0d76bf10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}
1
+ {"proof":"0x000037401d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb00000000000000000000000000000000000d82c97ccbb9dfb5a09d0a47efd9de0000000000000000000000000000000000bd18f88e1691544daea4ab46e1cfac0000000000000000000000000000000000000000000000000000000000004e300096c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc000000000000000000000000000000967b0d22683d31e5b17e35426a3d6734a7000000000000000000000000000000847ef028539261225473627ddd0f8d18cf000000000000000000000000000000000001216ceaa8b5174d1cf9735d7cac060000000000000000000000000000001b55a7b492f10c0956c2b057f45069ab67000000000000000000000000000000000028a596b117f20bf5fe81a3fe27928900000000000000000000000000000021f20a78cb627a4ad3791652f224adff3b0000000000000000000000000000000000166403a92b86cf8b3786c6d6689bc900000000000000000000000000000054aee4df1be0aab6836278b2e07b6253f500000000000000000000000000000000000bc879c8af743bf9fe8cdb9edf641b1230f3240709381e84dcaef98cfbf65d781b584d8ccbfe86c67ade9d01f0d1d62349c9fe3dee70a5deffc982e456f2e08452c9cb24086d2051d6d3a31dcb5feb06a80455cdc287b36e71f3e7cba51872aa6c8956c82691053f96e283cba283101e6b727abb948ffe5dd37332abf949c841a3579018009e22f6843853710e133017603933ba8842f87aed9446150dc346d51ba93b3fec225511b924cbca4122800aff736906500019bd563c31f395a941de6666bd00f954484288f6283f2f6f7f193782db7b347fe2cd790ec1909d637cd360611d4ac4098134b48c576ba9d68115282242fa373432e29e5434049fcf9a19e6f6d19713297e90ac2ea20c3248852274438d5e01f4cc60bfcfd214d48dc18f59bdb6a7ed3f5f4ad6ef326dfd1db51e997e94591c00c715af82249a35d5420f1aaa2bb1372e6eba18c7a6224d8b5b014cb5dfc1ec646156de9d04768fd6a2a5b7e1a020f879c08f173f1ee3a9d1b32fef96cdab484f2f77d87efdd805afec744e88a06892d542f25f940e2039c9a4216d888dec263852e9a12c298ef408f500f571bdd79b46e3a49a4ef7492ffa3b093d108f129bc8fabc56f1bd2f848a51a29a8499cf8151d4e214ece3c00b7a710e80b0a039c8ed59e60e692cf8947b4cb3b67dafc6c7599349e11dea41f953251e4576ab418a0762c51b94b8b726c0191b9a9fe8deaafa19a763172704b9c741197aebb65892636d263b557f12f352eec433d9e52b9f0360ad000c95507f7dd016e962bc889f3cbc9214f0376e8e056e64000e634e1a6d3096e1e8fe9f8082312e21e6d94f1d49a7228756a0b48c87fc8e0a9024a18220db9aa3bf5bcb0883192f5f8fa9c51f62b15af530f829a3ea8438eddb110db79ea7c319bab353a44f532e18769d01b08b50430744dd274abba184186d0bfd3c1b6283144bfae15c1f5330635e714739208da837a09cc6548bf49ef8c062586d248cd1463fd86b0917b00424441ccc83e278ab68e9dfbc2d3b886cfbc42faabf52a2604e9dcd8596bff41636bbec86f259b2bd67479ead9b4aba8a93357a5c8060e949190d49e27adb980b76d2117206f8a5ecd1b102c7b51d63a7b40617228d75fc4823087485568f2a2cdae7da65634e3b4b0fd5dc25bb70823f701c85d2b5e91d640b654a6b06a3ab103648e577a38aa655e57020109e7e58745728bcfccbd21bc9d92332d81af9e706725153301904f2f2f89b51d46d2c41c89d4cc7e2cf4754bdc53b48232ba09f0695bfd151f1f8a0dd25e0bc5166e0a2ea6c7aa9f46ed8fb66a4609b385cbf47189b9a278d4b181ffc40bb8dc3d04b6c27d85480ad74d4f41f3681f992d04bc504fb15ba4f248e0ac1663b5c21e90a0850ebcc6f6890c5241c91860a6d65c2ed080975eefbf10b40ee825a3b1ebea01e4fd3765c41ef376cc517daa33374c13011b483f96780d7b35f09339eea08ce1d1745d4f02c2b307d9a7dd15c22079fff05ea1b17bb0699f34ac1665e73a08fb4102d9f619e889234104501a7dc81fe10270e8eb26dcfe587d05ea86e1bd2cf7f473d16f5c86017d990fd2ea9bc26f4140bd0cfbe16eb960adbb463e4189316cd4b050dc98d8c429b27b6946c3e36b80c0750e4c6c12da827c39aa8629e9a00ebfe52fe8cff2903c900c94894d83801d821ca58e309cdda4c02298081f66f63986c907cdd945ee8e38b36657e629809331fb9b317be60419780a8863930401073817d8bea66f9965a8c1fea2aed5e3a9a2c71d074e1be8cddd55fb3e7c4542bd4cdcebb4bca1a918f08724b8a5d7837c425bda7eefdc26da5e2e276006a0e3bde51244b367b91345d07dcdf075d920eb504f9e3d87b7cf7af3a1fe71704ccd3cd1649fe0225699b5b52139ebeff6c356109f38d1d029cb870c992752805364c021ae170758e1e9095df679aebb8d900aa1e2d347f767481387a099fa34d17b826c2a811e5e8278f10bd6226d8325c04a4182fae94aae2b8a35356b9216fda7a97435704c0d75b2d8de462467e2e56be9305e40a0e57bea2ba7ce90153e456f2b973dd3570c0c3013b49473b7a4642c226273b0974f765ccafec8213c12d5d6fd61c58a3c27540bbf2b9e727ce8cfc1a3114d0561768c28b8130e5e838f1a2f010a00e2e4ffebab8764089ac794c73a0fc0138fe5273e80d6ee57fed97cfcb8b2a6c728aadd1e979a00dffde8b57f7b5fe05f87ced5cdc0e75820cb49b37e2ca1f97dba23c23237f8161234668379d2e511c6546f086f2758e0df88d03f820f1802ecb2da684859b179ecb35fc21054c9605b094220562896abe675b9ff1678e66f2213e202dbc7198471f8c17f984897e2f9c66027cd8a8bfa36246747ce6d0cd5db6a053f79f8157802823e33d4d43ca179d24555a9d788b681f091697992bbd20c1f34fa5f7fef61a5c47bf770379881ef5a4c6a1dc7c15962ffdbe9ed0eae175d472ab0b631baf01b20eb24950fa7a14c7ab41a9d06d3c867997c64a37e29365db762c2e8298cb2f3eb6695205cb512f74e148268134083e82bc60287af30a3e33935523f74c6c3ae553a9448ad66f1249977a6c25eda4a5395d1aac5c7d5d3e9adf60e7fcdfd66aa46a656fed8bc204ec6ad59f9c88f9ef6f8b44fab34cdb5f48ce14a71e355877a265c59e84f70f1577bd08165a24abc5d89ffd9b31eedd510374639003ce5d6bf0179c2a58e7a10a30764f62bc9e9106a7bd2638054e45b2b77c81c205f614ba4334c11420bcab1f96dce8aa24acbb6c5aae9ae7863a52d7e7956b4e22b7003c18fc1afbdf96c02a67f8588cbf1486118b8428310187b584295ecfb280441d7e01fa2b0326930300b4665c2194cb0103f3e46a8c1dcc0d7dd448c47dfc0f5b2e3dc88ffbfcc7ec23bf76b3f5f6bf44bbf311cc41594db63544b93d14bf7f3c65fc6b86cfd4e65013c7c987f174a180ee17209cf420e790612a74f2ac356f674ca54f4ca0b8334324f6bdaac0c9377beb80138d20e17b7a1e2222ad37a0f416cc9b8bbba4f0c9ea2573ff282b6b9b64a4f808ff6aa5317ec987ca06f5c600699bde6ede4608293322a0b8d9d72b49c53a0de6993e301310f7b7ba8b92a7e5b5c07cb00cacb1dc6f034c39b454ba40df58f09545fe26864cf6cf65f8e59ca32456f4cbe9053c950c2c83d5c830d7c636c0d3d5fd0387a6c23bc0b4f22517d1ac35a8df9794d4dd000041dee56b9e0031f77b25ca46a884ae6df09decf0aed625832f97b3ed970e06128b10229a3b7f38aa50792bc52b7fef704a8d0464ceec284d5a5a272963960326eb718dcf1f03c08f271ad563680064f975381ce54dcd60b11b4232a723c77d02c3654c4cf8eb3f5f98dabe1ce91fe51fb585f66400b76ef886ec214d3d4e1e0322681bfd626f3f994153923af9f6aa279bf8b5917ccee77a2091366b8112a20d6408ae20fb63fcb64a1b1f96e749088801384caaa3830bca35d714e917192527667c80833a84ed70b3bff2abcd9b74e1d9e2f420b30f8c400016024faa696e18e740514afb42f9e98877aacec29aadb819ecf70b5c56c8261593c66957faea05b0c746cd36940c78e330d949827586976213306e50ea6b57c7a0f34cfe02b322b5d053ccfdb77b07b61ec65a33cb204c2aa9ec425d936a4ed11f709930db681569f38f6d04e66fb12e579aeba8fa1e4c6d00ba09100818053a7021ce6f81aa11fc375d0800714e30050cbe3ee25939c3949ead3ec9d8642769e0e5811731931e8f39b443e9e34d398a0dcd7871c1b54c1065cd66635702c5c7c3dc334d5d171f84b3c5f7faf0c57b0151193638465707a88e6b54fe235297da592540913f562778c2e80a201d144b27d8da7ca08ae99114c6a342cc93c4d941998106b89d0124aa6c77734f5ff4ab381453d934e7915ad634c5dd113248db818d9506e3136113496a219b7e1b1d92c1e34fc780f4b87e3b8c5e765b6efe6f2832cd304a6757030c05cdb6bf6f0ef20373baefeb765d5778fdbb5e090cfbc48a8d80c123f09d06f9d083a8fa4a99f47c6a2c54ab9372bf9862625c1df946081f9d367f884528305b15dccd93a85fe4ca37b3ae066d21435dcb4af0cdbcc73608f0fa5ad8ab1a05bf5bbb7c9927f31f03fdf729ec3084f162065cef6b225d223dd0807ce45cca1fbd66c2fe4629404099b8d781bd30e747ff602912ac0d2def73c734657c59531e2d7c3a9f9838022a499570fbe7c86adf0dc54d3f2ef1fd2e59e1d7ff70d2d4154fb270fbb70fb71c0a7b077befde6719b3e662505bfc37b424f6e1b8f0633707445b04fca697d2b9e029c8be3e6535967cae209d1957d4f3bf93e44989d1ab04531aa2a2feaa2bc724675123d1dad0fa2411261528f9ef91782c22874359722d54b62174f2cf4fff40a0aaca3ca3ef4e44a77f66d862d739344a921c7de1fc00a2ea2597b2e29a0bee5fdc657683ca7d1b5321979ed7f39c71c9fc1d9735db10895a10746389aa7e8edd78ec20bbb119248babe90986653acfe640f8d1c4920937eb32f6292d3c0b3e7d2817718dfa934f44f7c269d9673b7254e4ce8ef6562a98ac753ae9bcde69d6713862bce21bdad75e7ed259f93872f895994dfaa79a0363c5363d78f373455a8c0f4475157bb5fa469fcaebb22139e76030f75e2487278071ee51810df76484c3e5488185a33ef4fc2bf59836e567380928c02eb32c29dac2bc2f2d13ebe865a01e8689f9da4f0a08c0ab617a1406ae0c5f04999a001390dd0a2751f743eb8bd4d33eaef53131c8fd4fee098d20cdc00695a2396b5322cb1738ae736216f1b114db99e990dd5a2bb76705c6bccd139fc870b61cd610145451f46ce92691259b6892392d3ba0aab9726d396de2c4bea7cf6b1450eda9160955b7649d7036438a4126d5833d623be71374d649edcd468d666f7bf1846b2a161e6b99ac0d07d99b036bfc8d4080c864056fb4e38495bffb08e7a8049c1d28c63ee84b975624c39955ad785b0ce816d90ed66528553652db5e2da27897d822b26bb9c76b3e415e61dd145c2affee307fb4592784e248945b5e0057252ab61b2d4a7e39e47c1816c336df6bb00bd1dbf412fda941a817ca218019c2c449110415d5fd33c28b8c7edd9bc9b2d3b743698d251c79f09c5cc33a628c8ad4d9350d4132dc90c9c9e95b4003c6692c738905383ef21317541ac6964f45dd7a53482b79be7a28ed7eb33ce70cb76810c0b763a8bfb3b8125d33722a8861e977490700dd3a818ddf8822c9531dacfebed6a473a599287a7846fe6154aad3da7592300bad6bb710bc2e6a04fcba27ca9d6a77f565b8403f117bd5a28f9e1b453cb2a51443280aae14725582505c72784ff8a9689a94098869271031b97d84d8b2f45f2e7a8ee41b264085329471deea8da611900eb1f55043c5d5d36a5a8f4e4e40541e7b59a4f5b57e0f7c96241cec698512ff5ecaad61162bec7dbbaa4a0c629745195941175be77f726454231baf6c6d7725951add6fddc080256846033c9556c91a197b65c54f04245aa9356fcec2a69787a79a435bdcc98a29cc00d20624a2d11eb235ae6fdfb2c34d9c8593b0120ff100f9743b27a109fe3bd273bc67dbb7770661ec2c1d931aa1deee676924473a9d369a705944422aeec57db6f3a1ce24e82c60152e5a3308d97151ba03175d333dfd2d9b2eab6e0fef340a07b453b185312facefb814a5e4120e89dea1986c15118389298ec9787570f515a8141635d9660dfbc4f36157c4930c2da472e0193600adfb35d52675d99e3dd3d85bc9257ed7195031479ac64a93edf1f538a263c9a77332cfcb2179740f551cadcfb6061a8d1da6fd89ee8a09c2a1bb07db0a7ed7b927f7c0dfe51af6b0c1dac1d9d3e7bb5c1f58314ff3eddea73c992d2ed7a45ef6117f08a08908b70932b05c72b211b84d19fbec2a4fc61f00a1b509f43347bab0dab36075bdbcb1d6879e5a5e44f2e36c1b6f2df69b90302334b46ee6b4e347defc48efa97e51a0173b13507513cb0d6d1f29f62ae5733e7ea55f71d3e55cf54ff5a82d36cb43d639e4b9143512f018e516b5026876b79528e8f1eb42cbc6b381b50eb74154150a055a1283969878a375173fd1b1c62731daf637535a290b1717d9f58c77b2785beb51e297b4011a5cdc12c6e4e1570f6de5e964d4bedc21bbf440d17ced5b30e4bfe30b17a4ac013a320e87c9ce9358d6846c62f84f620a033b9c5fe48322f0e3de41c6d95350a873490371320681b5d82f7394bcb22113ea3c69b7057b7821b491147f945c7301b4472af1d0661c4ad1713ceaf1543c46e66ab6fcb8a8738b9051567ceb56b2efc0471a74bd19f7c2254cec6a2f10d94853b2bb0d9328f00dca76854f5b1991b851691e50e90b380f8a8842d8939ca5cd5cbb9f1733c533184d206ca54fe766e08427197573d439b29a48e284766d99e59dedd2fd15ad933b22ac10f777d90e081ace08a1132012eff9c7a621f3a509e82c0ba3f33e906cbbc494b83125f9d06650b518ec4edb63b193031084723e98adfaa4cbbb27c93d7b35ea51405317a54b5f481eaac5d4dd11a08e296c86673346757684c5caf3f01fe726d74b7ff532fde7b402e60b0e87d4bcb00bda5813294b5fccd6583104c15b7cef983f5e50510f4ac4134934b05bd150a742244457f7f4315a86cbface176db18cf863931d993bdac31481d871b9ebc4fbf0519e13731e3752238ae7c218cd8a94fd12341609fabe5d2581866e4a7498a33b7ddb54be930050c84c65caee1d7ff803053529f4bbbe732947d73d5abf41824f7bb103d45fc32b34c8c49ccc0958b87074e6c2b7d2b7310dda03396186e4e9694b9b7eb2c07dd6d4a78cf90ec480d5451f6456c2531fb81713d7e73ce5b65e9e9832e13a9f17c9dadca98fcc91c6c98f6ef2f5e480a16d04951ca7bde9bc1aa9ffd13013c4567e2decc5fbb3781af953b4ac1e7934203604e498b26fd15fae48951496307b306fbd413e0fc0999df3c50e41e81e4d16a32fce06e6a58a9a591d7ff2d4b6c12749d61dbf251a56ca0d973d1838f6cc32de226d4b0d20f985cf8983d9360011402eaf888b6ff0ddbea2c9492928b78e35e003e3b54833b8d0d456187c89dbcace080ae7e0b43aa01166b0545d4374ad490318a5d7a39faf93b890e73f3d56f7e1a157ba5bdd1020cf842f33305f40ad3fd420f3d67e4121d7f92f00bb6a2c01087a5560ac2d79489bf1e342d401f8f34dc12f852072b635384e6ac1c76a924f72ffc74a30abb68c79a2c7cbb012d4c6438902539b67d9c93cec8e0bcdf9865d195b7eece823e918814c65213851fc7d1cb42c54f20771c6adebaebe1e10f047fbc64bf0190b5960aaa9c32c32d68221e6c001bc9298f33c51f0a4ae2e1c1ad94f03566aa814ba1d0487c0072a3037381bd907988c3cffa0b252a9e72b677a6b64956e1c3ccdfeb22201ce22f134144ec63519b89e29b8776018eb8d2b7552930505eccc7d7eefd5c015b5e2c925a2bf332c17fa59aad8bb54fb28a03af550d2226f3df5535bc4f1307184b2f3eef1cb9f0c1bcfd9fe92c11f0cead04c3082770666346c66c406f8f924509e8f588789f7e103a0042da54e90d798eee38370fe5e6f32ff8f5863fcc656cf6cbf5d211768880430d1606f1d3c959186790269c8c619cf203ee69271a570d932a75f7dd90ca51506f2dceb63751cdbd75e9b9923deed45fe705aacbc0322ad09065a332f45d5113adaacb5855e823be6851a42fc65a450e3207e7fb8933c043b7acfe8141e22294db301a0bdb309b263e452f45b76ce7e51033232626e7b9bcc781f34a1ad891a7863c5e21470084e2a46695ae3e7211b2c69b717ccebc5ae03d44f6eb48b551a06ec9aac1734b47e22b9b79a55cd50f3326094514e79204b92256e5a33ca520679613333f74b7c147b2af2ccd2093e4d58dddb06129ad1f5a02af3c44b324a1d908d0b1bcaaa5a72c0195a9ef8f98280861bcd1b58e05c3871307b77f92e151248b8ac6063e0f8839a77a7d98606106988ff12870041d5c562dd077fce999b2e764223c913522f4be6986d1853091cd61cb80baaaff0f7c649cbf4f8f079fb1e850a548c9ca1120092178bbc5390a35b6a85cb627b6ac30ca8bef76cf24b6122b85885ba19e48b21b9eb56f70734abae2c7431d995898586bfce75dda17aff250e6968b574b21610b4835b34303b3246541215c71d219fc2e36211e316fbe722e3303b22d73d33ab2f351e8fbb0c2aaf702d53df5f97873128c29cc7d275bd20898a9803b56329bee77ab0d05f9981b4e7e54177ff2999db00b8c9f201834200303ec7d0955b5f395aa53b8cbe126b9b352d50514b34688223f03c17b00b501c8762e1c44344325fc5a1ec11ba7593fd06a3db105c97608c51dd42b2a8cae2074d2c7886df4ef332c5362c07e1c6f8006bf661cca91aab99418668fc5180f91f8d38680952f286b84e1e474e1e638144f385db37c6b6516d69aa8abe09ae6e2f098127f71dc9354f80091c9686f6f03099d409954522684da024d8b14d57270ebae3aa7255a3d3e0b568e0269e41886819fc89bc5002366f36c43a2ca269202378b89d398099553c09c98195a44003919252ec98b922bbfcea7f56d5cea0c90ec41550fa9e57e2a1112480ec41d51d46d16da89809c30044e710c20335cef8304a4c50425b1ff0c04510594222e1f88009b9bd3bd29d50cbcefc76f19bb20b16981bcf821cdc4a5fa276f6735c7d7c19932a757ea7a929849a03da50d7dee81522b3c346f098d9b7a0687000a0b19c9b25215a97d8ffa26c64f9f69bf9dc422c2d13ae924c9830523f113d6f6b74cbf578ebf9387643a98a04705e2c58107913deecac5f62013746f5a7bce6c05e2ee82e2797cc09e494c1f5559c726c7eb324ef72f32baedd84d92f44424609f41a0417f3b82695f65a7f9135ec5ea377a821624a1badea514b298f4b6216cebe76e7e6976e90678041e7a15c823883e2481386a9b070b0a081e5beb3fa2a7fbcac9a0de04c1261528ad8796bdde20891ec20352ad5523b8e808220fa16254a3daf7a72b6db2ab247c8dde97ac3db8d24d71bae4ebfd0a1e3037176913c8be42a1fcb123aa50799d28c421801a14425612d2c2634dde04c6f955e793db42b36767bb438bd35e419194137b9b7c4c261aa1018397c930334511e764f80c51bc6e79f0b4462de39a23b4db71f8e1eb0904b341dbfa71e50f9adea17d8d2a331a66275123faa18af436ca773b936bbb0e63c080ad5059e6b3d284013d1e3c15af021bc94aac1a6e7697abb88edffb6113d82ae18d6ba390dbbd58531c1f099d6c2a91c2ccf4626a140121930eeae06b13a296b2e1a80702d7efd08afb2818e28e2310d2315d9bea60605735321df837577b7081764a3989cc367c1b316c76777f8714759c8d8ae497274d0781312073e600b521d718762bce44836bbea72a38054cc7e75242b6eca88091d8d46fb04e28454430c08fd25f2857a1f3bd2f5677993bbcd470d6763cba2fc6529ca40e1d96752be033796304b5b95e2a75b7080446dd476faa6b3d5dd959b2a76ea04e0eab9a4f11295ef502e9dd29830d129d31d09e6a856587d36694641f7136578192fc573de0e50ffbbc8d4f0f0bf574344165b95f4c1c6f3362e6ff3610a23ee5daf8bacb21014126ffcf166e5a1c9ad60e3a82223f2ad09794818aa7ce26cb347873fe27d0ffcf63fe400ff70dd51e7233cad2a4d41451e258f0165494fb7d61c7bd574330846048901f46b492670fd05b2ad3816ff57cb9d9e1f6ff921ec06c93763e31f2d51687fa9ded4f81462933e455ad73f7c4787847e7e77c3cb8cbe720121ad0a2240cad647b8c1b429c25b22b90d889dd76570b53562bed0f5f530f3e28d62f020515889858729c101eb18b2c3300f8b5dd3d97628b828bac9783dadf7f3657a2029ff686851d8077f3ee87258a65073c3d63120bd355885347768b371dca45618353bdad01c3bde20d5b493271d06da4ca959689c8df11ea1b1c99cf26d90b8066fd2b03540cda23167f7eea76fb631e86ff305192371a0da4fd9fd331d97e307390316a7f296f64d945c1ad30edf4317ad680f2913213707e8ac1ae138c4f91a371a5e43d5848ee4c47681fa0443b6c21b1340b8cf5da35b64c7508b61c69d06a2ad9ac09742306975eb8b7af69f957a9debaf826cd58e28fa1004d7bbd6e60d847ad494dc8e0cd3579bff0e137fb087c143b70823a5fcc7a93f766055acaf1960558271a9f215d584fcd142113cc7dff6d7008fc27ad5005ad70174789bba1674102f8dafb55e53215eb637c6f52fda2bf9079b1e16402e13ff06261f54e71131fe16f0d4cabaa3ab95dfb593c1ac46b009aa7ffeb71fb843d57ff74908db1d64cab3080aca8ac059208f489a3b9c0abc83cf22e0526df38165ac201be12d13f2b581bd680df45a4ab2b69d16b97193ded7b829232174abf2b57b0d0634f306cd52b44e0514365fe138adc09a9797b7f962b7a7d5c4ed2088d4711ab983dc0eb0f10cba67009c1487dd4a178ac2477fc8f06efac26b22486494d53174b5a507ee53b96bacde952282fc7cf40fec74f7b2c8714d003734454eae18193d5b011bfbf713887ac271705dbbf52f60b798aab781e2e0a9fc18d95090da3604142a2ebce2d5f2cd7a57b7d271d6fea3045a5134a7587e79c5533eddffd290347b8c198132af43c7255b2e3c57b50cf087c2517d33ff84e72bfc3c34c3fd0b4a0cc01b1b0ed73d26eb9eb95cf650963371db6a35efb08f1654b464cfa0b9f0cd34581a67939eaa7b9a87b5b502b3ccb836f009eb5da5ff71db980ba9a9db2852071f3031d0007a6721f14fb3c74f535510d77046fa59e8a13a9f333737cfa8cbf0b805443687a8678321e80ba8c4a77a671770af4112ba8e39fdf475ee35d44e708703dda51b5c4c74fcdf54ec9c3b49464f575875a10f36c4e6c13203efecfab1391488a4a88eca9ad20d99405eec8aecd8a0c13c2454ef58a6efd94123780545360945c2ad36da244a07d55f4879edf37a113ab04ce5497c796ce07391a6e0a8a200d866e9083b19625828fd093f17f19966608756af95f330cca23084c49eee3d1feccf20c6c8285d537fde29e6f63ddcfffe7d3771ea8e0f709bc6b5b14198811be0985d0de150b9148d71422a5fd35623ca1cd8f93a20257e9d5779a505a89e01483712fe6f4d547a8b799763f0d3bde623f7484f69d22df5ba1586b955c44328daf70c164ce963f1276c7e24a0350405a9f2d54d60494c57d6959228ca64f3232158736227bcd1d79d18da4c0cacd4bb5c53957b3f1032a56a98ba00ec555507c9438105f9d9ad8b33f42f6fbf22c9ab3a84fd2e7fafe5525fc8e50ec0498a303ef9a74e7a0eb4ae1a53e132705d4bc208be2636689c2998577ce8bb51c3441f671a537fbf9abceaee7e35ccd96ee07ced7d2bc701900638e424227181e69c2bb7dc0a249fee4c9f98f70d6596491652ccea30e160d58096b0afc3e52e3c2616c62bb1714bd91a9c6f067feda66a9b5f908937c49a431aca4c4955c3c0598f2d932c84ea2bca2fd8b61f36ead421675b5ef3a167f49b7abdff33ae0e5bad421d2892726a75557ced30eda4664c666823c80dc865b1a95f83fcaa826f70036e0f2f7d8cf457863c345b08d528e77a9257f83caa6c04149f669254d3db77c67a0720e9a75d57691708f36591d2185d1a1ca61d2c2b3f47ebc5b6cdb78d7b4eb62fedc57fd72deb59150eb40ddc4bf5d29b055f6d268d9fc9c13a65225f44c704108e1fd52cf5d81af773ae9f2a23eb6177446344032da5e60f67aadffe281bce1985a46fb23f587de1d00cc981cf892f8d32a4221a8d8c0749121bd43b6946b81b1380b588db51f32a9d09e7f2189b06ca68d0e69545aac503adfd83a29bea9505fc3afeb9e11d0b9c618151163dd979bf6a32ae403598edcf68dc49ad7061061f63e90dc541625362963b76fc4b3bf9760b5652a4e78668ff02d83fa40461b02ae7728202beafdbeb841703f467e0d83dfd909f3ecd8be5b1b07901b1a062e100a4b405d0f8b75a1dfa0ff99310d4da652cd13131013f7dc765b6a8e9d45ec816bd712d321ddf8b167bb515ae04433acfd143d993b6fdbcd5364668add4b0d51b0c9a9040babcfffdd0add341551392856f335b913218d88b0febd958ee965717fa8876913b46960863ec32ad62cfdc1eae3770c76831fbd6febb4afbbb1424006c806b45c000d89396bf2a4dbb46f22708bc4d65cdc68d28fa7589ea6463bf1c8742d186eaba1d0ce77f8fc6e56cb297bdfd14f476eebbd4d7ff496a90f66508cbcfb0d0e332c591342db760578687090867fa35e58940d02148b31c6521900b01f00dc72389a9a05893c6dc10473e244a2fcb0590fb8fa6dc65bde2bd2e1d1b8c8546c6d65aed1f2cdb0bbc20bdfe2c9f9dcbd469a1fefdf4ebc21b40e62618b8333b7988aff9ebf25802e4192a698c396c091c9dbd4e594f3e852b40230e2d12ddbbdc7bbe0dcc785f0308036aa3b6ef339d346516ca1ec3d8e155f8be6d08a1ca67b2358f2a8b758f47783f4f34f974deea124920b941068340602efed12f7cb373868484322b652a77bc82f8b2ca3ccc67610294dc83aa9a9c04eedb701d7e4a736dc29b687c119b55b14611670921a946fddac0a9ab699de77632aaae07ed5403f182e4e202051fd4ae3481a221319cdc9e6958f0ea147443de3ab25222b405289e0d05addc5ff61ae69b4cbc069b9ef27a9e3ff37db6b9a4a118c7f5109a0ec73359a8bb6deb507b98ac8da6bc7e1f12b48b4d4f5246eed25140c2dc00279899805474826336b1be018b04de37f82bd5a088dafdf7808141749ccdf002b5e4cb9a33758415cfe2d15a5660dfcc18b1aa4e54ca184557bf30aa29e9cc14946eaef239d83fb7bebc340078e94b57cc1648d78853ce51aeed5a8bbc18102fdcccee178f1c8da645b121e778e5c8f1fc8a233daabbf5bea172cbd88df97b1001dc0612a38c7159acd4c8a3b75a383461520772cc716cb4f65234be05d65c1f1becb411fe5519cb8c9b022b6158177bdf24d65aa778ad0893b1628574610301767d14bec7bf8ad62b4e3340733cc005a444a934b65954de178e59a1c1f11d1cb3f177b7611fc98a0e07dd6e121ef2079c123523b70f976ef5c695c2a798440b9d458bc50fd2745afcac4f5a6958c7ae814dbb4587494b7494b98719507cac0bfb54d3c82395746c616e7a25e63005cd5948fcfbbe3fd8aa9b21ada39223b12d40dc8bb25832445122349e3cf9ed7795f942c34c44282f81d40a9bfa1df4991fee2598345f996ef808adf1b0ec72ccbe17ce688b520fdb3e84bea8c57699482b5d90c534d4c0945fae2deb0310b36c721c490c3536ec93d79aba399967addb1bcca91827b54cf3479b14fa93d70995c94006bbe9b0af7601eab7830612c50218eedfd48b3a229ad3d345552f320120c3e24d9659f423bad70a9be3aa3ce5e00b22b2de41404d37c2ac7424f13526e37ad4042d640c31cabc57b24f72d878f800e2321600093ac31a503ca1c6090c767af78e3c26cb3651d9d49d33c7a8008f0a7ea8c1963dbbc53d145130339a98a79d839b35fdf84eca22619e9327006912196203b3e22a91c62e181baaf86a771d1c39f0c3d0a6c4d2014280971ec22845064bfe5d8d67cae71f725ea8c84f87a127d7a1178ce290e2040270bc41f9ffb71473351ea395808ac920200fd04d484b7e502b6616ee0cfd96c3ddfd6c1cfff316f4a75ea09c94a3ac11d378a7598dab2bc76e8ac09c9a82a2ec47df3b0bcb572c25b106bc37cb71ee911bc841d489f2a0b6d4a9a1fde23d8061800447c0306c18c109f10c4fb3dcd9f091426b1756a8ec97e7c1ac79dfd4fc2b3f89b47bd68a13ceabce414bc9bfc357474d300e4a28bbe77566ac14f45cf07bcfcc9c5d6cb01082800db45568f8f11a59e79eee0b6680d35854cf0cfba4a362593396adf2b008260c014f79f3204f63e0a3f479c38c014f3121056f12133c73b662602f497117fc6eebe870a9cfe3f7f2ef654a6eeb473b8cab1c9010ffc2f1b62ecdd779200bff45b80e8575f5dc4e9bd8ad5b90561fbe2613575753ba6d898612895bd5d628ebb7970d821248fe62e1150175ecd0dd008360aa2df3ecd508ce56f4d738a3206867693760649d25b5e8443dd1eb6d805ebd783fc013fe6679f7af5ed6b2f22b7e66648b897aac615564c70cc97dd10c15c5f40864272a5a9468efda9fa89215dd201087439719ca9c03d69e7c8e289e608d099bc7e1b42406a949528854a603fac705ac5ede99fa6695dc1bf6a08205d92b9a8a768dfb3dc95e2bf73bbb16266cb44d88254c241c0a335f5b0c90f49eb6103dfc6184539d67aacad913a9b12d28f5b9a39430fc5a7bf54c8b12fcadf2f639d01d3559090681727d7aaab1600e6de0adf471a573d03b40b9c1b28e3df2dace28324398453527b8ca9c79b5850037087a896d4319291b0dd22eebd0cae462d8669cb4dfaa864a35c9df0f356109645a8a5a633e0da0b88e0686ab470d03b26f95b0dc8bf6987fc721f6fd440500000077","publicInputs":"0x1d2b0ace7ac4fbf52963e9b24dcc562a0da10fa52b4fbf5e55b2b6d587d8bae4047fbe8e6ab5633664ebd80615a60c25b32093ef31ccb533d403ce748075fe5b00c95e0ceb41951039e1592745ec2faea9866f6eaf01bf189a4463b4143af0930053eeeca2750c390a6b05c04c3eaf7148eaa37fc7f4677b1ea5c58207d438d2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a1eb370e7929f0aa3638be832f05670dde96c539c0f377410bba9040bd0b1f281d963227735128f9f3b7d68bdc36e40df56b99c91d4490af4ad84d3cb072ac0000000000000000000000000000000000000000000000000000000000000000009d5ebb50ae6bb050adcc9b3cf872968e1aa337634853aafcce8e9818e94c25011df24633b43c3d7346227c4b84b70d3fb6c9fa5b2cbb698f5d500d60456adb4e30bd18f88e1691544daea4ab46e1cfac0d82c97ccbb9dfb5a09d0a47efd9de16c6f7ce44c2b7c5d983b6d5b05c9ef1be47c4f5e93a2f99c3a04536c503fc967b0d22683d31e5b17e35426a3d6734a706df32e687ab5239d9f94c6f781ec93788f5335299e7824d699b722d99f94c8ed3a09014fba85c2a284d5019e3bc749d"}
@@ -1,5 +1,5 @@
1
1
  import type { InitialAccountData } from '@aztec/accounts/testing';
2
- import { type Archiver, createArchiver } from '@aztec/archiver';
2
+ import { AztecNodeService } from '@aztec/aztec-node';
3
3
  import { AztecAddress, EthAddress } from '@aztec/aztec.js/addresses';
4
4
  import { type Logger, createLogger } from '@aztec/aztec.js/log';
5
5
  import type { AztecNode } from '@aztec/aztec.js/node';
@@ -11,22 +11,20 @@ import {
11
11
  TestCircuitVerifier,
12
12
  } from '@aztec/bb-prover';
13
13
  import { BackendType, Barretenberg } from '@aztec/bb.js';
14
- import { createBlobClientWithFileStores } from '@aztec/blob-client/client';
15
14
  import type { DeployAztecL1ContractsReturnType } from '@aztec/ethereum/deploy-aztec-l1-contracts';
16
15
  import { Buffer32 } from '@aztec/foundation/buffer';
17
16
  import { SecretValue } from '@aztec/foundation/config';
18
17
  import { FeeAssetHandlerAbi } from '@aztec/l1-artifacts';
19
18
  import { TokenContract } from '@aztec/noir-contracts.js/Token';
20
- import { type ProverNode, type ProverNodeConfig, createProverNode } from '@aztec/prover-node';
21
19
  import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
22
20
  import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
23
- import { TestWallet } from '@aztec/test-wallet/server';
24
21
  import { getGenesisValues } from '@aztec/world-state/testing';
25
22
 
26
23
  import { type Hex, getContract } from 'viem';
27
24
  import { privateKeyToAddress } from 'viem/accounts';
28
25
 
29
26
  import { TokenSimulator } from '../simulators/token_simulator.js';
27
+ import { TestWallet } from '../test-wallet/test_wallet.js';
30
28
  import { getACVMConfig } from './get_acvm_config.js';
31
29
  import { getBBConfig } from './get_bb_config.js';
32
30
  import {
@@ -73,8 +71,8 @@ export class FullProverTest {
73
71
  circuitProofVerifier?: ClientProtocolCircuitVerifier;
74
72
  provenAsset!: TokenContract;
75
73
  context!: EndToEndContext;
76
- private proverNode!: ProverNode;
77
- private simulatedProverNode!: ProverNode;
74
+ private proverAztecNode!: AztecNodeService;
75
+ private simulatedProverAztecNode!: AztecNodeService;
78
76
  public l1Contracts!: DeployAztecL1ContractsReturnType;
79
77
  public proverAddress!: EthAddress;
80
78
  private minNumberOfTxsPerBlock: number;
@@ -108,15 +106,15 @@ export class FullProverTest {
108
106
  await publicDeployAccounts(this.wallet, this.accounts.slice(0, 2));
109
107
 
110
108
  this.logger.info('Applying base setup: deploying token contract');
111
- const { contract: asset, instance } = await TokenContract.deploy(
109
+ const {
110
+ receipt: { contract: asset, instance },
111
+ } = await TokenContract.deploy(
112
112
  this.wallet,
113
113
  this.accounts[0],
114
114
  FullProverTest.TOKEN_NAME,
115
115
  FullProverTest.TOKEN_SYMBOL,
116
116
  FullProverTest.TOKEN_DECIMALS,
117
- )
118
- .send({ from: this.accounts[0] })
119
- .wait();
117
+ ).send({ from: this.accounts[0], wait: { returnReceipt: true } });
120
118
  this.logger.verbose(`Token deployed to ${asset.address}`);
121
119
 
122
120
  this.fakeProofsAsset = asset;
@@ -125,7 +123,7 @@ export class FullProverTest {
125
123
 
126
124
  this.tokenSim = new TokenSimulator(this.fakeProofsAsset, this.wallet, this.accounts[0], this.logger, this.accounts);
127
125
 
128
- expect(await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).toBe(
126
+ expect((await this.fakeProofsAsset.methods.get_admin().simulate({ from: this.accounts[0] })).result).toBe(
129
127
  this.accounts[0].toBigInt(),
130
128
  );
131
129
  }
@@ -146,18 +144,17 @@ export class FullProverTest {
146
144
  this.logger.info(`Enabling proving`, { realProofs: this.realProofs });
147
145
 
148
146
  // We don't wish to mark as proven automatically, so we set the flag to false
149
- this.context.watcher!.setIsMarkingAsProven(false);
147
+ this.context.watcher.setIsMarkingAsProven(false);
150
148
 
151
- this.simulatedProverNode = this.context.proverNode!;
149
+ this.simulatedProverAztecNode = this.context.proverNode!;
152
150
  ({
153
151
  aztecNode: this.aztecNode,
154
152
  deployL1ContractsValues: this.l1Contracts,
155
153
  cheatCodes: this.cheatCodes,
156
154
  } = this.context);
157
- this.aztecNodeAdmin = this.context.aztecNodeService!;
155
+ this.aztecNodeAdmin = this.context.aztecNodeService;
158
156
 
159
157
  const config = this.context.aztecNodeConfig;
160
- const blobClient = await createBlobClientWithFileStores(config, this.logger);
161
158
 
162
159
  // Configure a full prover PXE
163
160
  let acvmConfig: Awaited<ReturnType<typeof getACVMConfig>> | undefined;
@@ -200,7 +197,7 @@ export class FullProverTest {
200
197
  this.aztecNode,
201
198
  { proverEnabled: this.realProofs },
202
199
  undefined,
203
- true,
200
+ 'pxe-proven',
204
201
  );
205
202
  this.logger.debug(`Contract address ${this.fakeProofsAsset.address}`);
206
203
  await provenWallet.registerContract(this.fakeProofsAssetInstance, TokenContract.artifact);
@@ -219,20 +216,13 @@ export class FullProverTest {
219
216
  this.provenWallet = provenWallet;
220
217
  this.logger.info(`Full prover PXE started`);
221
218
 
222
- // Shutdown the current, simulated prover node
219
+ // Shutdown the current, simulated prover node (by stopping its hosting aztec node)
223
220
  this.logger.verbose('Shutting down simulated prover node');
224
- await this.simulatedProverNode.stop();
225
-
226
- // Creating temp store and archiver for fully proven prover node
227
- this.logger.verbose('Starting archiver for new prover node');
228
- const archiver = await createArchiver(
229
- { ...this.context.aztecNodeConfig, dataDirectory: undefined },
230
- { blobClient, dateProvider: this.context.dateProvider! },
231
- { blockUntilSync: true },
232
- );
221
+ await this.simulatedProverAztecNode.stop();
233
222
 
234
223
  // The simulated prover node (now shutdown) used private key index 2
235
224
  const proverNodePrivateKey = getPrivateKeyFromIndex(2);
225
+ const proverNodePrivateKeyHex = `0x${proverNodePrivateKey!.toString('hex')}` as const;
236
226
  const proverNodeSenderAddress = privateKeyToAddress(new Buffer32(proverNodePrivateKey!).toString());
237
227
  this.proverAddress = EthAddress.fromString(proverNodeSenderAddress);
238
228
 
@@ -240,14 +230,21 @@ export class FullProverTest {
240
230
  await this.mintFeeJuice(proverNodeSenderAddress);
241
231
 
242
232
  this.logger.verbose('Starting prover node');
243
- const proverConfig: ProverNodeConfig = {
244
- ...this.context.aztecNodeConfig,
245
- txCollectionNodeRpcUrls: [],
233
+ const sponsoredFPCAddress = await getSponsoredFPCAddress();
234
+ const { prefilledPublicData } = await getGenesisValues(
235
+ this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
236
+ );
237
+
238
+ const proverNodeConfig: Parameters<typeof AztecNodeService.createAndSync>[0] = {
239
+ ...config,
240
+ enableProverNode: true,
241
+ disableValidator: true,
246
242
  dataDirectory: undefined,
243
+ txCollectionNodeRpcUrls: [],
247
244
  proverId: this.proverAddress,
248
245
  realProofs: this.realProofs,
249
246
  proverAgentCount: 2,
250
- publisherPrivateKeys: [new SecretValue(`0x${proverNodePrivateKey!.toString('hex')}` as const)],
247
+ proverPublisherPrivateKeys: [new SecretValue(proverNodePrivateKeyHex)],
251
248
  proverNodeMaxPendingJobs: 100,
252
249
  proverNodeMaxParallelBlocksPerEpoch: 32,
253
250
  proverNodePollingIntervalMs: 100,
@@ -257,21 +254,14 @@ export class FullProverTest {
257
254
  txGatheringTimeoutMs: 24_000,
258
255
  proverNodeFailedEpochStore: undefined,
259
256
  proverNodeEpochProvingDelayMs: undefined,
257
+ validatorPrivateKeys: new SecretValue([]),
260
258
  };
261
- const sponsoredFPCAddress = await getSponsoredFPCAddress();
262
- const { prefilledPublicData } = await getGenesisValues(
263
- this.context.initialFundedAccounts.map(a => a.address).concat(sponsoredFPCAddress),
264
- );
265
- this.proverNode = await createProverNode(
266
- proverConfig,
267
- {
268
- aztecNodeTxProvider: this.aztecNode,
269
- archiver: archiver as Archiver,
270
- },
259
+
260
+ this.proverAztecNode = await AztecNodeService.createAndSync(
261
+ proverNodeConfig,
262
+ { dateProvider: this.context.dateProvider, p2pClientDeps: { rpcTxProviders: [this.aztecNode] } },
271
263
  { prefilledPublicData },
272
264
  );
273
- await this.proverNode.start();
274
-
275
265
  this.logger.warn(`Proofs are now enabled`, { realProofs: this.realProofs });
276
266
  return this;
277
267
  }
@@ -291,8 +281,8 @@ export class FullProverTest {
291
281
  await this.provenComponents[i].teardown();
292
282
  }
293
283
 
294
- // clean up the full prover node
295
- await this.proverNode.stop();
284
+ // clean up the full prover node (by stopping its hosting aztec node)
285
+ await this.proverAztecNode.stop();
296
286
 
297
287
  await Barretenberg.destroySingleton();
298
288
  await this.bbConfigCleanup?.();
@@ -308,13 +298,10 @@ export class FullProverTest {
308
298
  const publicAmount = 10000n;
309
299
 
310
300
  this.logger.verbose(`Minting ${privateAmount + publicAmount} publicly...`);
311
- await asset.methods
312
- .mint_to_public(accounts[0], privateAmount + publicAmount)
313
- .send({ from: accounts[0] })
314
- .wait();
301
+ await asset.methods.mint_to_public(accounts[0], privateAmount + publicAmount).send({ from: accounts[0] });
315
302
 
316
303
  this.logger.verbose(`Transferring ${privateAmount} to private...`);
317
- await asset.methods.transfer_to_private(accounts[0], privateAmount).send({ from: accounts[0] }).wait();
304
+ await asset.methods.transfer_to_private(accounts[0], privateAmount).send({ from: accounts[0] });
318
305
 
319
306
  this.logger.info(`Minting complete`);
320
307
 
@@ -325,16 +312,20 @@ export class FullProverTest {
325
312
  } = this;
326
313
  tokenSim.mintPublic(address, publicAmount);
327
314
 
328
- const publicBalance = await fakeProofsAsset.methods.balance_of_public(address).simulate({ from: address });
315
+ const { result: publicBalance } = await fakeProofsAsset.methods
316
+ .balance_of_public(address)
317
+ .simulate({ from: address });
329
318
  this.logger.verbose(`Public balance of wallet 0: ${publicBalance}`);
330
319
  expect(publicBalance).toEqual(this.tokenSim.balanceOfPublic(address));
331
320
 
332
321
  tokenSim.mintPrivate(address, publicAmount);
333
- const privateBalance = await fakeProofsAsset.methods.balance_of_private(address).simulate({ from: address });
322
+ const { result: privateBalance } = await fakeProofsAsset.methods
323
+ .balance_of_private(address)
324
+ .simulate({ from: address });
334
325
  this.logger.verbose(`Private balance of wallet 0: ${privateBalance}`);
335
326
  expect(privateBalance).toEqual(tokenSim.balanceOfPrivate(address));
336
327
 
337
- const totalSupply = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
328
+ const { result: totalSupply } = await fakeProofsAsset.methods.total_supply().simulate({ from: address });
338
329
  this.logger.verbose(`Total supply: ${totalSupply}`);
339
330
  expect(totalSupply).toEqual(tokenSim.totalSupply);
340
331
  }
@@ -0,0 +1,126 @@
1
+ import { appendFileSync } from 'node:fs';
2
+ import { type EventLoopUtilization, type IntervalHistogram, monitorEventLoopDelay, performance } from 'node:perf_hooks';
3
+
4
+ const NANOS_PER_MS = 1_000_000;
5
+
6
+ /** Samples event-loop utilization, delay histogram, and heap usage per test, writing columnar text to a file. */
7
+ export class EluMonitor {
8
+ private filePath: string;
9
+ private intervalMs: number;
10
+ private timer: ReturnType<typeof setInterval> | undefined;
11
+ private lastELU: EventLoopUtilization | undefined;
12
+ private histogram: IntervalHistogram;
13
+ private testName: string | undefined;
14
+ private testStart: number | undefined;
15
+ private eluSamples: number[] = [];
16
+
17
+ constructor(filePath: string, intervalMs?: number) {
18
+ this.filePath = filePath;
19
+ this.intervalMs = intervalMs ?? 2000;
20
+ this.histogram = monitorEventLoopDelay({ resolution: 20 });
21
+ }
22
+
23
+ /** Begin sampling for a test. Writes a header line and starts the periodic sampler. */
24
+ startTest(testName: string): void {
25
+ this.stopTest();
26
+
27
+ this.testName = testName;
28
+ this.testStart = performance.now();
29
+ this.eluSamples = [];
30
+
31
+ appendFileSync(this.filePath, `\n=== Test: ${testName} ===\n`);
32
+ appendFileSync(
33
+ this.filePath,
34
+ padColumns('TIME', 'ELU', 'EL_DLY_P50', 'EL_DLY_P99', 'EL_DLY_MAX', 'HEAP_MB') + '\n',
35
+ );
36
+
37
+ this.lastELU = performance.eventLoopUtilization();
38
+ this.histogram.enable();
39
+
40
+ this.timer = setInterval(() => this.sample(), this.intervalMs);
41
+ // Allow the process to exit even if the timer is still running.
42
+ this.timer.unref();
43
+ }
44
+
45
+ /** Stop sampling and write a summary line. */
46
+ stopTest(): void {
47
+ if (!this.timer) {
48
+ return;
49
+ }
50
+
51
+ // Take a final sample before stopping.
52
+ this.sample();
53
+
54
+ clearInterval(this.timer);
55
+ this.timer = undefined;
56
+ this.histogram.disable();
57
+ this.histogram.reset();
58
+
59
+ this.writeSummary();
60
+
61
+ this.lastELU = undefined;
62
+ this.testName = undefined;
63
+ this.testStart = undefined;
64
+ this.eluSamples = [];
65
+ }
66
+
67
+ /** Alias for stopTest — call on process exit to flush any remaining data. */
68
+ stop(): void {
69
+ this.stopTest();
70
+ }
71
+
72
+ private sample(): void {
73
+ const newELU = performance.eventLoopUtilization();
74
+ const delta = performance.eventLoopUtilization(newELU, this.lastELU);
75
+ this.lastELU = newELU;
76
+
77
+ const elu = delta.utilization;
78
+ this.eluSamples.push(elu);
79
+
80
+ const p50 = this.histogram.percentile(50) / NANOS_PER_MS;
81
+ const p99 = this.histogram.percentile(99) / NANOS_PER_MS;
82
+ const max = this.histogram.max / NANOS_PER_MS;
83
+ const heapMb = Math.round(process.memoryUsage().heapUsed / (1024 * 1024));
84
+
85
+ const now = new Date();
86
+ const time = [now.getHours(), now.getMinutes(), now.getSeconds()].map(n => String(n).padStart(2, '0')).join(':');
87
+
88
+ const line = padColumns(
89
+ time,
90
+ elu.toFixed(2),
91
+ `${p50.toFixed(1)}ms`,
92
+ `${p99.toFixed(1)}ms`,
93
+ `${max.toFixed(1)}ms`,
94
+ String(heapMb),
95
+ );
96
+ appendFileSync(this.filePath, line + '\n');
97
+
98
+ // Reset histogram so next sample only reflects the new interval.
99
+ this.histogram.reset();
100
+ }
101
+
102
+ private writeSummary(): void {
103
+ if (this.eluSamples.length === 0 || this.testStart === undefined) {
104
+ return;
105
+ }
106
+
107
+ const mean = this.eluSamples.reduce((a, b) => a + b, 0) / this.eluSamples.length;
108
+ const maxElu = Math.max(...this.eluSamples);
109
+ const sorted = [...this.eluSamples].sort((a, b) => a - b);
110
+ const p90Elu = sorted[Math.floor(sorted.length * 0.9)] ?? maxElu;
111
+ const durationS = ((performance.now() - this.testStart) / 1000).toFixed(1);
112
+
113
+ let summary = `--- Summary: mean_elu=${mean.toFixed(2)} max_elu=${maxElu.toFixed(2)} p90_elu=${p90Elu.toFixed(2)} duration=${durationS}s`;
114
+ if (maxElu > 0.85) {
115
+ summary += ' WARNING:ELU>0.85';
116
+ }
117
+ summary += ' ---\n';
118
+
119
+ appendFileSync(this.filePath, summary);
120
+ }
121
+ }
122
+
123
+ function padColumns(...cols: string[]): string {
124
+ const widths = [11, 7, 12, 12, 12, 8];
125
+ return cols.map((col, i) => col.padEnd(widths[i] ?? 10)).join('');
126
+ }
@@ -7,6 +7,16 @@ export const shouldCollectMetrics = () => {
7
7
  return undefined;
8
8
  };
9
9
 
10
+ /** Returns the boot node UDP port from environment variable or default value. */
11
+ export function getBootNodeUdpPort(): number {
12
+ return process.env.BOOT_NODE_UDP_PORT ? parseInt(process.env.BOOT_NODE_UDP_PORT, 10) : 4500;
13
+ }
14
+
15
+ /** Returns the anvil port from environment variable or default value. */
16
+ export function getAnvilPort(): number {
17
+ return process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT, 10) : 8545;
18
+ }
19
+
10
20
  export const TEST_PEER_CHECK_INTERVAL_MS = 1000;
11
21
  export const TEST_MAX_PENDING_TX_POOL_COUNT = 10_000; // Number of max pending TXs ~ 1.56GB
12
22