diff --git a/.cargo/config.toml b/.cargo/config.toml index d392db9f437..0d6abad69d9 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,5 @@ [env] -CAIRO_NATIVE_RUNTIME_LIBRARY = "./libcairo_native_runtime.a" +CAIRO_NATIVE_RUNTIME_LIBRARY = "../blockifier/libcairo_native_runtime.a" LLVM_SYS_191_PREFIX = "/usr/lib/llvm-19/" MLIR_SYS_190_PREFIX = "/usr/lib/llvm-19/" TABLEGEN_190_PREFIX = "/usr/lib/llvm-19/" diff --git a/.dockerignore b/.dockerignore index 4431bfca825..699c00d42b6 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,6 @@ /data /deployments /logs -/target +**/target/ .git !crates/papyrus_load_test/resources diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 00000000000..1e1a392f9d9 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,2 @@ +[submodule "crates/blockifier/cairo_native"] + recurse = true diff --git a/.github/actions/bootstrap/action.yml b/.github/actions/bootstrap/action.yml index 61e542a1632..c4b8a49c9f8 100644 --- a/.github/actions/bootstrap/action.yml +++ b/.github/actions/bootstrap/action.yml @@ -1,3 +1,11 @@ +name: Bootstrap +description: Install dependencies. + +inputs: + extra_rust_toolchains: + description: "Extra toolchains to install, but aren't used by default" + required: false + runs: using: "composite" steps: @@ -7,5 +15,7 @@ runs: shell: bash - name: Install rust. uses: ./.github/actions/install_rust + with: + extra_rust_toolchains: ${{ inputs.extra_rust_toolchains }} - name: Install cairo native. uses: ./.github/actions/setup_native_deps diff --git a/.github/actions/install_rust/action.yml b/.github/actions/install_rust/action.yml index 1fe72bcc420..f140e6a3b2e 100644 --- a/.github/actions/install_rust/action.yml +++ b/.github/actions/install_rust/action.yml @@ -1,6 +1,11 @@ -name: Bootsrap rust installation +name: Bootstrap rust installation description: Setup rust environment and its components, also caching the build results. +inputs: + extra_rust_toolchains: + description: "Extra toolchains to install, but aren't used by default" + required: false + runs: using: "composite" steps: @@ -8,6 +13,8 @@ runs: with: cache-base: main(-v[0-9].*)? inherit-toolchain: true - bins: taplo-cli@0.9.0 + bins: taplo-cli@0.9.0, cargo-machete + # Install additional non-default toolchains (for rustfmt for example), NOP if input omitted. + channel: ${{ inputs.extra_rust_toolchains }} env: RUSTFLAGS: "-C link-arg=-fuse-ld=lld" diff --git a/.github/workflows/blockifier_ci.yml b/.github/workflows/blockifier_ci.yml index cffde84f5f2..3fbd15b5316 100644 --- a/.github/workflows/blockifier_ci.yml +++ b/.github/workflows/blockifier_ci.yml @@ -29,6 +29,7 @@ on: - 'Cargo.toml' - 'crates/blockifier/**' - 'crates/native_blockifier/**' + - 'crates/starknet_sierra_multicompile/build.rs' - 'scripts/build_native_blockifier.sh' - 'scripts/dependencies.sh' - 'scripts/install_build_tools.sh' @@ -38,8 +39,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/blockifier_compiled_cairo.yml b/.github/workflows/blockifier_compiled_cairo.yml index d8f6e010ec8..4480aed50ae 100644 --- a/.github/workflows/blockifier_compiled_cairo.yml +++ b/.github/workflows/blockifier_compiled_cairo.yml @@ -19,8 +19,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/blockifier_reexecution_ci.yml b/.github/workflows/blockifier_reexecution_ci.yml index 91f6a13344f..042479d52a2 100644 --- a/.github/workflows/blockifier_reexecution_ci.yml +++ b/.github/workflows/blockifier_reexecution_ci.yml @@ -23,8 +23,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/committer_ci.yml b/.github/workflows/committer_ci.yml index 2b7c1f620f6..ae787585372 100644 --- a/.github/workflows/committer_ci.yml +++ b/.github/workflows/committer_ci.yml @@ -22,8 +22,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/committer_cli_push.yml b/.github/workflows/committer_cli_push.yml index 1d14b57553c..a95a6e6a991 100644 --- a/.github/workflows/committer_cli_push.yml +++ b/.github/workflows/committer_cli_push.yml @@ -38,8 +38,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 70520108d92..2c6833a39bc 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -24,6 +24,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: black all files run: | python3 -m pip install black diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 382b7c7dc47..3f6685e9343 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -19,10 +19,16 @@ on: env: CI: 1 RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" + RUSTDOCFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" + EXTRA_RUST_TOOLCHAINS: nightly-2024-04-29 # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: @@ -49,6 +55,8 @@ jobs: # Install rust components. - uses: ./.github/actions/bootstrap + with: + extra_rust_toolchains: ${{ env.EXTRA_RUST_TOOLCHAINS }} - name: Setup Python venv run: | @@ -62,9 +70,6 @@ jobs: git diff --exit-code Cargo.lock # Run code style on PR. - - name: "Run rustfmt pull request" - if: github.event_name == 'pull_request' - run: ci/bin/python scripts/run_tests.py --command rustfmt --changes_only --commit_id ${{ github.event.pull_request.base.sha }} - name: "Run clippy pull request" if: github.event_name == 'pull_request' run: ci/bin/python scripts/run_tests.py --command clippy --changes_only --commit_id ${{ github.event.pull_request.base.sha }} @@ -73,9 +78,11 @@ jobs: run: ci/bin/python scripts/run_tests.py --command doc --changes_only --commit_id ${{ github.event.pull_request.base.sha }} # Run code style on push. - - name: "Run rustfmt on push" - if: github.event_name == 'push' - run: ci/bin/python scripts/run_tests.py --command rustfmt + - name: "Run rustfmt" + # The nightly here is coupled with the one in install_rust/action.yml. + # If we move the install here we can use a const. + run: cargo +"$EXTRA_RUST_TOOLCHAINS" fmt --all -- --check + - name: "Run clippy on push" if: github.event_name == 'push' run: ci/bin/python scripts/run_tests.py --command clippy @@ -86,7 +93,7 @@ jobs: - name: "Run taplo" run: scripts/taplo.sh - name: Run Machete (detect unused dependencies) - uses: bnjbvr/cargo-machete@main + run: cargo machete run-workspace-tests: runs-on: starkware-ubuntu-latest-medium diff --git a/.github/workflows/main_nightly.yml b/.github/workflows/main_nightly.yml index f514ef7400f..c62f20bb276 100644 --- a/.github/workflows/main_nightly.yml +++ b/.github/workflows/main_nightly.yml @@ -1,8 +1,8 @@ name: Main-CI-Nightly on: schedule: - - cron: '30 23 * * *' # Uses ubuntu runner. - workflow_dispatch: # Uses ubuntu runner. + - cron: "0 0 * * *" # Runs at 00:00 UTC every day + workflow_dispatch: env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" @@ -12,46 +12,18 @@ jobs: runs-on: starkware-ubuntu-latest-large steps: - uses: actions/checkout@v4 - with: - # Fetch the entire history. - fetch-depth: 0 - uses: ./.github/actions/bootstrap - + - run: npm install -g ganache@7.4.3 - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - - run: npm install -g ganache@7.4.3 - # Setup pypy and link to the location expected by .cargo/config.toml. - - uses: actions/setup-python@v5 - id: setup-pypy - with: - python-version: "pypy3.9" - - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9 - - env: - LD_LIBRARY_PATH: ${{ env.Python3_ROOT_DIR }}/bin - run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV - - - name: "Run codecov on pull request" - id: run_codecov_pr - run: | - python3 -m venv ci - ci/bin/pip install -r scripts/requirements.txt - ci/bin/python scripts/run_tests.py --command codecov --changes_only --commit_id ${{ github.event.pull_request.base.sha }} - if [ -f codecov.json ]; then - echo "codecov_output=true" >> $GITHUB_OUTPUT - else - echo "codecov_output=false" >> $GITHUB_OUTPUT - fi + - name: "Run codecov" + run: cargo llvm-cov --codecov --output-path codecov.json env: SEED: 0 - - name: Codecov - if: steps.run_codecov_pr.outputs.codecov_output == 'true' - uses: codecov/codecov-action@v3 + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 with: token: ${{ secrets.CODECOV_TOKEN }} verbose: true - fail_ci_if_error: true - version: "v0.1.15" - - diff --git a/.github/workflows/main_pr.yml b/.github/workflows/main_pr.yml index 5d99b3831be..84af6dbd33d 100644 --- a/.github/workflows/main_pr.yml +++ b/.github/workflows/main_pr.yml @@ -13,8 +13,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/merge_paths_ci.yml b/.github/workflows/merge_paths_ci.yml index 200aa1b5737..6beba2d0e91 100644 --- a/.github/workflows/merge_paths_ci.yml +++ b/.github/workflows/merge_paths_ci.yml @@ -17,8 +17,12 @@ on: - 'scripts/merge_status.py' # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/papyrus_ci.yml b/.github/workflows/papyrus_ci.yml index 894661e4b26..e24654ff241 100644 --- a/.github/workflows/papyrus_ci.yml +++ b/.github/workflows/papyrus_ci.yml @@ -26,8 +26,12 @@ env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" # On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/papyrus_docker-publish.yml b/.github/workflows/papyrus_docker-publish.yml index 7815c7da723..94d4efa50e9 100644 --- a/.github/workflows/papyrus_docker-publish.yml +++ b/.github/workflows/papyrus_docker-publish.yml @@ -1,10 +1,14 @@ - + cache-to: type=gha,mode=max diff --git a/.github/workflows/sequencer_integration_tests.yml b/.github/workflows/sequencer_integration_tests.yml index b073dbf3f8d..30beb61d4cd 100644 --- a/.github/workflows/sequencer_integration_tests.yml +++ b/.github/workflows/sequencer_integration_tests.yml @@ -12,9 +12,13 @@ on: env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" -# On PR events, cancel existing CI runs on this same PR for this workflow. +# On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: diff --git a/.github/workflows/trigger _workflow.yml b/.github/workflows/trigger _workflow.yml deleted file mode 100644 index de9bcdb7772..00000000000 --- a/.github/workflows/trigger _workflow.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Trigger-Workflow - -# This workflow exists to trigger the upload_artifacts workflow on both pull requests and push -# events. It solves the issue of forked PRs not having access to secrets. Since external -# contributors don’t have permission to access secrets, this dummy workflow runs with their -# privileges and triggers the upload_artifacts workflow via the workflow_run event. -# The upload_artifacts workflow runs in the context of the main branch, where it has access to -# the necessary secrets for uploading artifacts, providing a secure solution for managing artifacts -# in forked PRs. - -on: - push: - branches: - - main - - main-v[0-9].** - tags: - - v[0-9].** - - pull_request: - types: - - opened - - reopened - - synchronize - - auto_merge_enabled - - edited - paths: - # Other than code-related changes, all changes related to the native-blockifier build-and-push - # process should trigger the build (e.g., changes to the Dockerfile, build scripts, etc.). - - '.github/workflows/blockifier_ci.yml' - - '.github/workflows/trigger_workflow.yml' - - '.github/workflows/upload_artifacts_workflow.yml' - - 'build_native_in_docker.sh' - - 'Cargo.lock' - - 'Cargo.toml' - - 'crates/blockifier/**' - - 'crates/native_blockifier/**' - - 'scripts/build_native_blockifier.sh' - - 'scripts/dependencies.sh' - - 'scripts/install_build_tools.sh' - - 'scripts/sequencer-ci.Dockerfile' - -# On PR events, cancel existing CI runs on this same PR for this workflow. -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.job }} - cancel-in-progress: ${{ github.event_name == 'pull_request' }} - -jobs: - dummy_job: - runs-on: starkware-ubuntu-latest-small - steps: - - name: Dummy step - run: echo "This is a dummy job to trigger the upload_artifacts workflow." diff --git a/.github/workflows/upload_artifacts_workflow.yml b/.github/workflows/upload_artifacts_workflow.yml index bf7261435a4..e943faff152 100644 --- a/.github/workflows/upload_artifacts_workflow.yml +++ b/.github/workflows/upload_artifacts_workflow.yml @@ -1,9 +1,43 @@ name: Upload-Artifacts on: - workflow_run: - workflows: [Trigger-Workflow] - types: [completed] + push: + branches: + - main + - main-v[0-9].** + tags: + - v[0-9].** + + pull_request: + types: + - opened + - reopened + - synchronize + - auto_merge_enabled + - edited + paths: + # Other than code-related changes, all changes related to the native-blockifier build-and-push + # process should trigger the build (e.g., changes to the Dockerfile, build scripts, etc.). + - '.github/workflows/blockifier_ci.yml' + - '.github/workflows/upload_artifacts_workflow.yml' + - 'build_native_in_docker.sh' + - 'Cargo.lock' + - 'Cargo.toml' + - 'crates/blockifier/**' + - 'crates/native_blockifier/**' + - 'scripts/build_native_blockifier.sh' + - 'scripts/dependencies.sh' + - 'scripts/install_build_tools.sh' + - 'scripts/sequencer-ci.Dockerfile' + +# On PR events, cancel existing CI runs on this same PR for this workflow. +# Also, create different concurrency groups for different pushed commits, on push events. +concurrency: + group: > + ${{ github.workflow }}- + ${{ github.ref }}- + ${{ github.event_name == 'pull_request' && 'PR' || github.sha }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} env: RUSTFLAGS: "-D warnings -C link-arg=-fuse-ld=lld" @@ -12,65 +46,66 @@ jobs: native-blockifier-artifacts-push: runs-on: starkware-ubuntu-latest-medium steps: + - uses: actions/checkout@v4 + + # Commit hash on pull request event would be the head commit of the branch. - name: Get commit hash prefix for PR update + if: ${{ github.event_name == 'pull_request' }} env: - COMMIT_SHA: ${{ github.event.workflow_run.head_commit.id }} - run: | - echo "SHORT_HASH=${COMMIT_SHA:0:7}" >> $GITHUB_ENV - echo "COMMIT_SHA=${COMMIT_SHA}" >> $GITHUB_ENV + COMMIT_SHA: ${{ github.event.pull_request.head.sha }} + run: echo "SHORT_HASH=${COMMIT_SHA:0:7}" >> $GITHUB_ENV - # This workflow is always triggered in `main` branch context, so need to checkout the commit. - - uses: actions/checkout@v4 - with: - ref: ${{ env.COMMIT_SHA }} + # On push event (to main, for example) we should take the commit post-push. + - name: Get commit hash prefix for merge + if: ${{ github.event_name != 'pull_request' }} + env: + COMMIT_SHA: ${{ github.event.after }} + run: echo "SHORT_HASH=${COMMIT_SHA:0:7}" >> $GITHUB_ENV # Set environment variables. - name: Set environment variable env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - pr_number=$(gh pr list --head "${{ github.event.workflow_run.head_branch }}" --json number --jq '.[0].number') - echo "PR_NUMBER=$pr_number" >> $GITHUB_ENV echo "WORKFLOW_LINK=$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID" >> $GITHUB_ENV # Comment with a link to the workflow (or update existing comment on rerun). - # Required, as this is a triggered workflow, and does not appear on the PR status page. - name: Find Comment - if: env.PR_NUMBER != '' + if: github.event_name == 'pull_request' uses: starkware-libs/find-comment@v3 id: find-comment with: token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ env.PR_NUMBER }} + issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' body-includes: Artifacts upload workflows - name: Create comment # If the PR number is found and the comment is not found, create a new comment. - if: env.PR_NUMBER != '' && steps.find-comment.outputs.comment-id == '' + if: github.event_name == 'pull_request' && steps.find-comment.outputs.comment-id == '' uses: starkware-libs/create-or-update-comment@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - issue-number: ${{ env.PR_NUMBER }} + issue-number: ${{ github.event.pull_request.number }} body: | Artifacts upload workflows: - * [Started at ${{ github.event.workflow_run.run_started_at }}](${{ env.WORKFLOW_LINK }}) + * [Started at ${{ github.event.pull_request.updated_at }}](${{ env.WORKFLOW_LINK }}) - name: Update comment # If the PR number is found and the comment exists, update it. - if: env.PR_NUMBER != '' && steps.find-comment.outputs.comment-id != '' + if: github.event_name == 'pull_request' && steps.find-comment.outputs.comment-id != '' uses: starkware-libs/create-or-update-comment@v4 with: token: ${{ secrets.GITHUB_TOKEN }} comment-id: ${{ steps.find-comment.outputs.comment-id }} edit-mode: append body: | - * [Started at ${{ github.event.workflow_run.run_started_at }}](${{ env.WORKFLOW_LINK }}) + * [Started at ${{ github.event.pull_request.updated_at }}](${{ env.WORKFLOW_LINK }}) # Build artifact. - - uses: ./.github/actions/bootstrap - name: Build native blockifier - run: ./build_native_in_docker.sh scripts/build_native_blockifier.sh + run: | + ./build_native_in_docker.sh scripts/build_native_blockifier.sh # Rename is required; see https://pyo3.rs/v0.19.2/building_and_distribution#manual-builds. - name: Rename shared object @@ -84,9 +119,23 @@ jobs: with: credentials_json: ${{ secrets.SA_NATIVE_BLOCKIFIER_ARTIFACTS_BUCKET_WRITER_ACCESS_KEY }} - - name: Upload binary to GCP - id: upload_file + - name: Upload native blockifier shared object to GCP + id: upload_nb_file uses: "google-github-actions/upload-cloud-storage@v2" with: path: "target/release/native_blockifier.pypy39-pp73-x86_64-linux-gnu.so" destination: "native_blockifier_artifacts/${{ env.SHORT_HASH }}/release/" + + - name: Upload starknet-native-compile to GCP + id: upload_snc_file + uses: "google-github-actions/upload-cloud-storage@v2" + with: + path: "target/release/shared_executables/starknet-native-compile" + destination: "native_blockifier_artifacts/${{ env.SHORT_HASH }}/release/" + + - name: Upload libcairo_native_runtime.a to GCP + id: upload_lnr_file + uses: "google-github-actions/upload-cloud-storage@v2" + with: + path: "crates/blockifier/cairo_native/target/release/libcairo_native_runtime.a" + destination: "native_blockifier_artifacts/${{ env.SHORT_HASH }}/release/" diff --git a/.gitignore b/.gitignore index 5caa70b1b7d..68c6ebd4ea1 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ tmp_venv/* # Git hooks /.husky /.idea +__pycache__/ +.idea/ # Python artifacts. scripts/__pycache__ diff --git a/.gitmodules b/.gitmodules index b7d50bab868..8ce19f6d3e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "crates/blockifier/cairo_native"] path = crates/blockifier/cairo_native url = https://github.com/lambdaclass/cairo_native - rev = 6a4efafa26d6a0424dee593d2091206c6e9f428d diff --git a/BUILD b/BUILD index 2adca64db77..dc6746047ee 100644 --- a/BUILD +++ b/BUILD @@ -1,6 +1,8 @@ # Export the built artifact to allow local builds. exports_files([ "target/release/libnative_blockifier.so", + "target/release/shared_executables/starknet-native-compile", + "crates/blockifier/cairo_native/target/release/libcairo_native_runtime.a", "target/debug/committer_cli", "target/release/committer_cli", "target/x86_64-unknown-linux-musl/debug/committer_cli", diff --git a/Cargo.lock b/Cargo.lock index cdc29e671af..024b9ab7743 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,9 +93,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-chains" -version = "0.1.53" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da226340862e036ab26336dc99ca85311c6b662267c1440e1733890fd688802c" +checksum = "56f15afc5993458b42739ab3b69bdb6b4c8112acd3997dbea9bc092c9517137c" dependencies = [ "alloy-primitives", "num_enum", @@ -422,6 +422,7 @@ version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19cc9c7f20b90f9be1a8f71a3d8e283a43745137b0837b1a1cb13159d37cad72" dependencies = [ + "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck 0.5.0", @@ -440,11 +441,13 @@ version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713b7e6dfe1cb2f55c80fb05fd22ed085a1b4e48217611365ed0ae598a74c6ac" dependencies = [ + "alloy-json-abi", "const-hex", "dunce", "heck 0.5.0", "proc-macro2", "quote", + "serde_json", "syn 2.0.95", "syn-solidity", ] @@ -1109,7 +1112,7 @@ dependencies = [ "futures-lite 2.5.0", "parking", "polling 3.7.4", - "rustix 0.38.43", + "rustix 0.38.42", "slab", "tracing", "windows-sys 0.59.0", @@ -1130,7 +1133,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -1159,9 +1162,9 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", + "event-listener 5.3.1", "futures-lite 2.5.0", - "rustix 0.38.43", + "rustix 0.38.42", "tracing", ] @@ -1188,7 +1191,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.43", + "rustix 0.38.42", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -1250,9 +1253,9 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "1b1244b10dcd56c92219da4e14caa97e312079e185f04ba3eea25061561dc0a0" dependencies = [ "proc-macro2", "quote", @@ -1624,7 +1627,7 @@ dependencies = [ [[package]] name = "blockifier" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "ark-ec 0.4.2", @@ -1643,7 +1646,6 @@ dependencies = [ "derive_more 0.99.18", "glob", "indexmap 2.7.0", - "infra_utils", "itertools 0.12.1", "keccak", "log", @@ -1658,15 +1660,16 @@ dependencies = [ "rand 0.8.5", "regex", "rstest", + "rstest_reuse", "semver 1.0.24", "serde", "serde_json", "sha2", "sierra-emu", - "stacker", "starknet-types-core", "starknet_api", - "starknet_sierra_compile", + "starknet_infra_utils", + "starknet_sierra_multicompile", "strum 0.25.0", "strum_macros 0.25.3", "tempfile", @@ -1678,7 +1681,7 @@ dependencies = [ [[package]] name = "blockifier_reexecution" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "blockifier", @@ -2694,9 +2697,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -2704,9 +2707,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -2811,7 +2814,7 @@ dependencies = [ [[package]] name = "committer_cli" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "clap", "criterion", @@ -4058,9 +4061,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -4073,7 +4076,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.3.1", "pin-project-lite", ] @@ -5532,17 +5535,6 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" -[[package]] -name = "infra_utils" -version = "0.0.0" -dependencies = [ - "pretty_assertions", - "rstest", - "tokio", - "tracing", - "tracing-subscriber", -] - [[package]] name = "inout" version = "0.1.3" @@ -6555,9 +6547,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" @@ -6744,15 +6736,15 @@ dependencies = [ [[package]] name = "mempool_test_utils" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "blockifier", - "infra_utils", "pretty_assertions", "serde_json", "starknet-types-core", "starknet_api", + "starknet_infra_utils", ] [[package]] @@ -7054,7 +7046,7 @@ dependencies = [ [[package]] name = "native_blockifier" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "blockifier", "cached", @@ -7072,6 +7064,7 @@ dependencies = [ "serde_json", "starknet-types-core", "starknet_api", + "starknet_sierra_multicompile", "tempfile", "thiserror 1.0.69", ] @@ -7590,7 +7583,7 @@ dependencies = [ [[package]] name = "papyrus_base_layer" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "alloy-contract", "alloy-dyn-abi", @@ -7619,7 +7612,7 @@ dependencies = [ [[package]] name = "papyrus_common" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "base64 0.13.1", @@ -7640,26 +7633,27 @@ dependencies = [ [[package]] name = "papyrus_config" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "clap", - "infra_utils", "itertools 0.12.1", "lazy_static", "papyrus_test_utils", "serde", "serde_json", "starknet_api", + "starknet_infra_utils", "strum_macros 0.25.3", "tempfile", "thiserror 1.0.69", + "tracing", "validator", ] [[package]] name = "papyrus_consensus" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "clap", @@ -7685,15 +7679,18 @@ dependencies = [ "thiserror 1.0.69", "tokio", "tracing", + "validator", ] [[package]] name = "papyrus_consensus_orchestrator" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", + "blockifier", "chrono", "futures", + "indexmap 2.7.0", "lazy_static", "mockall", "papyrus_consensus", @@ -7701,17 +7698,21 @@ dependencies = [ "papyrus_protobuf", "papyrus_storage", "papyrus_test_utils", + "serde", + "serde_json", "starknet-types-core", "starknet_api", "starknet_batcher_types", + "starknet_infra_utils", "test-case", "tokio", + "tokio-util", "tracing", ] [[package]] name = "papyrus_execution" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "assert_matches", @@ -7740,7 +7741,7 @@ dependencies = [ [[package]] name = "papyrus_load_test" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "assert_matches", @@ -7758,7 +7759,7 @@ dependencies = [ [[package]] name = "papyrus_monitoring_gateway" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "axum", "hyper 0.14.32", @@ -7781,7 +7782,7 @@ dependencies = [ [[package]] name = "papyrus_network" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-stream", @@ -7803,6 +7804,7 @@ dependencies = [ "replace_with", "serde", "starknet_api", + "starknet_sequencer_infra", "thiserror 1.0.69", "tokio", "tokio-retry", @@ -7815,7 +7817,7 @@ dependencies = [ [[package]] name = "papyrus_network_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "libp2p", "papyrus_test_utils", @@ -7825,7 +7827,7 @@ dependencies = [ [[package]] name = "papyrus_node" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "assert-json-diff", @@ -7834,7 +7836,6 @@ dependencies = [ "const_format", "futures", "futures-util", - "infra_utils", "insta", "itertools 0.12.1", "lazy_static", @@ -7859,6 +7860,7 @@ dependencies = [ "serde_json", "starknet_api", "starknet_client", + "starknet_infra_utils", "strum 0.25.0", "tempfile", "tokio", @@ -7870,7 +7872,7 @@ dependencies = [ [[package]] name = "papyrus_p2p_sync" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-stream", @@ -7902,7 +7904,7 @@ dependencies = [ [[package]] name = "papyrus_proc_macros" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "metrics 0.21.1", "metrics-exporter-prometheus", @@ -7916,7 +7918,7 @@ dependencies = [ [[package]] name = "papyrus_protobuf" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "indexmap 2.7.0", "lazy_static", @@ -7937,7 +7939,7 @@ dependencies = [ [[package]] name = "papyrus_rpc" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "assert_matches", @@ -7990,19 +7992,20 @@ dependencies = [ [[package]] name = "papyrus_state_reader" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "blockifier", "indexmap 2.7.0", "papyrus_storage", + "rstest", "starknet-types-core", "starknet_api", ] [[package]] name = "papyrus_storage" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "byteorder", @@ -8054,7 +8057,7 @@ dependencies = [ [[package]] name = "papyrus_sync" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-stream", @@ -8089,7 +8092,7 @@ dependencies = [ [[package]] name = "papyrus_test_utils" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "cairo-lang-casm", "cairo-lang-starknet-classes", @@ -8287,32 +8290,32 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_macros", - "phf_shared 0.11.3", + "phf_shared 0.11.2", ] [[package]] name = "phf_generator" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ - "phf_shared 0.11.3", + "phf_shared 0.11.2", "rand 0.8.5", ] [[package]] name = "phf_macros" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ "phf_generator", - "phf_shared 0.11.3", + "phf_shared 0.11.2", "proc-macro2", "quote", "syn 2.0.95", @@ -8324,16 +8327,16 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher 0.3.11", + "siphasher", ] [[package]] name = "phf_shared" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ - "siphasher 1.0.1", + "siphasher", ] [[package]] @@ -8344,18 +8347,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", @@ -8364,9 +8367,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -8453,7 +8456,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.43", + "rustix 0.38.42", "tracing", "windows-sys 0.59.0", ] @@ -8670,7 +8673,7 @@ dependencies = [ "hex", "lazy_static", "procfs-core", - "rustix 0.38.43", + "rustix 0.38.42", ] [[package]] @@ -8807,15 +8810,6 @@ version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" -[[package]] -name = "psm" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810" -dependencies = [ - "cc", -] - [[package]] name = "publicsuffix" version = "2.3.0" @@ -9556,6 +9550,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rstest_reuse" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a8fb4672e840a587a66fc577a5491375df51ddb88f2a2c2a792598c326fe14" +dependencies = [ + "quote", + "rand 0.8.5", + "syn 2.0.95", +] + [[package]] name = "rtnetlink" version = "0.13.1" @@ -9713,14 +9718,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys 0.4.15", + "linux-raw-sys 0.4.14", "windows-sys 0.59.0", ] @@ -9979,9 +9984,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -10059,9 +10064,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -10222,7 +10227,7 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "sierra-emu" version = "0.1.0" -source = "git+https://github.com/lambdaclass/sierra-emu.git?rev=58188e8da1e1e40d1c47b6bd311d1caf48cb08fb#58188e8da1e1e40d1c47b6bd311d1caf48cb08fb" +source = "git+https://github.com/lambdaclass/sierra-emu?rev=d82044b6c21d9d53d9b931bc35360c168374ff50#d82044b6c21d9d53d9b931bc35360c168374ff50" dependencies = [ "cairo-lang-compiler", "cairo-lang-filesystem", @@ -10319,12 +10324,6 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" -[[package]] -name = "siphasher" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" - [[package]] name = "sketches-ddsketch" version = "0.2.2" @@ -10492,19 +10491,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "stacker" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" -dependencies = [ - "cc", - "cfg-if", - "libc", - "psm", - "windows-sys 0.59.0", -] - [[package]] name = "starknet-core" version = "0.6.1" @@ -10622,7 +10608,7 @@ dependencies = [ [[package]] name = "starknet_api" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "bitvec", @@ -10631,9 +10617,9 @@ dependencies = [ "derive_more 0.99.18", "hex", "indexmap 2.7.0", - "infra_utils", "itertools 0.12.1", "num-bigint 0.4.6", + "num-traits", "pretty_assertions", "primitive-types", "rstest", @@ -10644,6 +10630,7 @@ dependencies = [ "starknet-crypto 0.7.3", "starknet-types-core", "starknet_api", + "starknet_infra_utils", "strum 0.25.0", "strum_macros 0.25.3", "thiserror 1.0.69", @@ -10651,7 +10638,7 @@ dependencies = [ [[package]] name = "starknet_batcher" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -10681,7 +10668,7 @@ dependencies = [ [[package]] name = "starknet_batcher_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "chrono", @@ -10696,9 +10683,22 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "starknet_class_manager_types" +version = "0.14.0-rc.0" +dependencies = [ + "async-trait", + "cairo-lang-starknet-classes", + "papyrus_proc_macros", + "serde", + "starknet_api", + "starknet_sequencer_infra", + "thiserror 1.0.69", +] + [[package]] name = "starknet_client" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -10733,7 +10733,7 @@ dependencies = [ [[package]] name = "starknet_committer" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "hex", "pretty_assertions", @@ -10748,7 +10748,7 @@ dependencies = [ [[package]] name = "starknet_consensus_manager" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "futures", @@ -10758,7 +10758,9 @@ dependencies = [ "papyrus_network", "papyrus_protobuf", "serde", + "starknet_api", "starknet_batcher_types", + "starknet_infra_utils", "starknet_sequencer_infra", "starknet_state_sync_types", "tokio", @@ -10768,7 +10770,7 @@ dependencies = [ [[package]] name = "starknet_gateway" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -10776,6 +10778,7 @@ dependencies = [ "blockifier", "cairo-lang-sierra-to-casm", "cairo-lang-starknet-classes", + "futures", "mempool_test_utils", "mockall", "mockito 1.6.1", @@ -10795,7 +10798,8 @@ dependencies = [ "starknet_mempool", "starknet_mempool_types", "starknet_sequencer_infra", - "starknet_sierra_compile", + "starknet_sierra_multicompile", + "starknet_state_sync_types", "thiserror 1.0.69", "tokio", "tracing", @@ -10805,7 +10809,7 @@ dependencies = [ [[package]] name = "starknet_gateway_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "axum", @@ -10825,7 +10829,7 @@ dependencies = [ [[package]] name = "starknet_http_server" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "axum", "hyper 0.14.32", @@ -10835,6 +10839,7 @@ dependencies = [ "serde_json", "starknet_api", "starknet_gateway_types", + "starknet_infra_utils", "starknet_sequencer_infra", "thiserror 1.0.69", "tokio", @@ -10842,20 +10847,30 @@ dependencies = [ "validator", ] +[[package]] +name = "starknet_infra_utils" +version = "0.14.0-rc.0" +dependencies = [ + "pretty_assertions", + "rstest", + "tokio", + "tracing", + "tracing-subscriber", +] + [[package]] name = "starknet_integration_tests" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ - "anyhow", "assert_matches", "blockifier", "cairo-lang-starknet-classes", "futures", "indexmap 2.7.0", - "infra_utils", "itertools 0.12.1", "mempool_test_utils", "papyrus_common", + "papyrus_config", "papyrus_consensus", "papyrus_execution", "papyrus_network", @@ -10873,6 +10888,7 @@ dependencies = [ "starknet_gateway", "starknet_gateway_types", "starknet_http_server", + "starknet_infra_utils", "starknet_mempool_p2p", "starknet_monitoring_endpoint", "starknet_sequencer_infra", @@ -10886,7 +10902,7 @@ dependencies = [ [[package]] name = "starknet_l1_provider" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -10905,7 +10921,7 @@ dependencies = [ [[package]] name = "starknet_l1_provider_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "mockall", @@ -10919,7 +10935,7 @@ dependencies = [ [[package]] name = "starknet_mempool" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -10944,10 +10960,11 @@ dependencies = [ [[package]] name = "starknet_mempool_p2p" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "futures", + "libp2p", "papyrus_config", "papyrus_network", "papyrus_network_types", @@ -10966,7 +10983,7 @@ dependencies = [ [[package]] name = "starknet_mempool_p2p_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "mockall", @@ -10980,7 +10997,7 @@ dependencies = [ [[package]] name = "starknet_mempool_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "mockall", @@ -10995,16 +11012,16 @@ dependencies = [ [[package]] name = "starknet_monitoring_endpoint" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "axum", "hyper 0.14.32", - "infra_utils", "metrics 0.21.1", "metrics-exporter-prometheus", "papyrus_config", "pretty_assertions", "serde", + "starknet_infra_utils", "starknet_sequencer_infra", "tokio", "tower 0.4.13", @@ -11014,7 +11031,7 @@ dependencies = [ [[package]] name = "starknet_patricia" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-recursion", "derive_more 0.99.18", @@ -11035,7 +11052,7 @@ dependencies = [ [[package]] name = "starknet_sequencer_infra" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "async-trait", @@ -11047,6 +11064,7 @@ dependencies = [ "serde_json", "starknet-types-core", "starknet_api", + "starknet_infra_utils", "thiserror 1.0.69", "tokio", "tracing", @@ -11056,7 +11074,7 @@ dependencies = [ [[package]] name = "starknet_sequencer_node" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "anyhow", "assert-json-diff", @@ -11065,11 +11083,10 @@ dependencies = [ "colored", "const_format", "futures", - "infra_utils", "mempool_test_utils", "papyrus_config", - "papyrus_consensus", "papyrus_proc_macros", + "papyrus_protobuf", "pretty_assertions", "rstest", "serde", @@ -11081,6 +11098,7 @@ dependencies = [ "starknet_gateway", "starknet_gateway_types", "starknet_http_server", + "starknet_infra_utils", "starknet_l1_provider", "starknet_l1_provider_types", "starknet_mempool", @@ -11090,7 +11108,7 @@ dependencies = [ "starknet_monitoring_endpoint", "starknet_sequencer_infra", "starknet_sequencer_node", - "starknet_sierra_compile", + "starknet_sierra_multicompile", "starknet_state_sync", "starknet_state_sync_types", "tokio", @@ -11099,22 +11117,23 @@ dependencies = [ ] [[package]] -name = "starknet_sierra_compile" -version = "0.0.0" +name = "starknet_sierra_multicompile" +version = "0.14.0-rc.0" dependencies = [ "assert_matches", "cairo-lang-sierra", "cairo-lang-starknet-classes", "cairo-lang-utils", "cairo-native", - "infra_utils", "mempool_test_utils", "papyrus_config", + "rlimit", "rstest", "serde", "serde_json", "starknet-types-core", "starknet_api", + "starknet_infra_utils", "tempfile", "thiserror 1.0.69", "validator", @@ -11122,7 +11141,7 @@ dependencies = [ [[package]] name = "starknet_state_sync" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", "futures", @@ -11131,6 +11150,7 @@ dependencies = [ "papyrus_p2p_sync", "papyrus_storage", "serde", + "starknet-types-core", "starknet_api", "starknet_sequencer_infra", "starknet_state_sync_types", @@ -11140,12 +11160,14 @@ dependencies = [ [[package]] name = "starknet_state_sync_types" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "async-trait", + "futures", "papyrus_proc_macros", "papyrus_storage", "serde", + "starknet-types-core", "starknet_api", "starknet_sequencer_infra", "thiserror 1.0.69", @@ -11153,7 +11175,7 @@ dependencies = [ [[package]] name = "starknet_task_executor" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "futures", "rstest", @@ -11422,7 +11444,7 @@ dependencies = [ "fastrand 2.3.0", "getrandom", "once_cell", - "rustix 0.38.43", + "rustix 0.38.42", "windows-sys 0.59.0", ] @@ -11685,9 +11707,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -11703,9 +11725,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -12487,7 +12509,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.43", + "rustix 0.38.42", ] [[package]] @@ -12850,7 +12872,7 @@ dependencies = [ [[package]] name = "workspace_tests" -version = "0.0.0" +version = "0.14.0-rc.0" dependencies = [ "serde", "toml", @@ -12932,15 +12954,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", - "linux-raw-sys 0.4.15", - "rustix 0.38.43", + "linux-raw-sys 0.4.14", + "rustix 0.38.42", ] [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "xmltree" diff --git a/Cargo.toml b/Cargo.toml index bb8e89e12de..8f703ebf2ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,6 @@ members = [ "crates/blockifier", "crates/blockifier_reexecution", "crates/committer_cli", - "crates/infra_utils", "crates/mempool_test_utils", "crates/native_blockifier", "crates/papyrus_base_layer", @@ -32,12 +31,14 @@ members = [ "crates/starknet_api", "crates/starknet_batcher", "crates/starknet_batcher_types", + "crates/starknet_class_manager_types", "crates/starknet_client", "crates/starknet_committer", "crates/starknet_consensus_manager", "crates/starknet_gateway", "crates/starknet_gateway_types", "crates/starknet_http_server", + "crates/starknet_infra_utils", "crates/starknet_integration_tests", "crates/starknet_l1_provider", "crates/starknet_l1_provider_types", @@ -49,7 +50,7 @@ members = [ "crates/starknet_patricia", "crates/starknet_sequencer_infra", "crates/starknet_sequencer_node", - "crates/starknet_sierra_compile", + "crates/starknet_sierra_multicompile", "crates/starknet_state_sync", "crates/starknet_state_sync_types", "crates/starknet_task_executor", @@ -59,7 +60,7 @@ members = [ exclude = ["crates/bin/starknet-native-compile"] [workspace.package] -version = "0.0.0" +version = "0.14.0-rc.0" edition = "2021" repository = "https://github.com/starkware-libs/sequencer/" license = "Apache-2.0" @@ -90,7 +91,7 @@ base64 = "0.13.0" bincode = "1.3.3" bisection = "0.1.0" bitvec = "1.0.1" -blockifier = { path = "crates/blockifier", version = "0.0.0" } +blockifier = { path = "crates/blockifier", version = "0.14.0-rc.0" } byteorder = "1.4.3" bytes = "1" cached = "0.44.0" @@ -101,13 +102,12 @@ cairo-lang-sierra = "=2.10.0-rc.1" cairo-lang-sierra-to-casm = "2.10.0-rc.1" cairo-lang-starknet-classes = "2.10.0-rc.1" cairo-lang-utils = "2.10.0-rc.1" -# Important: when updated, make sure to update the cairo-native submodule as well. cairo-native = { git = "https://github.com/lambdaclass/cairo_native.git", rev = "e9151aa8420a138f70febb721f8979d3dd2f7223" } -sierra-emu = { git = "https://github.com/lambdaclass/sierra-emu.git", rev = "58188e8da1e1e40d1c47b6bd311d1caf48cb08fb" } +sierra-emu = { git = "https://github.com/lambdaclass/sierra-emu", rev = "d82044b6c21d9d53d9b931bc35360c168374ff50" } cairo-vm = "=1.0.1" camelpaste = "0.1.0" chrono = "0.4.26" -clap = "4.5.4" +clap = "4.5.26" colored = "2.1.0" const_format = "0.2.30" criterion = "0.5.1" @@ -134,7 +134,6 @@ http-body = "0.4.5" human_bytes = "0.4.3" hyper = "0.14" indexmap = "2.1.0" -infra_utils = { path = "crates/infra_utils", version = "0.0.0" } insta = "1.29.0" integer-encoding = "3.0.4" itertools = "0.12.1" @@ -148,7 +147,7 @@ libp2p-swarm-test = "0.3.0" log = "0.4" lru = "0.12.0" memmap2 = "0.8.0" -mempool_test_utils = { path = "crates/mempool_test_utils", version = "0.0.0" } +mempool_test_utils = { path = "crates/mempool_test_utils", version = "0.14.0-rc.0" } metrics = "0.21.0" metrics-exporter-prometheus = "0.12.1" metrics-process = "1.0.11" @@ -162,23 +161,23 @@ num-traits = "0.2.15" once_cell = "1.19.0" os_info = "3.6.0" page_size = "0.6.0" -papyrus_base_layer = { path = "crates/papyrus_base_layer", version = "0.0.0" } -papyrus_common = { path = "crates/papyrus_common", version = "0.0.0" } -papyrus_config = { path = "crates/papyrus_config", version = "0.0.0" } -papyrus_consensus = { path = "crates/sequencing/papyrus_consensus", version = "0.0.0" } -papyrus_consensus_orchestrator = { path = "crates/sequencing/papyrus_consensus_orchestrator", version = "0.0.0" } -papyrus_execution = { path = "crates/papyrus_execution", version = "0.0.0" } -papyrus_monitoring_gateway = { path = "crates/papyrus_monitoring_gateway", version = "0.0.0" } -papyrus_network = { path = "crates/papyrus_network", version = "0.0.0" } -papyrus_network_types = { path = "crates/papyrus_network_types", version = "0.0.0" } -papyrus_p2p_sync = { path = "crates/papyrus_p2p_sync", version = "0.0.0" } -papyrus_proc_macros = { path = "crates/papyrus_proc_macros", version = "0.0.0" } -papyrus_protobuf = { path = "crates/papyrus_protobuf", version = "0.0.0" } -papyrus_rpc = { path = "crates/papyrus_rpc", version = "0.0.0" } -papyrus_state_reader = { path = "crates/papyrus_state_reader", version = "0.0.0" } -papyrus_storage = { path = "crates/papyrus_storage", version = "0.0.0" } -papyrus_sync = { path = "crates/papyrus_sync", version = "0.0.0" } -papyrus_test_utils = { path = "crates/papyrus_test_utils", version = "0.0.0" } +papyrus_base_layer = { path = "crates/papyrus_base_layer", version = "0.14.0-rc.0" } +papyrus_common = { path = "crates/papyrus_common", version = "0.14.0-rc.0" } +papyrus_config = { path = "crates/papyrus_config", version = "0.14.0-rc.0" } +papyrus_consensus = { path = "crates/sequencing/papyrus_consensus", version = "0.14.0-rc.0" } +papyrus_consensus_orchestrator = { path = "crates/sequencing/papyrus_consensus_orchestrator", version = "0.14.0-rc.0" } +papyrus_execution = { path = "crates/papyrus_execution", version = "0.14.0-rc.0" } +papyrus_monitoring_gateway = { path = "crates/papyrus_monitoring_gateway", version = "0.14.0-rc.0" } +papyrus_network = { path = "crates/papyrus_network", version = "0.14.0-rc.0" } +papyrus_network_types = { path = "crates/papyrus_network_types", version = "0.14.0-rc.0" } +papyrus_p2p_sync = { path = "crates/papyrus_p2p_sync", version = "0.14.0-rc.0" } +papyrus_proc_macros = { path = "crates/papyrus_proc_macros", version = "0.14.0-rc.0" } +papyrus_protobuf = { path = "crates/papyrus_protobuf", version = "0.14.0-rc.0" } +papyrus_rpc = { path = "crates/papyrus_rpc", version = "0.14.0-rc.0" } +papyrus_state_reader = { path = "crates/papyrus_state_reader", version = "0.14.0-rc.0" } +papyrus_storage = { path = "crates/papyrus_storage", version = "0.14.0-rc.0" } +papyrus_sync = { path = "crates/papyrus_sync", version = "0.14.0-rc.0" } +papyrus_test_utils = { path = "crates/papyrus_test_utils", version = "0.14.0-rc.0" } parity-scale-codec = "3.6" parity-scale-codec-derive = "3.6" paste = "1.0.15" @@ -200,44 +199,47 @@ regex = "1.10.4" replace_with = "0.1.7" reqwest = "0.11" retry = "2.0.0" +rlimit = "0.10.2" rstest = "0.17.0" +rstest_reuse = "0.7.0" rustc-hex = "2.1.0" schemars = "0.8.12" semver = "1.0.23" serde = "1.0.197" -serde_json = "1.0.133" +serde_json = "1.0.116" serde_repr = "0.1.19" serde_yaml = "0.9.16" sha2 = "0.10.8" sha3 = "0.10.8" simple_logger = "4.0.0" -stacker = "0.1.17" starknet-core = "0.6.0" starknet-crypto = "0.7.1" starknet-types-core = "0.1.6" -starknet_api = { path = "crates/starknet_api", version = "0.0.0" } -starknet_batcher = { path = "crates/starknet_batcher", version = "0.0.0" } -starknet_batcher_types = { path = "crates/starknet_batcher_types", version = "0.0.0" } -starknet_client = { path = "crates/starknet_client", version = "0.0.0" } -starknet_committer = { path = "crates/starknet_committer", version = "0.0.0" } -starknet_consensus_manager = { path = "crates/starknet_consensus_manager", version = "0.0.0" } -starknet_gateway = { path = "crates/starknet_gateway", version = "0.0.0" } -starknet_gateway_types = { path = "crates/starknet_gateway_types", version = "0.0.0" } -starknet_http_server = { path = "crates/starknet_http_server", version = "0.0.0" } -starknet_l1_provider = { path = "crates/starknet_l1_provider", version = "0.0.0" } -starknet_l1_provider_types = { path = "crates/starknet_l1_provider_types", version = "0.0.0" } -starknet_mempool = { path = "crates/starknet_mempool", version = "0.0.0" } -starknet_mempool_p2p = { path = "crates/starknet_mempool_p2p", version = "0.0.0" } -starknet_mempool_p2p_types = { path = "crates/starknet_mempool_p2p_types", version = "0.0.0" } -starknet_mempool_types = { path = "crates/starknet_mempool_types", version = "0.0.0" } -starknet_monitoring_endpoint = { path = "crates/starknet_monitoring_endpoint", version = "0.0.0" } -starknet_patricia = { path = "crates/starknet_patricia", version = "0.0.0" } -starknet_sequencer_infra = { path = "crates/starknet_sequencer_infra", version = "0.0.0" } -starknet_sequencer_node = { path = "crates/starknet_sequencer_node", version = "0.0.0" } -starknet_sierra_compile = { path = "crates/starknet_sierra_compile", version = "0.0.0" } -starknet_state_sync = { path = "crates/starknet_state_sync", version = "0.0.0" } -starknet_state_sync_types = { path = "crates/starknet_state_sync_types", version = "0.0.0" } -starknet_task_executor = { path = "crates/starknet_task_executor", version = "0.0.0" } +starknet_api = { path = "crates/starknet_api", version = "0.14.0-rc.0" } +starknet_batcher = { path = "crates/starknet_batcher", version = "0.14.0-rc.0" } +starknet_batcher_types = { path = "crates/starknet_batcher_types", version = "0.14.0-rc.0" } +starknet_class_manager_types = { path = "crates/starknet_class_manager_types", version = "0.14.0-rc.0" } +starknet_client = { path = "crates/starknet_client", version = "0.14.0-rc.0" } +starknet_committer = { path = "crates/starknet_committer", version = "0.14.0-rc.0" } +starknet_consensus_manager = { path = "crates/starknet_consensus_manager", version = "0.14.0-rc.0" } +starknet_gateway = { path = "crates/starknet_gateway", version = "0.14.0-rc.0" } +starknet_gateway_types = { path = "crates/starknet_gateway_types", version = "0.14.0-rc.0" } +starknet_http_server = { path = "crates/starknet_http_server", version = "0.14.0-rc.0" } +starknet_infra_utils = { path = "crates/starknet_infra_utils", version = "0.14.0-rc.0" } +starknet_l1_provider = { path = "crates/starknet_l1_provider", version = "0.14.0-rc.0" } +starknet_l1_provider_types = { path = "crates/starknet_l1_provider_types", version = "0.14.0-rc.0" } +starknet_mempool = { path = "crates/starknet_mempool", version = "0.14.0-rc.0" } +starknet_mempool_p2p = { path = "crates/starknet_mempool_p2p", version = "0.14.0-rc.0" } +starknet_mempool_p2p_types = { path = "crates/starknet_mempool_p2p_types", version = "0.14.0-rc.0" } +starknet_mempool_types = { path = "crates/starknet_mempool_types", version = "0.14.0-rc.0" } +starknet_monitoring_endpoint = { path = "crates/starknet_monitoring_endpoint", version = "0.14.0-rc.0" } +starknet_patricia = { path = "crates/starknet_patricia", version = "0.14.0-rc.0" } +starknet_sequencer_infra = { path = "crates/starknet_sequencer_infra", version = "0.14.0-rc.0" } +starknet_sequencer_node = { path = "crates/starknet_sequencer_node", version = "0.14.0-rc.0" } +starknet_sierra_multicompile = { path = "crates/starknet_sierra_multicompile", version = "0.14.0-rc.0" } +starknet_state_sync = { path = "crates/starknet_state_sync", version = "0.14.0-rc.0" } +starknet_state_sync_types = { path = "crates/starknet_state_sync_types", version = "0.14.0-rc.0" } +starknet_task_executor = { path = "crates/starknet_task_executor", version = "0.14.0-rc.0" } static_assertions = "1.1.0" statistical = "1.0.0" strum = "0.25.0" @@ -253,6 +255,7 @@ tokio = "1.37.0" tokio-retry = "0.3" tokio-stream = "0.1.8" tokio-test = "0.4.4" +tokio-util = "0.7.13" toml = "0.8" tower = "0.4.13" tracing = "0.1.37" diff --git a/build_native_in_docker.sh b/build_native_in_docker.sh index 1d95565a612..fdfbdf4f010 100755 --- a/build_native_in_docker.sh +++ b/build_native_in_docker.sh @@ -8,6 +8,7 @@ docker_image_name=sequencer-ci docker build . --build-arg USER_UID=$UID -t ${docker_image_name} --file ${docker_image_name}.Dockerfile ) + docker run \ --rm \ --net host \ diff --git a/commitlint.config.js b/commitlint.config.js index f371cc6f693..092aee14c51 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -28,7 +28,6 @@ const Configuration = { 'consensus', 'deployment', 'helm', - 'infra_utils', 'mempool_test_utils', 'native_blockifier', 'papyrus_base_layer', @@ -56,9 +55,11 @@ const Configuration = { 'starknet_client', 'starknet_committer', 'starknet_consensus_manager', + 'starknet_class_manager_types', 'starknet_gateway', 'starknet_gateway_types', 'starknet_http_server', + 'starknet_infra_utils', 'starknet_integration_tests', 'starknet_l1_provider', 'starknet_l1_provider_types', @@ -70,7 +71,7 @@ const Configuration = { 'starknet_patricia', 'starknet_sequencer_infra', 'starknet_sequencer_node', - 'starknet_sierra_compile', + 'starknet_sierra_multicompile', 'starknet_state_sync', 'starknet_state_sync_types', 'starknet_task_executor', diff --git a/config/papyrus/default_config.json b/config/papyrus/default_config.json index 14d41c59947..228b5a4c832 100644 --- a/config/papyrus/default_config.json +++ b/config/papyrus/default_config.json @@ -344,16 +344,6 @@ "privacy": "Public", "value": 10000 }, - "p2p_sync.stop_sync_at_block_number": { - "description": "Stops the sync at given block number and closes the node cleanly. Used to run profiling on the node.", - "privacy": "Public", - "value": 1000 - }, - "p2p_sync.stop_sync_at_block_number.#is_none": { - "description": "Flag for an optional field.", - "privacy": "TemporaryValue", - "value": true - }, "p2p_sync.wait_period_for_new_data": { "description": "Time in millisseconds to wait when a query returned with partial data before sending a new query", "privacy": "Public", diff --git a/config/sequencer/default_config.json b/config/sequencer/default_config.json index cb80d18bc18..fe5dcc961ba 100644 --- a/config/sequencer/default_config.json +++ b/config/sequencer/default_config.json @@ -109,6 +109,11 @@ "privacy": "Public", "value": 0 }, + "batcher_config.block_builder_config.execute_config.stack_size": { + "description": "The thread stack size (proportional to the maximal gas of a transaction).", + "privacy": "Public", + "value": 0 + }, "batcher_config.block_builder_config.tx_chunk_size": { "description": "The size of the transaction chunk.", "privacy": "Public", @@ -129,11 +134,66 @@ "pointer_target": "versioned_constants_overrides.validate_max_n_steps", "privacy": "Public" }, - "batcher_config.global_contract_cache_size": { - "description": "Cache size for the global_class_hash_to_class. Initialized with this size on creation.", + "batcher_config.contract_class_manager_config.cairo_native_run_config.channel_size": { + "description": "The size of the compilation request channel.", + "privacy": "Public", + "value": 1000 + }, + "batcher_config.contract_class_manager_config.cairo_native_run_config.run_cairo_native": { + "description": "Enables Cairo native execution.", + "privacy": "Public", + "value": false + }, + "batcher_config.contract_class_manager_config.cairo_native_run_config.wait_on_native_compilation": { + "description": "Block Sequencer main program while compiling sierra, for testing.", + "privacy": "Public", + "value": false + }, + "batcher_config.contract_class_manager_config.contract_cache_size": { + "description": "The size of the global contract cache.", "privacy": "Public", "value": 400 }, + "batcher_config.contract_class_manager_config.native_compiler_config.libcairo_native_runtime_path": { + "description": "The path to the Cairo native runtime library file.", + "privacy": "Public", + "value": "" + }, + "batcher_config.contract_class_manager_config.native_compiler_config.libcairo_native_runtime_path.#is_none": { + "description": "Flag for an optional field.", + "privacy": "TemporaryValue", + "value": true + }, + "batcher_config.contract_class_manager_config.native_compiler_config.max_casm_bytecode_size": { + "description": "Limitation of compiled casm bytecode size.", + "privacy": "Public", + "value": 81920 + }, + "batcher_config.contract_class_manager_config.native_compiler_config.max_cpu_time": { + "description": "Limitation of compilation cpu time (seconds).", + "privacy": "Public", + "value": 15 + }, + "batcher_config.contract_class_manager_config.native_compiler_config.max_memory_usage": { + "description": "Limitation of compilation process's virtual memory (bytes).", + "privacy": "Public", + "value": 5368709120 + }, + "batcher_config.contract_class_manager_config.native_compiler_config.max_native_bytecode_size": { + "description": "Limitation of compiled native bytecode size.", + "privacy": "Public", + "value": 15728640 + }, + "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path": { + "description": "The path to the Sierra-to-Native compiler binary.", + "privacy": "Public", + "value": "" + }, + "batcher_config.contract_class_manager_config.native_compiler_config.sierra_to_native_compiler_path.#is_none": { + "description": "Flag for an optional field.", + "privacy": "TemporaryValue", + "value": true + }, "batcher_config.input_stream_content_buffer_size": { "description": "Sets the buffer size for the input transaction channel. Adding more transactions beyond this limit will block until space is available.", "privacy": "Public", @@ -204,11 +264,46 @@ "param_type": "String", "privacy": "TemporaryValue" }, - "compiler_config.max_bytecode_size": { - "description": "Limitation of contract bytecode size.", + "compiler_config.libcairo_native_runtime_path": { + "description": "The path to the Cairo native runtime library file.", + "privacy": "Public", + "value": "" + }, + "compiler_config.libcairo_native_runtime_path.#is_none": { + "description": "Flag for an optional field.", + "privacy": "TemporaryValue", + "value": true + }, + "compiler_config.max_casm_bytecode_size": { + "description": "Limitation of compiled casm bytecode size.", "privacy": "Public", "value": 81920 }, + "compiler_config.max_cpu_time": { + "description": "Limitation of compilation cpu time (seconds).", + "privacy": "Public", + "value": 15 + }, + "compiler_config.max_memory_usage": { + "description": "Limitation of compilation process's virtual memory (bytes).", + "privacy": "Public", + "value": 5368709120 + }, + "compiler_config.max_native_bytecode_size": { + "description": "Limitation of compiled native bytecode size.", + "privacy": "Public", + "value": 15728640 + }, + "compiler_config.sierra_to_native_compiler_path": { + "description": "The path to the Sierra-to-Native compiler binary.", + "privacy": "Public", + "value": "" + }, + "compiler_config.sierra_to_native_compiler_path.#is_none": { + "description": "Flag for an optional field.", + "privacy": "TemporaryValue", + "value": true + }, "components.batcher.execution_mode": { "description": "The component execution mode.", "privacy": "Public", @@ -1027,7 +1122,7 @@ "state_sync_config.network_config.tcp_port": { "description": "The port that the node listens on for incoming tcp connections.", "privacy": "Public", - "value": 10000 + "value": 12345 }, "state_sync_config.p2p_sync_client_config.buffer_size": { "description": "Size of the buffer for read from the storage and for incoming responses.", @@ -1054,16 +1149,6 @@ "privacy": "Public", "value": 10000 }, - "state_sync_config.p2p_sync_client_config.stop_sync_at_block_number": { - "description": "Stops the sync at given block number and closes the node cleanly. Used to run profiling on the node.", - "privacy": "Public", - "value": 1000 - }, - "state_sync_config.p2p_sync_client_config.stop_sync_at_block_number.#is_none": { - "description": "Flag for an optional field.", - "privacy": "TemporaryValue", - "value": true - }, "state_sync_config.p2p_sync_client_config.wait_period_for_new_data": { "description": "Time in millisseconds to wait when a query returned with partial data before sending a new query", "privacy": "Public", diff --git a/config/sequencer/presets/config-batcher.json b/config/sequencer/presets/config-batcher.json index 43508b82119..e8d0fa511c5 100644 --- a/config/sequencer/presets/config-batcher.json +++ b/config/sequencer/presets/config-batcher.json @@ -4,4 +4,5 @@ "strk_fee_token_address": "0x7", "batcher_config.storage.db_config.path_prefix": "/data", "batcher_config.storage.db_config.enforce_file_exists": false, + "validator_id" : "0x1" } diff --git a/crates/bin/starknet-native-compile/Cargo.lock b/crates/bin/starknet-native-compile/Cargo.lock index b0e5f2319c0..69133700310 100644 --- a/crates/bin/starknet-native-compile/Cargo.lock +++ b/crates/bin/starknet-native-compile/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler2" @@ -42,9 +42,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anstream" @@ -82,7 +82,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -92,27 +92,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "aquamarine" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" dependencies = [ "include_dir", "itertools 0.10.5", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -121,10 +121,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -132,16 +132,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe 0.6.0", + "fnv", + "hashbrown 0.15.2", + "itertools 0.13.0", + "num-bigint", + "num-integer", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest", "itertools 0.10.5", @@ -152,6 +173,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest", + "educe 0.6.0", + "itertools 0.13.0", + "num-bigint", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -162,6 +203,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.95", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -175,28 +226,67 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "ark-poly" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe 0.6.0", + "fnv", + "hashbrown 0.15.2", +] + [[package]] name = "ark-secp256k1" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c02e954eaeb4ddb29613fee20840c2bbc85ca4396d53e33837e11905363c5f2" dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-secp256k1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bd211c48debd3037b48873a7aa22c3aba034e83388aa4124795c9f220b88c7" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", ] [[package]] @@ -205,9 +295,20 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3975a01b0a6e3eae0f72ec7ca8598a6620fc72fa5981f6f5cca33b7cd788f633" dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-secp256r1" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cf8be5820de567729bfa73a410ddd07cec8ad102d9a4bf61fd6b2e60db264e8" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", ] [[package]] @@ -216,8 +317,21 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ - "ark-serialize-derive", - "ark-std", + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", "digest", "num-bigint", ] @@ -233,6 +347,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -243,6 +368,16 @@ dependencies = [ "rand", ] +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -294,7 +429,7 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -302,17 +437,17 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.87", + "syn 2.0.95", "which", ] [[package]] name = "bindgen" -version = "0.70.1" +version = "0.71.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" dependencies = [ "bitflags", "cexpr", @@ -323,9 +458,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.0", "shlex", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -370,11 +505,36 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bon" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7acc34ff59877422326db7d6f2d845a582b16396b6b08194942bf34c6528ab" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4159dd617a7fbc9be6a692fe69dc2954f8e6bb6bb5e4d7578467441390d77fd0" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.95", +] + [[package]] name = "bstr" -version = "1.10.0" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "serde", @@ -421,9 +581,9 @@ dependencies = [ [[package]] name = "cairo-lang-casm" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e0dcdb6358bb639dd729546611bd99bada94c86e3f262c3637855abea9a972" +checksum = "151375fd72f8765eb3ca78b4aa8f71269179169d4a8d3d03f4d8a80ff062d1e5" dependencies = [ "cairo-lang-utils", "indoc", @@ -435,9 +595,9 @@ dependencies = [ [[package]] name = "cairo-lang-compiler" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8657f5a5611f341a85e80ba0b21848fc34bfdf391bfd93df0baf4516c3e4159" +checksum = "b013e303a3b2c67599cbb020d1ae3b96ceef19ed522625b32a1f4f8904bdc2d0" dependencies = [ "anyhow", "cairo-lang-defs", @@ -456,23 +616,23 @@ dependencies = [ "rust-analyzer-salsa", "semver", "smol_str", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-debug" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0635aa554d297acefe6a35b495aba2795d0af5b7f97c4ab63829c7d62291ef41" +checksum = "33e397d9e5f085d04f9251c3e8c6bba2c0aeb39cb41de532977f08bc8dd0dffa" dependencies = [ "cairo-lang-utils", ] [[package]] name = "cairo-lang-defs" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b356e1c09898e8b8cfdd9731579d89365a13d8b4f7e717962e0cc7d125b83c" +checksum = "e293692f3db2fdc2ab72ced7c1a31de9c7ba6f7202dfa67c4596a42fca5255e5" dependencies = [ "cairo-lang-debug", "cairo-lang-diagnostics", @@ -487,9 +647,9 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfe7c6ff96182da29012b707a3554e34a50f19cc96013ee45b0eb36dd396ec8" +checksum = "af2fad7dcf507f01810038b3879310514e238c92c9e86cf66ed898e53dadc273" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -499,9 +659,9 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723d244465309d5409e297b5486d62cbec06f2c47b05044414bb640e3f14caab" +checksum = "62bbbd955110dc35770c77f5f4e420ea963a175a70199c8d95777b1e53da40a8" dependencies = [ "cairo-lang-utils", "good_lp", @@ -509,9 +669,9 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "237030772ae5368f19a9247e1f63f753f8ad8de963477166e402f4825c0a141d" +checksum = "ff86b7145e376eb7787da47d214583482944f8b40335947804466211e1b5f3a0" dependencies = [ "cairo-lang-debug", "cairo-lang-utils", @@ -525,9 +685,9 @@ dependencies = [ [[package]] name = "cairo-lang-formatter" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b71f0eb3a36a6cb5f7f07843926783c4c17e44c9516b53171727a108782f3eb" +checksum = "b1b8abd7b170b48b9eadb758b4fdab7e9f03bad8b2cbe23ad8b6e38232311da0" dependencies = [ "anyhow", "cairo-lang-diagnostics", @@ -540,14 +700,14 @@ dependencies = [ "itertools 0.12.1", "rust-analyzer-salsa", "serde", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-lowering" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d095d78e2f1de499429c95655d6135a3d24c384b36d8de9f84e0aa4e07ee152" +checksum = "d907f52244a34208ee2e5232602aa213ae190c8c015a9ab0e378b695ca9cc1b0" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -570,9 +730,9 @@ dependencies = [ [[package]] name = "cairo-lang-parser" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb828af7f948a3ef7fa65de14e3f639daedefb046dfefcad6e3116d2cb0f89a0" +checksum = "ad5c844ec8e284ed1e423d40bd5d4baf98d6415986c3d4065d2c1ff8a09b5934" dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", @@ -590,9 +750,9 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135a600043bf7030eacc6ebf2a609c2364d6ffeb04e1f3c809a2738f6b02c829" +checksum = "478c84c57c6291f1e072fedd12eb0458eb40a3ea16a17d02e8ccf895924b9ea1" dependencies = [ "cairo-lang-defs", "cairo-lang-diagnostics", @@ -607,47 +767,69 @@ dependencies = [ "smol_str", ] +[[package]] +name = "cairo-lang-primitive-token" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123ac0ecadf31bacae77436d72b88fa9caef2b8e92c89ce63a125ae911a12fae" + [[package]] name = "cairo-lang-proc-macros" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac857ec4b564712f3e16e3314e23cc0787ab1c05cdfee83f1c8f9989a6eee40f" +checksum = "5d7afa5c9bb8be0c3654792caec70ca51587667665e667c2250b4fa79df901d3" dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] name = "cairo-lang-project" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cc37b7f8889cdea631aeea3bcc70d5c86ac8fb1d98aabc83f16283d60f1643" +checksum = "0e557bbf5fc153203622f4fd66d8de23c35c39fe92672ba90c0a3b33766f016f" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", "serde", - "smol_str", - "thiserror", + "thiserror 1.0.69", "toml", ] +[[package]] +name = "cairo-lang-runnable-utils" +version = "2.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cb5aea4258a0fcc52a8ac3848c4916a81f2601ebebdd462b4a7c6123cc20589" +dependencies = [ + "cairo-lang-casm", + "cairo-lang-sierra", + "cairo-lang-sierra-ap-change", + "cairo-lang-sierra-gas", + "cairo-lang-sierra-to-casm", + "cairo-lang-sierra-type-size", + "cairo-lang-utils", + "cairo-vm", + "itertools 0.12.1", + "thiserror 1.0.69", +] + [[package]] name = "cairo-lang-runner" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7474375528ffa7f47e343983d32051898e4e7b05ac0bdc48ee84b1325d8b562a" +checksum = "c3b0e437bbaa58d41c1215451ef50aa914a49780a0af886e55862576aff6c19f" dependencies = [ - "ark-ff", - "ark-secp256k1", - "ark-secp256r1", + "ark-ff 0.4.2", + "ark-secp256k1 0.4.0", + "ark-secp256r1 0.4.0", "cairo-lang-casm", "cairo-lang-lowering", + "cairo-lang-runnable-utils", "cairo-lang-sierra", - "cairo-lang-sierra-ap-change", "cairo-lang-sierra-generator", "cairo-lang-sierra-to-casm", - "cairo-lang-sierra-type-size", "cairo-lang-starknet", "cairo-lang-utils", "cairo-vm", @@ -660,14 +842,14 @@ dependencies = [ "sha2", "smol_str", "starknet-types-core", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-semantic" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c560cf4b4a89325d3a9594f490fffee38cf30e0990e808bb927619de9d0c973a" +checksum = "2c82e765f784f4175232f51be0bd81551c48fcf64d8e9ae2e88f15c7130ca549" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -685,15 +867,16 @@ dependencies = [ "num-bigint", "num-traits", "rust-analyzer-salsa", + "sha3", "smol_str", "toml", ] [[package]] name = "cairo-lang-sierra" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8118f55ca7d567bfc60960b445d388564d04bf48335c983b1595cb35f67a01c5" +checksum = "0eda99022545ec4ec1b255f05c40d498d7040e3c60ecc942009368462448686b" dependencies = [ "anyhow", "cairo-lang-utils", @@ -713,14 +896,14 @@ dependencies = [ "sha3", "smol_str", "starknet-types-core", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2716ef8d4ce0fb700f83ed3281f3656436570e60249d41c65c79dc1ca27be002" +checksum = "f13db868ea56fc7c109a21260355ef5380e8d4426ce9781a00cc7d2d18a0aada" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -729,14 +912,14 @@ dependencies = [ "itertools 0.12.1", "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-sierra-gas" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a44da87a35845470c4f4c648225232a15e0875fe809045b6088464491f838b" +checksum = "d4e26fbde40815352ff18f2e341a9792c651be0597bfb8e63deb0f4dd484782d" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -745,14 +928,14 @@ dependencies = [ "itertools 0.12.1", "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-sierra-generator" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bc5cf9f3965a7030a114dfe3d31d183287fbfbfbf904deaaa2468cadb936aa" +checksum = "4e2a09730000a75c143d940e0e4906cf35dd0b607b0902223dc73ff5786abb7b" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -774,9 +957,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18b7616f1a3c41c4646094b5abf774e558428e9c1eda5d78d7b0638ec5c264e5" +checksum = "07b3af3dee351045e063fea341f242c6eab9c0f5eca90ee8b960ddcefa799142" dependencies = [ "assert_matches", "cairo-lang-casm", @@ -790,14 +973,14 @@ dependencies = [ "num-bigint", "num-traits", "starknet-types-core", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-sierra-type-size" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871077dbc08df5d134dc3975538171c14b266ba405d1298085afdb227216f0a3" +checksum = "5ed52ed8acd957e71139e3dde782aad04946bd1e4d979a2a0b46bd09dd200348" dependencies = [ "cairo-lang-sierra", "cairo-lang-utils", @@ -805,9 +988,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f21804eb8931d41e258e7a393afc8ee8858308e95b3ed2e9b6b469ef68a6a50" +checksum = "9d156a22ebdca8041506c0ae2be765a7bc81907003e588ee643f7e64c7788fbf" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -830,14 +1013,14 @@ dependencies = [ "serde_json", "smol_str", "starknet-types-core", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-starknet-classes" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2496bccd68fa0286b35b72c98439316a3a872ef7ec6d881f0dac90b17997490" +checksum = "a5a5b4adb80238064a7294c43d8edcc18d908c0872848063682b5c0a458a77af" dependencies = [ "cairo-lang-casm", "cairo-lang-sierra", @@ -853,17 +1036,18 @@ dependencies = [ "sha3", "smol_str", "starknet-types-core", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "cairo-lang-syntax" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d77ea2e35d3610098ff13e373fc519aedc6a5096ed8547081aacfc104ef4422" +checksum = "621c6dbf1cbda7d40f4dc78ea2363d3b565e4c7e9edfdcb08e2be61bfbbaf819" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", + "cairo-lang-primitive-token", "cairo-lang-utils", "num-bigint", "num-traits", @@ -874,9 +1058,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b01d505ab26ca9ce829faf3a8dd097f5d7962d2eb8f136017a260694a6a72e8" +checksum = "cd79262096fbbd618c52d01964f5ed36e693f9dc1113a0d217e1b3825bd85822" dependencies = [ "genco", "xshell", @@ -884,9 +1068,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-plugin" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f83e082c8ebf81295156f13399f880037c749a9f1fc3f55b1be7e49fe124c6" +checksum = "bbe07acbac1f6f31e0b422833174e0a5220370542b47d9ceb6f4e4c7e33ffe61" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -911,9 +1095,9 @@ dependencies = [ [[package]] name = "cairo-lang-test-utils" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb143a22f5a3510df8c4dec76e17c1e36bbcbddcd7915601f6a51a72418c454f" +checksum = "3d7df411c00d122de3941dc8cb78d216e2414b2bbb713c006613b98113c35861" dependencies = [ "cairo-lang-formatter", "cairo-lang-utils", @@ -924,12 +1108,12 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.9.0-dev.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35df943ebcf8e1db11ee9f4f46f843dde5b71639ca79ea0d8caa7973f91d8b12" +checksum = "33d72369877bade85ecfef9bc13cbd0c66fdaa3e8cd9686833f0db65eacaa833" dependencies = [ "hashbrown 0.14.5", - "indexmap 2.6.0", + "indexmap 2.7.0", "itertools 0.12.1", "num-bigint", "num-traits", @@ -939,16 +1123,16 @@ dependencies = [ [[package]] name = "cairo-native" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bdebc70c3d563bc30078985ae3e975aa7dc4fa233631b5e0462a924c26c0dd9" +checksum = "63428bf6a1c51044224ce186209d1913a0504728f5c4601c11422bbf78dce168" dependencies = [ "anyhow", "aquamarine", - "ark-ec", - "ark-ff", - "ark-secp256k1", - "ark-secp256r1", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-secp256k1 0.5.0", + "ark-secp256r1 0.5.0", "bumpalo", "cairo-lang-compiler", "cairo-lang-defs", @@ -967,7 +1151,7 @@ dependencies = [ "cc", "clap", "colored", - "educe", + "educe 0.5.11", "itertools 0.13.0", "keccak", "lazy_static", @@ -985,7 +1169,7 @@ dependencies = [ "starknet-types-core", "stats_alloc", "tempfile", - "thiserror", + "thiserror 2.0.9", "tracing", "tracing-subscriber", "utf8_iter", @@ -993,12 +1177,12 @@ dependencies = [ [[package]] name = "cairo-native-runtime" -version = "0.2.4" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf997252c402d6844f41357660cde3c11825ac5b3feafd0fb99b9dcdfb58aa3" +checksum = "e582ea1c91df4315fb38ec655c5be0b30733d551218feddf2268260367ace3a7" dependencies = [ "cairo-lang-sierra-gas", - "itertools 0.13.0", + "itertools 0.14.0", "lazy_static", "num-traits", "rand", @@ -1039,19 +1223,18 @@ dependencies = [ [[package]] name = "caseless" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808dab3318747be122cb31d36de18d4d1c81277a76f8332a02b81a3d73463d7f" +checksum = "8b6fd507454086c8edfd769ca6ada439193cdb209c7681712ef6275cccbfe5d8" dependencies = [ - "regex", "unicode-normalization", ] [[package]] name = "cc" -version = "1.1.37" +version = "1.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" +checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7" dependencies = [ "jobserver", "libc", @@ -1096,9 +1279,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -1106,9 +1289,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -1125,14 +1308,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "colorchoice" @@ -1142,22 +1325,22 @@ checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "colored" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "comrak" -version = "0.28.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c93ab3577cca16b4a1d80a88c2e0cd8b6e969e51696f0bbb0d1dcb0157109832" +checksum = "48ae8f3e7e3f3d424cbb33354fc36943d507327d210aa5794b0192f4be726c6d" dependencies = [ + "bon", "caseless", - "derive_builder", "entities", "memchr", "once_cell", @@ -1175,18 +1358,18 @@ checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" [[package]] name = "const_format" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c655d81ff1114fb0dcdea9225ea9f0cc712a6f8d189378e82bdf62a473a64b" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" dependencies = [ "const_format_proc_macros", ] [[package]] name = "const_format_proc_macros" -version = "0.2.33" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff1a44b93f47b1bac19a27932f5c591e43d1ba357ee4f61526c8a25603f0eb1" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" dependencies = [ "proc-macro2", "quote", @@ -1210,9 +1393,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1228,9 +1411,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1247,9 +1430,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" @@ -1299,7 +1482,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -1310,21 +1493,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", + "syn 2.0.95", ] [[package]] @@ -1347,37 +1516,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.87", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.87", -] - [[package]] name = "deunicode" version = "1.6.0" @@ -1446,7 +1584,19 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.95", ] [[package]] @@ -1487,7 +1637,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -1498,19 +1648,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixedbitset" @@ -1520,9 +1670,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1536,9 +1686,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" [[package]] name = "funty" @@ -1548,9 +1698,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "genco" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afac3cbb14db69ac9fef9cdb60d8a87e39a7a527f85a81a923436efa40ad42c6" +checksum = "a35958104272e516c2a5f66a9d82fba4784d2b585fc1e2358b8f96e15d342995" dependencies = [ "genco-macros", "relative-path", @@ -1559,13 +1709,13 @@ dependencies = [ [[package]] name = "genco-macros" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "553630feadf7b76442b0849fd25fdf89b860d933623aec9693fed19af0400c78" +checksum = "43eaff6bbc0b3a878361aced5ec6a2818ee7c541c5b33b5880dfa9a86c23e9e7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -1593,9 +1743,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "globset" @@ -1606,15 +1756,15 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] [[package]] name = "good_lp" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97630e1e456d7081c524488a87d8f8f7ed0fd3100ba10c55e3cfa7add5ce05c6" +checksum = "10efcd6c7d6f84cb5b4f9155248e0675deab9cfb92d0edbcb25cb81490b65ae7" dependencies = [ "fnv", "microlp", @@ -1648,9 +1798,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", @@ -1686,11 +1836,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1715,7 +1865,7 @@ dependencies = [ "globset", "log", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "same-file", "walkdir", "winapi-util", @@ -1723,13 +1873,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.95", ] [[package]] @@ -1770,12 +1920,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", "serde", ] @@ -1836,11 +1986,20 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -1853,10 +2012,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1897,7 +2057,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" dependencies = [ - "regex-automata 0.4.8", + "regex-automata 0.4.9", ] [[package]] @@ -1939,18 +2099,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2005,7 +2165,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.1", + "hashbrown 0.15.2", ] [[package]] @@ -2029,29 +2189,26 @@ dependencies = [ [[package]] name = "melior" -version = "0.19.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d97014786c173a839839e2a068e82516ad1eb94fca1d40013d3c5e224e7c1e" +checksum = "1cfcb398e6571361b6f54fd0057066d9b47a822bcb797bf5867e5412e9e6f387" dependencies = [ - "dashmap", "melior-macro", "mlir-sys", - "once_cell", ] [[package]] name = "melior-macro" -version = "0.12.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef7ae0ba2f96784ec407d58374c8477f5b04ec8c57a114cafef0c8f165c4b288" +checksum = "3086e8c12eb1999d636595cc3c2aee82a28d4bb80163267d51bd66a617cdaefc" dependencies = [ "comrak", "convert_case", - "once_cell", "proc-macro2", "quote", "regex", - "syn 2.0.87", + "syn 2.0.95", "tblgen-alt", "unindent", ] @@ -2064,9 +2221,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "microlp" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4190b5ca62abfbc95a81d57f4a8e3e3872289d656f3eeea5820b3046a1f81d4b" +checksum = "a4d5845c04529928925fd1abd6776813710ad57ef41cb31958b1d35622a7d8e9" dependencies = [ "log", "sprs", @@ -2080,20 +2237,20 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", ] [[package]] name = "mlir-sys" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fae0a14b0940736a243fef4a4d96d8cdf8a253272031b63c5e4b1bea207c82b0" +checksum = "21b598f9c0fa7a453eeaa9fe419ae93759c94a66eb6f8a496d195ba596ae3c4d" dependencies = [ - "bindgen 0.70.1", + "bindgen 0.71.1", ] [[package]] @@ -2273,7 +2430,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2318,7 +2475,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.6.0", + "indexmap 2.7.0", ] [[package]] @@ -2350,15 +2507,15 @@ checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "portable-atomic" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" +checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" [[package]] name = "portable-atomic-util" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90a7d5beecc52a491b54d6dd05c7a45ba1801666a5baad9fdbfc6fef8d2d206c" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ "portable-atomic", ] @@ -2401,7 +2558,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -2414,43 +2571,40 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2519,9 +2673,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags", ] @@ -2534,7 +2688,7 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2545,7 +2699,7 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.8", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] @@ -2560,9 +2714,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2609,12 +2763,12 @@ version = "0.17.0-pre.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "lock_api", "oorandom", "parking_lot", "rust-analyzer-salsa-macros", - "rustc-hash", + "rustc-hash 1.1.0", "smallvec", "tracing", "triomphe", @@ -2629,7 +2783,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -2648,6 +2802,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" + [[package]] name = "rustc_version" version = "0.4.1" @@ -2659,22 +2819,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.40" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" [[package]] name = "ryu" @@ -2713,7 +2873,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -2724,31 +2884,31 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.214" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -2759,14 +2919,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -2913,7 +3073,7 @@ checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f" dependencies = [ "starknet-curve 0.4.2", "starknet-ff", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -2940,7 +3100,7 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abf1b44ec5b18d87c1ae5f54590ca9d0699ef4dd5b2ffa66fc97f24613ec585" dependencies = [ - "ark-ff", + "ark-ff 0.4.2", "crypto-bigint", "getrandom", "hex", @@ -2948,7 +3108,7 @@ dependencies = [ [[package]] name = "starknet-native-compile" -version = "0.2.4" +version = "0.2.5" dependencies = [ "cairo-lang-sierra", "cairo-lang-starknet-classes", @@ -3016,9 +3176,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -3040,20 +3200,21 @@ dependencies = [ "bindgen 0.69.5", "cc", "paste", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -3073,7 +3234,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -3084,7 +3254,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.95", ] [[package]] @@ -3119,9 +3300,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "num-conv", @@ -3147,9 +3328,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -3187,7 +3368,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", @@ -3196,9 +3377,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -3207,20 +3388,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -3239,9 +3420,9 @@ dependencies = [ [[package]] name = "tracing-serde" -version = "0.1.3" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" dependencies = [ "serde", "tracing-core", @@ -3249,9 +3430,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -3296,14 +3477,14 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c878a167baa8afd137494101a688ef8c67125089ff2249284bd2b5f9bfedb815" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -3380,9 +3561,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -3391,24 +3572,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3416,22 +3596,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "which" @@ -3467,7 +3647,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys", ] [[package]] @@ -3476,46 +3656,13 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -3524,46 +3671,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3576,48 +3705,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3626,9 +3731,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "39281189af81c07ec09db316b302a3e67bf9bd7cbf6c820b50e35fee9c2fa980" dependencies = [ "memchr", ] @@ -3644,18 +3749,18 @@ dependencies = [ [[package]] name = "xshell" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db0ab86eae739efd1b054a8d3d16041914030ac4e01cd1dca0cf252fd8b6437" +checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" dependencies = [ "xshell-macros", ] [[package]] name = "xshell-macros" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d422e8e38ec76e2f06ee439ccc765e9c6a9638b9e7c9f2e8255e4d41e8bd852" +checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" [[package]] name = "yansi" @@ -3681,7 +3786,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] @@ -3701,7 +3806,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.95", ] [[package]] diff --git a/crates/bin/starknet-native-compile/Cargo.toml b/crates/bin/starknet-native-compile/Cargo.toml index 697ba48a92b..02631152868 100644 --- a/crates/bin/starknet-native-compile/Cargo.toml +++ b/crates/bin/starknet-native-compile/Cargo.toml @@ -1,15 +1,15 @@ [package] name = "starknet-native-compile" # The version of this crate should equal the version of cairo-native. -version = "0.2.4" +version = "0.2.5" edition = "2021" repository = "https://github.com/starkware-libs/sequencer/" license = "Apache-2.0" [dependencies] # TODO(Avi, 01/02/2025): Check consistency with the blockifier. -cairo-lang-sierra = "2.9.2" -cairo-lang-starknet-classes = "2.9.2" -cairo-native = "0.2.4" +cairo-lang-sierra = "2.10.0-rc.1" +cairo-lang-starknet-classes = "2.10.0-rc.1" +cairo-native = "0.2.9" clap = { version = "4.5.4", features = ["derive"] } serde_json = "1.0.116" diff --git a/crates/blockifier/Cargo.toml b/crates/blockifier/Cargo.toml index cfc57a10bfb..36f1cfe2a6f 100644 --- a/crates/blockifier/Cargo.toml +++ b/crates/blockifier/Cargo.toml @@ -10,13 +10,13 @@ description = "The transaction-executing component in the Starknet sequencer." workspace = true [features] -cairo_native = ["dep:cairo-native", "dep:stacker", "starknet_sierra_compile/cairo_native", "dep:sierra-emu"] +cairo_native = ["dep:cairo-native", "starknet_sierra_multicompile/cairo_native", "dep:sierra-emu"] jemalloc = ["dep:tikv-jemallocator"] native_blockifier = [] reexecution = ["transaction_serde"] -testing = ["rand", "rstest", "starknet_api/testing"] +testing = ["rand", "rstest", "rstest_reuse", "starknet_api/testing"] transaction_serde = [] -profiling = [] +only-native = [] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -36,7 +36,6 @@ sierra-emu = { workspace = true, optional = true } cairo-vm.workspace = true derive_more.workspace = true indexmap.workspace = true -infra_utils.workspace = true itertools.workspace = true keccak.workspace = true log.workspace = true @@ -49,14 +48,15 @@ paste.workspace = true phf = { workspace = true, features = ["macros"] } rand = { workspace = true, optional = true } rstest = { workspace = true, optional = true } +rstest_reuse = { workspace = true, optional = true } semver.workspace = true serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, features = ["arbitrary_precision"] } sha2.workspace = true -stacker = { workspace = true, optional = true } starknet-types-core.workspace = true starknet_api.workspace = true -starknet_sierra_compile = { workspace = true, optional = true } +starknet_infra_utils.workspace = true +starknet_sierra_multicompile.workspace = true strum.workspace = true strum_macros.workspace = true tempfile.workspace = true @@ -73,16 +73,18 @@ pretty_assertions.workspace = true rand.workspace = true regex.workspace = true rstest.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +rstest_reuse.workspace = true +starknet_api = { path = "../starknet_api", features = ["testing"] } test-case.workspace = true [build-dependencies] -infra_utils.workspace = true +starknet_infra_utils.workspace = true [[bench]] harness = false name = "blockifier_bench" path = "bench/blockifier_bench.rs" +required-features = ["testing"] [[test]] name = "feature_contracts_compatibility_test" diff --git a/crates/blockifier/ERC20/ERC20_Cairo1/erc20.sierra.json b/crates/blockifier/ERC20/ERC20_Cairo1/erc20.sierra.json new file mode 100644 index 00000000000..b0c6823b4e3 --- /dev/null +++ b/crates/blockifier/ERC20/ERC20_Cairo1/erc20.sierra.json @@ -0,0 +1,3880 @@ +{ + "sierra_program": [ + "0x1", + "0x6", + "0x0", + "0x2", + "0x7", + "0x0", + "0x302", + "0xfe", + "0x53", + "0x52616e6765436865636b", + "0x800000000000000100000000000000000000000000000000", + "0x436f6e7374", + "0x800000000000000000000000000000000000000000000002", + "0x1", + "0xa", + "0x2", + "0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff", + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x45524332303a206d696e7420746f2074686520302061646472657373", + "0x436f6e747261637441646472657373", + "0x800000000000000700000000000000000000000000000000", + "0x75313238", + "0x537472756374", + "0x800000000000000700000000000000000000000000000003", + "0x0", + "0x25e2ca4b84968c2d8b83ef476ca8549410346b00836ce79beaf538155990bb2", + "0x5", + "0x800000000000000700000000000000000000000000000004", + "0x1051fce1176db22fe657487f168047a0b3e168863bea30db21d507d12e33681", + "0x4", + "0x6", + "0x45524332303a20617070726f76652066726f6d2030", + "0xffffffffffffffffffffffffffffffff", + "0x66656c74323532", + "0x800000000000000700000000000000000000000000000002", + "0x20c573050f4f72ab687d1e30ab9e3112f066656a1db232d4e8d586e1bc52772", + "0x753235365f737562204f766572666c6f77", + "0x753235365f616464204f766572666c6f77", + "0x33a32bc739412cec48c0291b76ed61bbe7c9d3a349015650f99cdc4ed9d2e04", + "0x456e756d", + "0x3fd53fc455b85adf3bca466f69d21202561f799eb9b5a23813bb3659ac4946a", + "0xe", + "0x7", + "0x800000000000000f00000000000000000000000000000001", + "0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3", + "0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972", + "0x11", + "0x53746f726167654261736541646472657373", + "0x1802098ad3a768b9070752b9c76d78739119b657863faee996237047e2cd718", + "0x13", + "0x11956ef5427d8b17839ef1ab259882b25c0eabf6d6a15c034942faee6617e37", + "0x45524332303a207472616e7366657220746f2030", + "0x45524332303a207472616e736665722066726f6d2030", + "0x4e6f6e5a65726f", + "0x800000000000000700000000000000000000000000000001", + "0x53746f726555313238202d206e6f6e2075313238", + "0x47", + "0x350d9416f58c95be8ef9cdc9ecb299df23021512fdc0110a670111a3553ab86", + "0x4661696c656420746f20646573657269616c697a6520706172616d202334", + "0x4661696c656420746f20646573657269616c697a6520706172616d202335", + "0x4661696c656420746f20646573657269616c697a6520706172616d202333", + "0x2f3fd47d2dd288bfeeffd3691afceae84c0f55c0d45a7194665c5837fa4e7f7", + "0x800000000000000f00000000000000000000000000000003", + "0x1f", + "0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672", + "0x4172726179", + "0x800000000000000300000000000000000000000000000001", + "0x800000000000000300000000000000000000000000000003", + "0x21", + "0x22", + "0x39617af083606a3784747e03219a53c59dfe642003a40b0beb01896005de01", + "0x20", + "0x23", + "0x426f78", + "0x2d", + "0x2f", + "0x536e617073686f74", + "0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62", + "0x27", + "0x30", + "0x29", + "0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec", + "0x2a", + "0x753332", + "0x80000000000000070000000000000000000000000000000e", + "0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39", + "0x28", + "0x2b", + "0x2c", + "0x753634", + "0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5", + "0x2e", + "0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508", + "0x800000000000000700000000000000000000000000000006", + "0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7", + "0x26", + "0x25", + "0x31", + "0x12867ecd09c884a5cf1f6d9eb0193b4695ce3bb3b2d796a8367d0c371f59cb2", + "0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7", + "0x34", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x1166fe35572d4e7764dac0caf1fd7fc591901fd01156db2561a07b68ab8dca2", + "0x141ea21bd03254e41074504de8465806cb179228cd769ab9e55224c660a57c4", + "0x38", + "0x2a69c3f2ee27bbe2624c4ffcb3563ad31a1d6caee2eef9aed347284f5f8a34d", + "0xbf4c436d6f8521e5c6189511c75075de702ad597ce22c1786275e8e5167ec7", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x12ec76808d96ca2583b0dd3fb55396ab8783beaa30b8e3bf084a606e215849e", + "0x2b22539ea90e179bb2e7ef5f6db1255a5f497b922386e746219ec855ba7ab0c", + "0x25b1ef8ee6544359221f3cf316f768360e83448109193bdcef77f52a79d95c4", + "0x506564657273656e", + "0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511", + "0x2ce4352eafa6073ab4ecf9445ae96214f99c2c33a29c01fcae68ba501d10e2c", + "0x42", + "0x268e4078627d9364ab472ed410c0ea6fe44919b24eafd69d665019c5a1c0c88", + "0x1557182e4359a1f0c6301278e8f5b35a776ab58d39892581e357578fb287836", + "0x53746f72655538202d206e6f6e207538", + "0x7538", + "0x30df86604b54525ae11ba1b715c090c35576488a1286b0453186a976e6c9a32", + "0x4f7574206f6620676173", + "0x53746f7261676541646472657373", + "0x145cc613954179acf89d43c94ed0e091828cbddcca83f5b408785785036d36d", + "0x4275696c74696e436f737473", + "0x53797374656d", + "0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6", + "0x4a", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x4761734275696c74696e", + "0xde", + "0x7265766f6b655f61705f747261636b696e67", + "0x77697468647261775f676173", + "0x6272616e63685f616c69676e", + "0x7374727563745f6465636f6e737472756374", + "0x73746f72655f74656d70", + "0x61727261795f736e617073686f745f706f705f66726f6e74", + "0x64726f70", + "0x61727261795f6e6577", + "0x636f6e73745f61735f696d6d656469617465", + "0x51", + "0x61727261795f617070656e64", + "0x7374727563745f636f6e737472756374", + "0x656e756d5f696e6974", + "0x50", + "0x52", + "0x4f", + "0x6765745f6275696c74696e5f636f737473", + "0x4e", + "0x77697468647261775f6761735f616c6c", + "0x73746f726167655f626173655f616464726573735f636f6e7374", + "0x361458367e696363fbcc70777d07ebbd2394e89fd0adcaf147faccd1d294d60", + "0x4d", + "0x736e617073686f745f74616b65", + "0x72656e616d65", + "0x73746f726167655f616464726573735f66726f6d5f62617365", + "0x4b", + "0x4c", + "0x73746f726167655f726561645f73797363616c6c", + "0x49", + "0x216b05c387bab9ac31918a3e61672f4618601f3c598a2f3f2710f37053e1ea4", + "0x4c4fb1ab068f6039d5780c68dd0fa2f8742cceb3426d19667778ca7f3518a9", + "0x48", + "0x75385f7472795f66726f6d5f66656c74323532", + "0x75385f746f5f66656c74323532", + "0x46", + "0x6a756d70", + "0x45", + "0x44", + "0x66756e6374696f6e5f63616c6c", + "0x3", + "0xc", + "0x656e756d5f6d61746368", + "0x43", + "0x647570", + "0x753132385f746f5f66656c74323532", + "0x656e61626c655f61705f747261636b696e67", + "0x756e626f78", + "0x41", + "0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371", + "0x64697361626c655f61705f747261636b696e67", + "0x40", + "0x3f", + "0x3e", + "0x3d", + "0xd", + "0x3c", + "0x3b", + "0x3a", + "0x39", + "0x37", + "0x36", + "0x35", + "0x75313238735f66726f6d5f66656c74323532", + "0x33", + "0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c", + "0x32", + "0xf", + "0x24", + "0x10", + "0x1e", + "0x12", + "0x14", + "0x1d", + "0x1c", + "0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1", + "0x1b", + "0x1a", + "0x2679d68052ccd03a53755ca9169677965fbd93e489df62f5f40d4f03c24f7a4", + "0x19", + "0x636f6e74726163745f616464726573735f746f5f66656c74323532", + "0x706564657273656e", + "0x66656c743235325f69735f7a65726f", + "0x17", + "0x18", + "0x16", + "0x15", + "0x753132385f6f766572666c6f77696e675f737562", + "0x73746f726167655f77726974655f73797363616c6c", + "0x753132385f6f766572666c6f77696e675f616464", + "0x656d69745f6576656e745f73797363616c6c", + "0xb", + "0x9", + "0x753132385f6571", + "0x8", + "0x636f6e74726163745f616464726573735f636f6e7374", + "0x110f", + "0xffffffffffffffff", + "0xa4", + "0x6e", + "0x97", + "0x8e", + "0x110", + "0xc7", + "0x103", + "0xf6", + "0xec", + "0xfb", + "0x171", + "0x133", + "0x164", + "0x15d", + "0x209", + "0x18d", + "0x192", + "0x1f7", + "0x1f3", + "0x1aa", + "0x1e4", + "0x54", + "0x55", + "0x56", + "0x57", + "0x1dc", + "0x1fb", + "0x58", + "0x59", + "0x5a", + "0x5b", + "0x5c", + "0x5d", + "0x2d0", + "0x226", + "0x22b", + "0x2be", + "0x2ba", + "0x238", + "0x23d", + "0x2a7", + "0x2a2", + "0x256", + "0x291", + "0x5e", + "0x5f", + "0x60", + "0x61", + "0x62", + "0x63", + "0x289", + "0x2ac", + "0x64", + "0x65", + "0x66", + "0x67", + "0x68", + "0x2c2", + "0x69", + "0x6a", + "0x6b", + "0x6c", + "0x6d", + "0x6f", + "0x70", + "0x71", + "0x72", + "0x73", + "0x74", + "0x3d2", + "0x2ed", + "0x2f2", + "0x3c0", + "0x3bc", + "0x2fd", + "0x302", + "0x337", + "0x332", + "0x310", + "0x315", + "0x328", + "0x322", + "0x33f", + "0x32c", + "0x33a", + "0x3aa", + "0x355", + "0x399", + "0x387", + "0x75", + "0x76", + "0x77", + "0x78", + "0x79", + "0x7a", + "0x37e", + "0x7b", + "0x7c", + "0x7d", + "0x390", + "0x7e", + "0x7f", + "0x80", + "0x81", + "0x82", + "0x83", + "0x84", + "0x85", + "0x86", + "0x3c4", + "0x87", + "0x88", + "0x89", + "0x8a", + "0x8b", + "0x8c", + "0x8d", + "0x8f", + "0x90", + "0x91", + "0x92", + "0x51d", + "0x3ef", + "0x3f4", + "0x50b", + "0x507", + "0x401", + "0x406", + "0x4f4", + "0x4ef", + "0x411", + "0x416", + "0x44b", + "0x446", + "0x424", + "0x429", + "0x43c", + "0x436", + "0x453", + "0x440", + "0x44e", + "0x4dc", + "0x46a", + "0x4ca", + "0x4b7", + "0x4aa", + "0x4a1", + "0x4c1", + "0x93", + "0x94", + "0x95", + "0x96", + "0x98", + "0x99", + "0x9a", + "0x9b", + "0x9c", + "0x9d", + "0x9e", + "0x9f", + "0xa0", + "0xa1", + "0xa2", + "0x4f9", + "0xa3", + "0xa5", + "0xa6", + "0xa7", + "0xa8", + "0xa9", + "0x50f", + "0xaa", + "0xab", + "0xac", + "0xad", + "0xae", + "0xaf", + "0xb0", + "0xb1", + "0xb2", + "0xb3", + "0xb4", + "0xb5", + "0x61f", + "0x53a", + "0x53f", + "0x60d", + "0x609", + "0x54a", + "0x54f", + "0x584", + "0x57f", + "0x55d", + "0x562", + "0x575", + "0x56f", + "0x58c", + "0x579", + "0x587", + "0x5f7", + "0x5a2", + "0x5e6", + "0x5d4", + "0x5cb", + "0x5dd", + "0x611", + "0x703", + "0x63c", + "0x641", + "0x6f1", + "0x6ed", + "0x64c", + "0x651", + "0x686", + "0x681", + "0x65f", + "0x664", + "0x677", + "0x671", + "0x68e", + "0x67b", + "0x689", + "0x6db", + "0x6a4", + "0x6ca", + "0x6c2", + "0x6f5", + "0x7e7", + "0x720", + "0x725", + "0x7d5", + "0x7d1", + "0x730", + "0x735", + "0x76a", + "0x765", + "0x743", + "0x748", + "0x75b", + "0x755", + "0x772", + "0x75f", + "0x76d", + "0x7bf", + "0x788", + "0x7ae", + "0x7a6", + "0x7d9", + "0x94c", + "0x804", + "0x809", + "0x93b", + "0x813", + "0x818", + "0x929", + "0x820", + "0x825", + "0x915", + "0x90f", + "0x833", + "0x838", + "0x86d", + "0x868", + "0x846", + "0x84b", + "0x85e", + "0x858", + "0x875", + "0x862", + "0x870", + "0x8fb", + "0x87f", + "0x884", + "0x8e5", + "0x8dd", + "0x8a0", + "0x8c9", + "0x8c1", + "0x8ed", + "0x91b", + "0xb6", + "0xb7", + "0x9ad", + "0x998", + "0x991", + "0x984", + "0x9a5", + "0x9b4", + "0xa14", + "0x9fe", + "0x9f7", + "0x9ea", + "0xa0b", + "0xa1b", + "0xa80", + "0xa6a", + "0xa63", + "0xa56", + "0xa77", + "0xa87", + "0xaa5", + "0xabc", + "0xcb2", + "0xc9c", + "0xc91", + "0xc80", + "0xaf5", + "0xafb", + "0xb02", + "0xb14", + "0xb0c", + "0xc6a", + "0xb8", + "0xc56", + "0xc4d", + "0xc35", + "0xc1f", + "0xc14", + "0xc03", + "0xb9", + "0xb6b", + "0xba", + "0xbb", + "0xbc", + "0xbd", + "0xbe", + "0xb71", + "0xbf", + "0xc0", + "0xc1", + "0xc2", + "0xb78", + "0xc3", + "0xc4", + "0xc5", + "0xc6", + "0xc8", + "0xb8a", + "0xc9", + "0xca", + "0xcb", + "0xb82", + "0xcc", + "0xcd", + "0xce", + "0xcf", + "0xd0", + "0xbed", + "0xd1", + "0xd2", + "0xd3", + "0xd4", + "0xd5", + "0xd6", + "0xd7", + "0xd8", + "0xd9", + "0xda", + "0xdb", + "0xdc", + "0xdd", + "0xdf", + "0xe0", + "0xe1", + "0xe2", + "0xbd9", + "0xe3", + "0xe4", + "0xe5", + "0xe6", + "0xe7", + "0xe8", + "0xe9", + "0xea", + "0xbd0", + "0xeb", + "0xed", + "0xee", + "0xef", + "0xf0", + "0xf1", + "0xf2", + "0xf3", + "0xf4", + "0xf5", + "0xf7", + "0xf8", + "0xf9", + "0xfa", + "0xfc", + "0xfd", + "0xbc5", + "0xfe", + "0xff", + "0x100", + "0x101", + "0x102", + "0x104", + "0x105", + "0x106", + "0x107", + "0x108", + "0x109", + "0xbe4", + "0x10a", + "0x10b", + "0x10c", + "0x10d", + "0x10e", + "0x10f", + "0x111", + "0x112", + "0x113", + "0x114", + "0x115", + "0x116", + "0x117", + "0x118", + "0x119", + "0xc30", + "0x11a", + "0x11b", + "0x11c", + "0x11d", + "0xc40", + "0x11e", + "0x11f", + "0x120", + "0x121", + "0x122", + "0x123", + "0x124", + "0xc44", + "0x125", + "0x126", + "0x127", + "0x128", + "0x129", + "0x12a", + "0xc61", + "0x12b", + "0x12c", + "0x12d", + "0x12e", + "0x12f", + "0x130", + "0x131", + "0x132", + "0x134", + "0x135", + "0x136", + "0x137", + "0x138", + "0x139", + "0x13a", + "0xcad", + "0x13b", + "0x13c", + "0x13d", + "0x13e", + "0xcbd", + "0x13f", + "0x140", + "0x141", + "0x142", + "0x143", + "0x144", + "0x145", + "0xcc1", + "0x146", + "0x147", + "0x148", + "0xd8f", + "0xd79", + "0xd6e", + "0xd5d", + "0xd01", + "0xd05", + "0xd4e", + "0xd0e", + "0xd14", + "0xd1b", + "0xd2d", + "0xd25", + "0xd3a", + "0xd8a", + "0xd9a", + "0xd9e", + "0xdbc", + "0xe12", + "0xe09", + "0xdfe", + "0xe1d", + "0xef3", + "0xedb", + "0xec5", + "0xeba", + "0xea9", + "0xe69", + "0xe6f", + "0xe76", + "0xe88", + "0xe80", + "0xe95", + "0xed6", + "0xee6", + "0xeea", + "0xfcd", + "0xfb5", + "0xf9f", + "0xf94", + "0xf83", + "0xf43", + "0xf49", + "0xf50", + "0xf62", + "0xf5a", + "0xf6f", + "0xfb0", + "0xfc0", + "0xfc4", + "0x10b9", + "0x10ab", + "0x109e", + "0x1008", + "0x108b", + "0x1083", + "0x1070", + "0x1068", + "0x105d", + "0x107a", + "0x1095", + "0x10ec", + "0x17f", + "0x218", + "0x2df", + "0x3e1", + "0x52c", + "0x62e", + "0x712", + "0x7f6", + "0x95b", + "0x9bc", + "0xa24", + "0xa90", + "0xcca", + "0xda7", + "0xe26", + "0xf00", + "0xfda", + "0x10c8", + "0x8d48", + "0xc0340c02c0a01c060140400c0901c060140400c0801c060140400c0200400", + "0x305c0701805010030580505405054050501004c0e04805048050441003c0e", + "0x1d01c060140400c1c01c060140400c060141b0401a0380c0641801c1201404", + "0xe01407048050100308805084050801003c1f0580505405054050781004c0e", + "0x60142a0401a03829014280401a0380c09c2601426014250400f07c2404023", + "0x5010030bc070180501003018050b82d0b00701805010030ac070180501003", + "0x60140400c3301c060140400c3201c060140400c29014310401a0380501c30", + "0x100ec0e018050e8390e01008c0e098050dc05090100d80e0d41008c0e0d007", + "0x3d0142e110430142e104420142e104400143f0143e0403b07c3d0143c01424", + "0x101300e0304b12805124100680e120050b84411c050e83911805114100680e", + "0x50014500144e014120144f0140601406014060144e0141201415014060144d", + "0xe0480514c05018051501004c0e0540514c0514c051481004c0e0305113805", + "0x26014160145a0400f07c590142e10406014150141501458014570145604055", + "0x5054050901003c0e174070180501003098051700516c1003c1f018050b841", + "0x6201c060140400c06014610401a038600145f0401a038060145e0401a03815", + "0x6719807018050100301805194100680e18005190100680e18c070180501003", + "0x1a038400146a014690403b07c16014240401a0382601406014680400f07c02", + "0x30a4051bc100680e0306e1b40701805010031b0070180501003018051ac10", + "0x29014720401a0380c1c41001c500140400c4e014240401a0387001c0601404", + "0x101ec101e879008781dc070180501003100051d8051d4100ec1f0087403073", + "0x50148117005014801180501480018050147f040050147e138050147d0407c", + "0x870140721840014052143c01405214060140521006014051f8830140520806", + "0x70148d0408c22c050147e0408a21c050147e224050147e220050147e01407", + "0x52081024829014052448f014051f48f014052008f014052408f014052148e", + "0x8513805014850f405014800f4050149004095250050147e140050147e24c05", + "0x9801c052349701c052344e0140520096014052081001c87014072187601405", + "0x7e27005014820409b0409a264050147d264050148026405014902640501485", + "0x9f014051f89f014052009f014052409f014052149e01405208102743d01405", + "0x7d05805014a5058050148005805014901a8050147d29005014a3288a1014a0", + "0x7218060140524406014052a01029c10298120140524412014052001601405", + "0x5014a3014072a40501c8609805014852a4050147e118050147e040072a405", + "0xae01405240ae01405214ad01405208ac014051f81501405200102ac102a8a9", + "0xa0054050147e2bc050147e2bc050148518005014852b8050147d2b80501480", + "0x5200b301405240b301405214b201405208b1014052082601405200b028405", + "0xa1014a02d4050147e2d0050147e2d405014852d005014852cc050147d2cc05", + "0xb70140528c0501cb701407218b7014051f81001cb701407218b60140520821", + "0x501491014072e40501c862e4050147e040072e40501c860580501485040b8", + "0x5200570140520059014051f459014052a0bb014051f8102e8b90140528c10", + "0x5014802f405014a32f0a1014a0058050147e0dc0501485018050148016005", + "0xbf014052083f014051f4be2840528015014052943c0140520040014051f43f", + "0x82304a1014a00c0050147e0c005014800a4a1014a0300a1014a0098a1014a0", + "0xc501405200c501405240c501405214103109f014051f4c301405208c201405", + "0x501c861a80501485040c7318050148214005014a50a405014a5314050147d", + "0x501ca40140721850014052002901405200c801405208a4014051f81001ca4", + "0x501480040cb2d0050147d2d4050147d040ca180050147d2bc050147d040c9", + "0x5214ce01405208cd01405200bd014051f80501cbd01407218cc0140520837", + "0x5014803040501490304050148533c050147d33c050148033c050149033c05", + "0xc001407218c0014051f812014051f81001cc00140721810340c1014051f4c1", + "0x501c860840501485040d2040d130005014a330005014802f8050148201407", + "0x3f014052141034ccf28405280bc014051f8bc01405200bc014052401001cbc", + "0x5014820f40501491224050149122005014912c00501482040072f40501c86", + "0x1201405294d501405208d4014051f4d401405200d401405240d401405214a2", + "0x7e1b0070148d2840501482014072f00501c86088050148535c0501482040d6", + "0x524421014051f421014052940701405208bc0140528c1001c053602901405", + "0x1001c05040103680504010040d9088050147d08805014a5014050148205405", + "0x1035c05368052840528410040da0141001c100881601c930481501cda01c05", + "0x103680504007040d4014cf018d501cda01cd70141204015014da0141501415", + "0x5040d5040a2014da0141035c10040da014060142204010368053540505810", + "0xda014102881008405368052c0a201cd4040b0014da014b001406040b0014da", + "0xda014150141504026014da014be01421040be014da014212f0072c0102f005", + "0x536805098050981001c053680501c052f8100480536805048052f01005405", + "0xda0141030010040da014d4014160401036805040070402601c120541501426", + "0xce33c072b8c10a4073680730012054a1304103000536805300050a41030005", + "0xcd014cc040cd014da014cc014ce040cc014da0141033c10040da0141001c10", + "0x5314053181031405368053180532010040da014c8014cd040c63200736805", + "0x5368052fc05308102fc0536805040c3040c2014da014c3014c5040c3014da", + "0x7308bf01cc10543704029014da0142901415040c2014da014c2014bf040bf", + "0x604058014da0141035c10040da0141001c102f4400f4a12dc3c0fc37284da", + "0x101384601cda014570143f04057014da0143c16007350100f005368050f005", + "0x52f410128053680512005100101200536805138050f410040da014460143c", + "0x3f014be04037014da01437014bc04029014da01429014150404f014da0144a", + "0x10040da0141001c1013c3f0dc290540513c053680513c05098100fc0536805", + "0x1504053014da014420142104042014da014bd140072c0101400536805040a2", + "0x5098101000536805100052f8100f405368050f4052f0100a405368050a405", + "0x1010c0536805040d7040103680504007040531003d0a41501453014da01453", + "0xa204059014da0144710c073501011c053680511c050181011c053680504058", + "0x50541017005368052e405084102e40536805164bb01cb0040bb014da01410", + "0x5c0142604007014da01407014be040ce014da014ce014bc040cf014da014cf", + "0xd704010368052840515c10040da0141001c1017007338cf054051700536805", + "0xb62dc07350102d805368052d805018102d8053680504058040b7014da01410", + "0x52d005084102d005368052d46001cb004060014da01410288102d40536805", + "0xda01407014be04022014da01422014bc04016014da0141601415040b3014da", + "0x701410040da01410040102cc0708816054052cc05368052cc050981001c05", + "0xd7014da014a1014a1040103680504007040220580736c12054073680701410", + "0xda0141001c103500537006354073680735c050481005405368050540505410", + "0x10354102880536805040d704010368050180508810040da014d50141604010", + "0x5040a204021014da014b028807350102c005368052c005018102c00536805", + "0x5054050541009805368052f805084102f80536805084bc01cb0040bc014da", + "0xda014260142604007014da01407014be04012014da01412014bc04015014da", + "0x5040c004010368053500505810040da0141001c1009807048150540509805", + "0xcf01cdd3042901cda01cc004815284c1040c0014da014c001429040c0014da", + "0x53301033405368053300533810330053680504046040103680504007040ce", + "0xc5014c6040c5014da014c6014c804010368053200533410318c801cda014cd", + "0xda014bf014c2040bf014da0141030c10308053680530c053141030c0536805", + "0xc22fc07304150dc100a405368050a405054103080536805308052fc102fc05", + "0x101600536805040d7040103680504007040bd1003d284de0f03f0dca136807", + "0x4e118073680515c050fc1015c05368050f05801cd40403c014da0143c01406", + "0xbd0404a014da014480144004048014da0144e0143d0401036805118050f010", + "0x52f8100dc05368050dc052f0100a405368050a4050541013c053680512805", + "0x1036805040070404f0fc370a4150144f014da0144f014260403f014da0143f", + "0x1014c0536805108050841010805368052f45001cb004050014da0141028810", + "0x2604040014da01440014be0403d014da0143d014bc04029014da0142901415", + "0x43014da0141035c10040da0141001c1014c400f4290540514c053680514c05", + "0x10164053680511c4301cd404047014da014470140604047014da0141016010", + "0x150405c014da014b901421040b9014da014592ec072c0102ec0536805040a2", + "0x50981001c053680501c052f8103380536805338052f01033c053680533c05", + "0x10040da014a1014570401036805040070405c01cce33c150145c014da0145c", + "0xb701cd4040b6014da014b601406040b6014da01410160102dc0536805040d7", + "0xb401421040b4014da014b5180072c0101800536805040a2040b5014da014b6", + "0x501c052f8100880536805088052f010058053680505805054102cc0536805", + "0x5040103680504010040b301c2205815014b3014da014b30142604007014da", + "0x5368052840528410040da0141001c100881601cdf0481501cda01c0504007", + "0x504007040d4014e0018d501cda01cd70141204015014da0141501415040d7", + "0xd5040a2014da0141035c10040da014060142204010368053540505810040da", + "0x102881008405368052c0a201cd4040b0014da014b001406040b0014da01410", + "0x150141504026014da014be01421040be014da014212f0072c0102f00536805", + "0x5098050981001c053680501c052f8100480536805048052f0100540536805", + "0x1030010040da014d4014160401036805040070402601c120541501426014da", + "0x7384c10a4073680730012054a1304103000536805300050a4103000536805", + "0x4a040cd014da014cc01448040cc014da0141013810040da0141001c10338cf", + "0x53181031405368053180514010040da014c80144f040c6320073680533405", + "0x52fc05308102fc0536805040c3040c2014da014c3014c5040c3014da014c5", + "0xbf01cc10543704029014da0142901415040c2014da014c2014bf040bf014da", + "0x5368050f00501810040da0141001c102f4400f4a13883c0fc37284da01cc2", + "0x7368070f02901c420403f014da0143f014be04037014da01437014bc0403c", + "0x53680515c0514c101380536805040d704010368050400704046014e315c58", + "0xda0144f0143c0405013c0736805128050fc1012805368051204e01cd404048", + "0x43014da01453014bd04053014da014420144004042014da014500143d04010", + "0x100fc05368050fc052f8100dc05368050dc052f01016005368051600505410", + "0x536805040d7040103680504007040430fc371601501443014da0144301426", + "0xbb014da0145911c07350101640536805164050181016405368050404304047", + "0x102dc05368050fc052f81017005368050dc052f0102e405368051180505410", + "0xda0142901415040103680504007040103900504059040b6014da014bb01447", + "0x5368052f40511c102dc0536805100052f81017005368050f4052f0102e405", + "0xb4014da014600142104060014da014b62d4072c0102d40536805040a2040b6", + "0x102dc05368052dc052f8101700536805170052f0102e405368052e40505410", + "0x536805040d7040103680504007040b42dc5c2e415014b4014da014b401426", + "0xb1014da014b22cc07350102c805368052c805018102c8053680504058040b3", + "0x102b405368052b805084102b805368052c4af01cb0040af014da0141028810", + "0x2604007014da01407014be040ce014da014ce014bc040cf014da014cf01415", + "0x10368052840515c10040da0141001c102b407338cf054052b405368052b405", + "0x7350102a405368052a405018102a4053680504058040ac014da0141035c10", + "0x50841027c05368051a8a401cb0040a4014da01410288101a805368052a4ac", + "0x7014be04022014da01422014bc04016014da01416014150409e014da0149f", + "0x10040da01410040102780708816054052780536805278050981001c0536805", + "0xda014a1014a104010368050400704022058073941205407368070141001c05", + "0x1001c103500539806354073680735c05048100540536805054050541035c05", + "0x102880536805040d704010368050180508810040da014d5014160401036805", + "0xa204021014da014b028807350102c005368052c005018102c00536805040d5", + "0x50541009805368052f805084102f80536805084bc01cb0040bc014da01410", + "0x260142604007014da01407014be04012014da01412014bc04015014da01415", + "0xc004010368053500505810040da0141001c100980704815054050980536805", + "0xe73042901cda01cc004815284c1040c0014da014c001429040c0014da01410", + "0x103340536805330052e4103300536805040bb040103680504007040ce33c07", + "0xbc04029014da01429014150401036805320052dc10318c801cda014cd0145c", + "0x152d4103180536805318052d81001c053680501c052f810304053680530405", + "0x1001c100fc053a037014da01cbf01460040bf308c331415368053180730429", + "0x7368050f4052cc100f405368050dc052d0100f00536805040d70401036805", + "0x736805160052bc10160bd01cda014bd014b10401036805100052c8102f440", + "0x48014da0144e014ac0404e014da01457014ad0401036805118052b81011857", + "0x103680513c052b8101404f01cda014bd014af0404a014da014480f00735010", + "0x43014da01453128073501014c0536805108052b0101080536805140052b410", + "0x102ec0536805164050f410040da014470143c0405911c073680510c050fc10", + "0xbc040c5014da014c5014150405c014da014b9014bd040b9014da014bb01440", + "0xc505405170053680517005098103080536805308052f81030c053680530c05", + "0xc5014da014c501415040b7014da0143f014210401036805040070405c308c3", + "0x52dc05368052dc05098103080536805308052f81030c053680530c052f010", + "0xb5014da01410160102d80536805040d7040103680504007040b7308c331415", + "0x102d00536805040a204060014da014b52d807350102d405368052d40501810", + "0x1033c053680533c05054102c805368052cc05084102cc0536805180b401cb0", + "0x15014b2014da014b20142604007014da01407014be040ce014da014ce014bc", + "0x102c40536805040d704010368052840515c10040da0141001c102c807338cf", + "0xa2040ae014da014af2c407350102bc05368052bc05018102bc053680504058", + "0x5054102a405368052b005084102b005368052b8ad01cb0040ad014da01410", + "0xa90142604007014da01407014be04022014da01422014bc04016014da01416", + "0x1201cda01c070140701410040da01410040102a40708816054052a40536805", + "0x1036805040a9040d5014da01415014a1040103680504007040d7088073a416", + "0xda0141001c10288053a8d40180736807354050481004805368050480505410", + "0xbc014da014210149f04021014da014b0014a4040b0014da014d40146a04010", + "0x1001c10040eb014101641009805368052f005270102f805368050180527810", + "0x53680528805278100a4053680530005264103000536805040300401036805", + "0xda0141001c1033c053b0c1014da01c260149604026014da014290149c040be", + "0x53380505410040da0141001c10334053b4cc33807368073041201c7604010", + "0x504093040103680504007040c5014ee318c801cda01cbe01412040ce014da", + "0xd704010368053300525010040da014c60142204010368053200505810040da", + "0xc230c0735010308053680530805018103080536805040d5040c3014da01410", + "0x50fc05084100fc05368052fc3701cb004037014da01410288102fc0536805", + "0xda01416014bc040ce014da014ce0141504010014da014100148f0403c014da", + "0x3c2841633810048050f005368050f005098102840536805284052f81005805", + "0x536805040c004010368053140505810040da0141024c10040da0141001c10", + "0x1015c5801cef2f44001cda01c3d058ce284c10403d014da0143d014290403d", + "0x51380521c101380536805118052241011805368050408b040103680504007", + "0xda0144f014a40404f014da0144a0148804010368051200520c101284801cda", + "0x536805100050541014c0536805108053c0101080536805140050001014005", + "0xa1014da014a1014be04010014da014100148f040bd014da014bd014bc04040", + "0xcc14ca1040bd100163cc103300536805330053c81014c053680514c053c410", + "0x103680504007040b7014f417005368072e405180102e4bb1644710c1236805", + "0x102d06001cda014b5014b3040b5014da0145c014b4040b6014da0141035c10", + "0x102c4b201cda014b3014af040b32d007368052d0052c410040da01460014b2", + "0x7350102b805368052bc052b0102bc05368052c8052b410040da014b1014ae", + "0x52b410040da014ac014ae040a92b007368052d0052bc102b405368052b8b6", + "0x50fc1027c0536805290ad01cd4040a4014da0146a014ac0406a014da014a9", + "0x300144004030014da0149c0143d0401036805278050f0102709e01cda0149f", + "0x510c050541016405368051640523c102580536805264052f4102640536805", + "0xda0149601426040bb014da014bb014be04047014da01447014bc04043014da", + "0x8f04076014da014b701421040103680504007040962ec4710c590480525805", + "0x52f81011c053680511c052f01010c053680510c0505410164053680516405", + "0xda0141001c101d8bb11c431641201476014da0147601426040bb014da014bb", + "0x50181025005368050405804093014da0141035c10040da014cc0149404010", + "0x8b01cb00408b014da014102881023c05368052509301cd404094014da01494", + "0x580141504010014da014100148f04087014da014890142104089014da0148f", + "0x521c05098102840536805284052f81015c053680515c052f0101600536805", + "0x1504010368052f80505810040da0141001c1021ca115c580401201487014da", + "0x103680533c053d810040da0141001c10040f5014101641020c053680533405", + "0x5040d704010368050409304083014da014120141504010368052f80505810", + "0xda014002200735010000053680500005018100000536805040f704088014da", + "0x5368053c805084103c805368053c0f101cb0040f1014da01410288103c005", + "0x16014da01416014bc04083014da014830141504010014da014100148f040f3", + "0x7040f32841620c10048053cc05368053cc05098102840536805284052f810", + "0xf7014da01410160103d80536805040d704010368050540515c10040da01410", + "0x103e40536805040a2040f8014da014f73d807350103dc05368053dc0501810", + "0x1004005368050400523c103ec05368053e805084103e805368053e0f901cb0", + "0x26040a1014da014a1014be040d7014da014d7014bc04022014da0142201415", + "0x701c0501c05040103680504010040fb284d708810048053ec05368053ec05", + "0x102a41035405368050540528410040da0141001c1035c2201cfc0581201cda", + "0x7040a2014fd3500601cda01cd50141204012014da01412014150401036805", + "0x50840527c1008405368052c005290102c00536805350051a810040da01410", + "0x103f8050405904026014da014bc0149c040be014da014060149e040bc014da", + "0xa20149e04029014da014c001499040c0014da014100c010040da0141001c10", + "0x7040cf014ff3040536807098052581009805368050a405270102f80536805", + "0x15040103680504007040cd01500330ce01cda01cc1048071d810040da01410", + "0x10040da0141001c1031405404c632007368072f80504810338053680533805", + "0x9e040bf014da014c20149f040c2014da014c3014a4040c3014da014c60146a", + "0xda0141001c100410201410164100fc05368052fc05270100dc053680532005", + "0x100dc053680531405278100f405368050f005264100f005368050403004010", + "0x10040da0141001c102f40540c40014da01c3f014960403f014da0143d0149c", + "0x5368051600505410040da0141001c1011805410571600736807100ce01c76", + "0x1036805040930401036805040070404a015051204e01cda01c370141204058", + "0xcc01494040103680515c0525010040da014480142204010368051380505810", + "0x50014da014500140604050014da014103541013c0536805040d70401036805", + "0x43014da0144214c072c01014c0536805040a204042014da0145013c0735010", + "0x101600536805160050541004005368050400523c1011c053680510c0508410", + "0x1201447014da0144701426040a1014da014a1014be04016014da01416014bc", + "0x59014da0141030010040da0144a01416040103680504007040472841616010", + "0x7040b717007418b92ec073680716416160a1304101640536805164050a410", + "0xb5014da014b6014f9040b6014da014103e010040da0141024c10040da01410", + "0x102cc05368052d00541c10040da01460014fb040b418007368052d4053e810", + "0x109040af014da014b101508040b1014da014b201400040b2014da014b3014a4", + "0x8f040b9014da014b9014bc040bb014da014bb01415040ae014da0145733007", + "0x542c102bc05368052bc05428102840536805284052f810040053680504005", + "0x5180102906a2a4ac2b412368052b8af284102e4bb0590c040ae014da014ae", + "0x9f014b40409c014da0141035c10040da0141001c10278054349f014da01ca4", + "0x5258052c410040da01499014b20409626407368050c0052cc100c00536805", + "0x524c052b410040da01494014ae0409424c07368051d8052bc101d89601cda", + "0x5258052bc10224053680522c9c01cd40408b014da0148f014ac0408f014da", + "0xda01488014ac04088014da01483014ad040103680521c052b81020c8701cda", + "0x53c4050f0103c8f101cda014f00143f040f0014da01400224073501000005", + "0x5368053d8052f4103d805368053cc05100103cc05368053c8050f410040da", + "0xac014da014ac014bc040ad014da014ad01415040a9014da014a90148f040f7", + "0x7040f71a8ac2b4a9048053dc05368053dc05098101a805368051a8052f810", + "0x52b405054102a405368052a40523c103e005368052780508410040da01410", + "0xda014f8014260406a014da0146a014be040ac014da014ac014bc040ad014da", + "0x5701494040103680504093040103680504007040f81a8ac2b4a9048053e005", + "0x103e8053680504058040f9014da0141035c10040da014cc014940401036805", + "0xb004107014da01410288103ec05368053e8f901cd4040fa014da014fa01406", + "0x1504010014da014100148f04109014da015080142104108014da014fb41c07", + "0x5098102840536805284052f8102dc05368052dc052f010170053680517005", + "0x10368050dc0505810040da0141001c10424a12dc5c0401201509014da01509", + "0x5040070401043805040590410a014da014460141504010368053300525010", + "0x1504010368053300525010040da014370141604010368052f4053d810040da", + "0x5368050410f0410b014da0141035c10040da0141024c10428053680533805", + "0x110014da014102881043c05368054310b01cd40410c014da0150c014060410c", + "0x10014da014100148f04112014da015110142104111014da0150f440072c010", + "0x102840536805284052f8100580536805058052f01042805368054280505410", + "0x52f80505810040da0141001c10448a10590a0401201512014da0151201426", + "0x53d810040da0141001c1004114014101641044c05368053340505410040da", + "0x10368050409304113014da014120141504010368052f80505810040da014cf", + "0x735010458053680545805018104580536805040f704115014da0141035c10", + "0x508410464053680545d1801cb004118014da014102881045c053680545915", + "0x16014bc04113014da015130141504010014da014100148f040dc014da01519", + "0x1644c1004805370053680537005098102840536805284052f8100580536805", + "0x10160104680536805040d704010368050540515c10040da0141001c10370a1", + "0x5040a20411c014da0151b468073501046c053680546c050181046c0536805", + "0x50400523c1047c0536805478050841047805368054711d01cb00411d014da", + "0xda014a1014be040d7014da014d7014bc04022014da014220141504010014da", + "0x50401036805040100411f284d7088100480547c053680547c050981028405", + "0x5368050540528410040da0141001c1035c2201d200581201cda01c0701407", + "0x1213500601cda01cd50141204012014da01412014150401036805040a9040d5", + "0x1008405368052c005290102c00536805350051a810040da0141001c1028805", + "0x5904026014da014bc0149c040be014da014060149e040bc014da014210149f", + "0x29014da014c001499040c0014da014100c010040da0141001c100412201410", + "0x1233040536807098052581009805368050a405270102f805368052880527810", + "0x504007040cd01524330ce01cda01cc1048071d810040da0141001c1033c05", + "0x1001c1031405494c632007368072f8050481033805368053380505410040da", + "0xda014c301511040c2014da014c80149e040c3014da014c6015100401036805", + "0x370151204037014da014100c010040da0141001c100412601410164102fc05", + "0x72fc0544c102fc05368050fc0544410308053680531405278100fc0536805", + "0x5100052901010005368050f0051a810040da0141001c100f40549c3c014da", + "0x4e118a14a05716007368072f4ce01d15040bd014da014bd01406040bd014da", + "0x12913c4a01cda01cc20141204058014da014580141504010368050400704048", + "0x1014c05368051280527810108053680513c0544010040da0141001c1014005", + "0x53680504030040103680504007040104a8050405904043014da0144201511", + "0x43014da014590151104053014da014500149e04059014da014470151204047", + "0x5c014da014bb0146a040103680504007040b90152b2ec053680710c0544c10", + "0xb601cda01cb716007454102dc05368052dc05018102dc05368051700529010", + "0xb201517040b2014da014b515c0745810040da0141001c102ccb4180a14b0b5", + "0x52c405460102b8053680514c05278102bc05368052d805054102c40536805", + "0x52b810040da014b4014ae040103680504007040104b40504059040ad014da", + "0x104b80504059040ac014da0146001415040103680515c052b810040da014b3", + "0x51600505410040da01457014ae04010368052e4053d810040da0141001c10", + "0x5368052b005370101a805368052a405464102a4053680504030040ac014da", + "0x7040104b40504059040ad014da0146a01518040ae014da014530149e040af", + "0x5368051180505410040da01448014ae0401036805138052b810040da01410", + "0x53380505410040da0143d014f6040103680504007040104bc0504059040a4", + "0x5368052900537010278053680527c054641027c053680504030040a4014da", + "0x9c014da01cad0151a040ad014da0149e01518040ae014da014c20149e040af", + "0x50400704076015312589901cda01cae014120401036805040070403001530", + "0x52c810040da014960142204010368052640505810040da0141024c10040da", + "0x94014da014103541024c0536805040d704010368053300525010040da0149c", + "0x1022c0536805040a20408f014da0149424c073501025005368052500501810", + "0x1004005368050400523c1021c05368052240508410224053680523c8b01cb0", + "0x26040a1014da014a1014be04016014da01416014bc040af014da014af01415", + "0xda014760141604010368050400704087284162bc100480521c053680521c05", + "0x73680720c162bca13041020c053680520c050a41020c0536805040c004010", + "0xa10000746c1022005368052200505410040da0141001c103c4f001d3200088", + "0x11c040103680504093040103680504007040f93e0f7285333d8f33c8a136807", + "0x109421073ec12368053e805478103e805368053d805474103d805368053d805", + "0x54d410040da0150901494040103680541c054d010040da014fb0151f0410a", + "0xda014f2014bc04088014da01488014150410b014da014104d810040da0150a", + "0x536805420053c8103cc05368053cc052f81004005368050400523c103c805", + "0x10b3cc103c88835d380409c014da0149c01537040cc014da014cc014f204108", + "0x1001c10454054e913014da01d1201539041124451043d0c048da0149c33108", + "0x11701cda015160143f04116014da0141035c10040da015130153b0401036805", + "0x10370053680546405100104640536805460050f410040da015170143c04118", + "0xbc0410c014da0150c0141504110014da015100148f0411a014da014dc014bd", + "0x11004805468053680546805098104440536805444052f81043c053680543c05", + "0xda0151b0153d0411c46c0736805454054f010040da0141001c104691143d0c", + "0x11f014da0150f014bc0411e014da0150c014150411d014da015100148f04010", + "0x1001c100413e01410164104d405368054700511c104d00536805444052f810", + "0x8f04010368053300525010040da0149c014b20401036805040930401036805", + "0x52f81047c05368053dc052f01047805368052200505410474053680504005", + "0x1354d8072c0104d80536805040a204135014da014f90144704134014da014f8", + "0x5478050541047405368054740523c104e005368054dc05084104dc0536805", + "0xda015380142604134014da01534014be0411f014da0151f014bc0411e014da", + "0x9c014b2040103680504093040103680504007041384d11f4791d048054e005", + "0x104ec05368050405804139014da0141035c10040da014cc014940401036805", + "0xb00413d014da01410288104f005368054ed3901cd40413b014da0153b01406", + "0x1504010014da014100148f04140014da0153f014210413f014da0153c4f407", + "0x5098102840536805284052f8103c405368053c4052f0103c005368053c005", + "0x10040da0141024c10040da0141001c10500a13c4f00401201540014da01540", + "0xda0141035c10040da014cc0149404010368052b80505810040da01430014f6", + "0x5368055094101cd404142014da015420140604142014da0141043c1050405", + "0x146014da015450142104145014da01543510072c0105100536805040a204143", + "0x100580536805058052f0102bc05368052bc050541004005368050400523c10", + "0x1001c10518a1058af0401201546014da0154601426040a1014da014a1014be", + "0x1004148014101641051c05368053340505410040da014be014160401036805", + "0xda014120141504010368052f80505810040da014cf014f6040103680504007", + "0x5018105280536805040f704149014da0141035c10040da0141024c1051c05", + "0x14c01cb00414c014da014102881052c05368055294901cd40414a014da0154a", + "0x1470141504010014da014100148f0414e014da0154d014210414d014da0154b", + "0x553805098102840536805284052f8100580536805058052f01051c0536805", + "0xd704010368050540515c10040da0141001c10538a105947040120154e014da", + "0xde53c0735010378053680537805018103780536805040580414f014da01410", + "0x5548050841054805368055415101cb004151014da01410288105400536805", + "0xda014d7014bc04022014da014220141504010014da014100148f04153014da", + "0x153284d7088100480554c053680554c05098102840536805284052f81035c05", + "0xda0141001c1035c2201d540581201cda01c070140701410040da0141004010", + "0x1204012014da01412014150401036805040a9040d5014da01415014a104010", + "0x102c00536805350051a810040da0141001c1028805554d4018073680735405", + "0x9c040be014da014060149e040bc014da014210149f04021014da014b0014a4", + "0xc0014da014100c010040da0141001c1004156014101641009805368052f005", + "0x1009805368050a405270102f8053680528805278100a405368053000526410", + "0xce01cda01cc1048071d810040da0141001c1033c0555cc1014da01c2601496", + "0x7368072f8050481033805368053380505410040da0141001c1033405560cc", + "0xda014c3014a4040c3014da014c60146a040103680504007040c501559318c8", + "0x5368052fc05270100dc053680532005278102fc05368053080527c1030805", + "0x50f005264100f00536805040300401036805040070401056805040590403f", + "0xda01c3f014960403f014da0143d0149c04037014da014c50149e0403d014da", + "0x1011805570571600736807100ce01c76040103680504007040bd0155b10005", + "0x4a0155d1204e01cda01c370141204058014da0145801415040103680504007", + "0x5444101400536805138052781013c05368051200544010040da0141001c10", + "0x1014c05368050403004010368050400704010578050405904042014da0144f", + "0x11304042014da014430151104050014da0144a0149e04043014da0145301512", + "0xa4040bb014da014470146a040103680504007040590155f11c053680710805", + "0x1602dc5c01cda01cb916007454102e405368052e405018102e405368052ec05", + "0x736807140050481017005368051700505410040da0141001c10180b52d8a1", + "0xda014b40149e040b1014da014b301510040103680504007040b2015612ccb4", + "0x100c010040da0141001c100416201410164102b805368052c405444102bc05", + "0x52b005444102bc05368052c805278102b005368052b405448102b40536805", + "0x52a4051a810040da0141001c101a80558ca9014da01cae01513040ae014da", + "0x727c5c01d150409f014da0149f014060409f014da014a4014a4040a4014da", + "0x101d80536805270b701d160401036805040070409626430285642709e01cda", + "0x1180408f014da014af0149e04094014da0149e0141504093014da0147601517", + "0x1036805264052b810040da0141001c1004165014101641022c053680524c05", + "0x101641022405368050c00505410040da014b7014ae0401036805258052b810", + "0x1504010368052dc052b810040da0146a014f60401036805040070401059805", + "0x89014dc04083014da014870151904087014da014100c010224053680517005", + "0x165014101641022c053680520c054601023c05368052bc05278102500536805", + "0xb6014150401036805180052b810040da014b5014ae04010368050400704010", + "0x150401036805164053d810040da0141001c100416701410164102200536805", + "0x88014dc040f0014da014000151904000014da014100c010220053680516005", + "0x722c054681022c05368053c0054601023c053680514005278102500536805", + "0x103dc055a4f63cc073680723c0504810040da0141001c103c8055a0f1014da", + "0x10368053d80508810040da014f301416040103680504093040103680504007", + "0x5040d704010368053300525010040da014570149404010368053c4052c810", + "0xda014f93e007350103e405368053e405018103e40536805040d5040f8014da", + "0x53680541c050841041c05368053e8fb01cb0040fb014da01410288103e805", + "0x16014da01416014bc04094014da014940141504010014da014100148f04108", + "0x704108284162501004805420053680542005098102840536805284052f810", + "0x536805424050a4104240536805040c004010368053dc0505810040da01410", + "0x505410040da0141001c1043d0c01d6a42d0a01cda01d0905894284c104109", + "0x50400704116455132856b44911440a1368072850b01d1b0410a014da0150a", + "0x123680545c054781045c0536805448054741044805368054480547010040da", + "0xda0151a014940401036805464054d010040da015180151f0411b468dc46518", + "0xbc0410a014da0150a014150411c014da014104d810040da0151b0153504010", + "0x54fc104440536805444052f81004005368050400523c10440053680544005", + "0x52c4103700536805370053c8104740536805474053c810474cc01cda014cc", + "0x11e3711d4711104110428d7500104780536805478054dc10478f101cda014f1", + "0x103680504007041390156c4e005368074dc054e4104dd364d53447c1236805", + "0x505410040da0153c014f60413c4ec07368054e00550410040da0141024c10", + "0x136014be04135014da015350148f04134014da01534014bc0411f014da0151f", + "0x53c4054dc1015c053680515c053c8103300536805330053c8104d80536805", + "0x54e410509415013f4f412368053c4573313b4d9354d11f35d38040f1014da", + "0x5040d7040103680550c054ec10040da0141001c10510055b543014da01d42", + "0xda015470143d0401036805518050f01051d4601cda015450143f04145014da", + "0x5368055000523c1052c0536805528052f4105280536805524051001052405", + "0x141014da01541014be0413f014da0153f014bc0413d014da0153d0141504140", + "0x1440153c0401036805040070414b5053f4f5400480552c053680552c0509810", + "0x54f4050541053805368055000523c10040da0154c0153d0414d5300736805", + "0xda0154d0144704150014da01541014be040de014da0153f014bc0414f014da", + "0x53c4052c810040da0141024c10040da0141001c100416e014101641054405", + "0x15354807368054e4054f010040da014cc01494040103680515c0525010040da", + "0xbc0414f014da0151f014150414e014da015350148f0401036805548054f410", + "0x1016410544053680554c0511c1054005368054d8052f81037805368054d005", + "0x525010040da014f1014b2040103680504093040103680504007040105b805", + "0xda0150a014150414e014da014100148f04010368053300525010040da01457", + "0x5368054580511c105400536805454052f810378053680544c052f01053c05", + "0x171014da015700142104170014da015515bc072c0105bc0536805040a204151", + "0x103780536805378052f01053c053680553c050541053805368055380523c10", + "0x1001c105c5503794f5381201571014da015710142604150014da01550014be", + "0x94040103680515c0525010040da014f1014b20401036805040930401036805", + "0xda014dd01406040dd014da01410160105c80536805040d7040103680533005", + "0xda015735d0072c0105d00536805040a204173014da014dd5c8073501037405", + "0x536805430050541004005368050400523c105d805368055d405084105d405", + "0x176014da0157601426040a1014da014a1014be0410f014da0150f014bc0410c", + "0xda014f2014f6040103680504093040103680504007041762850f4301004805", + "0x1035c10040da014cc01494040103680515c0525010040da0148f0141604010", + "0x55e17701cd404178014da015780140604178014da01410508105dc0536805", + "0xda0157b014210417b014da015795e8072c0105e80536805040a204179014da", + "0x536805058052f0102500536805250050541004005368050400523c105f005", + "0x105f0a105894040120157c014da0157c01426040a1014da014a1014be04016", + "0xda014460141504010368053300525010040da0143701416040103680504007", + "0x370141604010368052f4053d810040da0141001c100417e01410164105f405", + "0x10040da0141024c105f405368053380505410040da014cc014940401036805", + "0x17f01cd4040db014da014db01406040db014da0141043c105fc0536805040d7", + "0x1820142104182014da01580604072c0106040536805040a204180014da014db", + "0x5058052f0105f405368055f4050541004005368050400523c1060c0536805", + "0xa10597d0401201583014da0158301426040a1014da014a1014be04016014da", + "0x101641061005368053340505410040da014be0141604010368050400704183", + "0x1504010368052f80505810040da014cf014f60401036805040070401061405", + "0x536805040f704186014da0141035c10040da0141024c10610053680504805", + "0x189014da0141028810620053680561d8601cd404187014da015870140604187", + "0x10014da014100148f0418b014da0158a014210418a014da01588624072c010", + "0x102840536805284052f8100580536805058052f01061005368056100505410", + "0x50540515c10040da0141001c1062ca105984040120158b014da0158b01426", + "0x10634053680563405018106340536805040580418c014da0141035c10040da", + "0x1064005368056398f01cb00418f014da014102881063805368056358c01cd4", + "0xbc04022014da014220141504010014da014100148f04191014da0159001421", + "0x1004805644053680564405098102840536805284052f81035c053680535c05", + "0x1035c2201d920581201cda01c070140701410040da0141004010644a135c22", + "0xda01412014150401036805040a9040d5014da01415014a1040103680504007", + "0x5350051a810040da0141001c102880564cd40180736807354050481004805", + "0xda014060149e040bc014da014210149f04021014da014b0014a4040b0014da", + "0x100c010040da0141001c1004194014101641009805368052f005270102f805", + "0x50a405270102f8053680528805278100a4053680530005264103000536805", + "0xc1048071d810040da0141001c1033c05654c1014da01c260149604026014da", + "0x50481033805368053380505410040da0141001c1033405658cc3380736807", + "0x9e040c3014da014c601510040103680504007040c501597318c801cda01cbe", + "0xda0141001c100419801410164102fc053680530c0544410308053680532005", + "0x10308053680531405278100fc05368050dc05448100dc05368050403004010", + "0x10040da0141001c100f4056643c014da01cbf01513040bf014da0143f01511", + "0x115040bd014da014bd01406040bd014da01440014a404040014da0143c0146a", + "0xda014580141504010368050400704048138462859a15c5801cda01cbd33807", + "0x513c0544010040da0141001c101400566c4f1280736807308050481016005", + "0x10670050405904043014da014420151104053014da0144a0149e04042014da", + "0x500149e04059014da014470151204047014da014100c010040da0141001c10", + "0x7040b90159d2ec053680710c0544c1010c0536805164054441014c0536805", + "0x52dc05018102dc0536805170052901017005368052ec051a810040da01410", + "0x10040da0141001c102ccb4180a1678b52d807368072dc5801d15040b7014da", + "0x102bc05368052d805054102c405368052c80545c102c805368052d45701d16", + "0x5040070401067c0504059040ad014da014b101518040ae014da014530149e", + "0x15040103680515c052b810040da014b3014ae04010368052d0052b810040da", + "0x10368052e4053d810040da0141001c10041a001410164102b0053680518005", + "0x5464102a4053680504030040ac014da0145801415040103680515c052b810", + "0x6a01518040ae014da014530149e040af014da014ac014dc0406a014da014a9", + "0xae0401036805138052b810040da0141001c100419f01410164102b40536805", + "0x103680504007040106840504059040a4014da0144601415040103680512005", + "0x54641027c053680504030040a4014da014ce0141504010368050f4053d810", + "0x9e01518040ae014da014c20149e040af014da014a4014dc0409e014da0149f", + "0xae0141204010368050400704030015a227005368072b405468102b40536805", + "0x52640505810040da0141024c10040da0141001c101d80568c962640736807", + "0xd704010368053300525010040da0149c014b204010368052580508810040da", + "0x9424c0735010250053680525005018102500536805040d504093014da01410", + "0x52240508410224053680523c8b01cb00408b014da014102881023c0536805", + "0xda01416014bc040af014da014af0141504010014da014100148f04087014da", + "0x87284162bc100480521c053680521c05098102840536805284052f81005805", + "0x520c050a41020c0536805040c004010368051d80505810040da0141001c10", + "0x10040da0141001c103c4f001da40008801cda01c83058af284c104083014da", + "0x7040f93e0f7285a53d8f33c8a1368072840001d1b04088014da0148801415", + "0x5368053d805474103d805368053d80547010040da0141024c10040da01410", + "0x541c054d010040da014fb0151f0410a4250841cfb048da014fa0151e040fa", + "0x150410b014da014104d810040da0150a0153504010368054240525010040da", + "0x52f81004005368050400523c103c805368053c8052f010220053680522005", + "0x9c01537040cc014da014cc014f204108014da01508014f2040f3014da014f3", + "0x139041124451043d0c048da0149c3310842cf3040f2220d750c102700536805", + "0x1035c10040da015130153b04010368050400704115015a644c053680744805", + "0x5460050f410040da015170143c0411845c0736805458050fc104580536805", + "0xda015100148f0411a014da014dc014bd040dc014da015190144004119014da", + "0x536805444052f81043c053680543c052f0104300536805430050541044005", + "0x54f010040da0141001c104691143d0c440120151a014da0151a0142604111", + "0x10c014150411d014da015100148f040103680546c054f4104711b01cda01515", + "0x54700511c104d00536805444052f81047c053680543c052f0104780536805", + "0x9c014b20401036805040930401036805040070401069c050405904135014da", + "0x536805220050541047405368050400523c10040da014cc014940401036805", + "0x135014da014f90144704134014da014f8014be0411f014da014f7014bc0411e", + "0x104e005368054dc05084104dc05368054d53601cb004136014da0141028810", + "0xbe0411f014da0151f014bc0411e014da0151e014150411d014da0151d0148f", + "0x504007041384d11f4791d048054e005368054e005098104d005368054d005", + "0x1035c10040da014cc014940401036805270052c810040da0141024c10040da", + "0x54ed3901cd40413b014da0153b014060413b014da01410160104e40536805", + "0xda0153f014210413f014da0153c4f4072c0104f40536805040a20413c014da", + "0x5368053c4052f0103c005368053c0050541004005368050400523c1050005", + "0x10500a13c4f00401201540014da0154001426040a1014da014a1014be040f1", + "0x10368052b80505810040da01430014f6040103680504093040103680504007", + "0x1420140604142014da0141043c105040536805040d704010368053300525010", + "0x143510072c0105100536805040a204143014da0154250407350105080536805", + "0x52bc050541004005368050400523c10518053680551405084105140536805", + "0xda0154601426040a1014da014a1014be04016014da01416014bc040af014da", + "0x505410040da014be0141604010368050400704146284162bc100480551805", + "0x10040da014cf014f6040103680504007040106a0050405904147014da014cd", + "0xda0141035c10040da0141024c1051c05368050480505410040da014be01416", + "0x5368055294901cd40414a014da0154a014060414a014da014103dc1052405", + "0x14e014da0154d014210414d014da0154b530072c0105300536805040a20414b", + "0x100580536805058052f01051c053680551c050541004005368050400523c10", + "0x1001c10538a105947040120154e014da0154e01426040a1014da014a1014be", + "0x103780536805040580414f014da0141035c10040da01415014570401036805", + "0xb004151014da014102881054005368053794f01cd4040de014da014de01406", + "0x1504010014da014100148f04153014da015520142104152014da0155054407", + "0x5098102840536805284052f81035c053680535c052f010088053680508805", + "0xda01c070140701410040da014100401054ca135c220401201553014da01553", + "0x5040a9040d5014da01415014a1040103680504007040d7088076a41604807", + "0x1001c10288056a8d40180736807354050481004805368050480505410040da", + "0xda014210149f04021014da014b0014a4040b0014da014d40146a0401036805", + "0x10041ab014101641009805368052f005270102f8053680501805278102f005", + "0x528805278100a405368053000526410300053680504030040103680504007", + "0x1001c1033c056b0c1014da01c260149604026014da014290149c040be014da", + "0x505410040da0141001c10334056b4cc33807368073041201c760401036805", + "0x110040103680504007040c5015ae318c801cda01cbe01412040ce014da014ce", + "0x10164102fc053680530c05444103080536805320052781030c053680531805", + "0x100fc05368050dc05448100dc053680504030040103680504007040106bc05", + "0x56c03c014da01cbf01513040bf014da0143f01511040c2014da014c50149e", + "0x6040bd014da01440014a404040014da0143c0146a0401036805040070403d", + "0x5040070404813846285b115c5801cda01cbd33807454102f405368052f405", + "0x1001c10140056c84f1280736807308050481016005368051600505410040da", + "0xda014420151104053014da0144a0149e04042014da0144f015100401036805", + "0x470151204047014da014100c010040da0141001c10041b3014101641010c05", + "0x710c0544c1010c0536805164054441014c053680514005278101640536805", + "0x5170052901017005368052ec051a810040da0141001c102e4056d0bb014da", + "0xb4180a16d4b52d807368072dc5801d15040b7014da014b701406040b7014da", + "0x102c405368052c80545c102c805368052d45701d16040103680504007040b3", + "0x59040ad014da014b101518040ae014da014530149e040af014da014b601415", + "0x10040da014b3014ae04010368052d0052b810040da0141001c10041b601410", + "0xda0141001c10041b701410164102b005368051800505410040da01457014ae", + "0x30040ac014da0145801415040103680515c052b810040da014b9014f604010", + "0x530149e040af014da014ac014dc0406a014da014a901519040a9014da01410", + "0x10040da0141001c10041b601410164102b405368051a805460102b80536805", + "0x504059040a4014da01446014150401036805120052b810040da0144e014ae", + "0x30040a4014da014ce0141504010368050f4053d810040da0141001c10041b8", + "0xc20149e040af014da014a4014dc0409e014da0149f015190409f014da01410", + "0x704030015b927005368072b405468102b4053680527805460102b80536805", + "0x1024c10040da0141001c101d8056e89626407368072b80504810040da01410", + "0x10040da0149c014b204010368052580508810040da01499014160401036805", + "0x525005018102500536805040d504093014da0141035c10040da014cc01494", + "0x523c8b01cb00408b014da014102881023c05368052509301cd404094014da", + "0xda014af0141504010014da014100148f04087014da014890142104089014da", + "0x53680521c05098102840536805284052f8100580536805058052f0102bc05", + "0x5040c004010368051d80505810040da0141001c1021ca1058af0401201487", + "0xf001dbb0008801cda01c83058af284c104083014da014830142904083014da", + "0x522005054103c8053680504136040103680504093040103680504007040f1", + "0xda014a1014be04010014da014100148f04000014da01400014bc04088014da", + "0xa10400022022510102700536805270054dc103300536805330053c81028405", + "0x1001c103ec056f0fa014da01cf901539040f93e0f73d8f3048da0149c330f2", + "0x10801cda015070143f04107014da0141035c10040da014fa0153b0401036805", + "0x1042c053680542805100104280536805424050f410040da015080143c04109", + "0xbc040f3014da014f301415040f7014da014f70148f0410c014da0150b014bd", + "0xf704805430053680543005098103e005368053e0052f8103d805368053d805", + "0x5368053dc0523c1043c05368053ec0508410040da0141001c10430f83d8f3", + "0xf8014da014f8014be040f6014da014f6014bc040f3014da014f301415040f7", + "0x5040930401036805040070410f3e0f63ccf70480543c053680543c0509810", + "0x5804110014da0141035c10040da014cc014940401036805270052c810040da", + "0x102881044805368054451001cd404111014da015110140604111014da01410", + "0x100148f04116014da015150142104115014da0151244c072c01044c0536805", + "0x5284052f8103c405368053c4052f0103c005368053c005054100400536805", + "0x10040da0141001c10458a13c4f00401201516014da0151601426040a1014da", + "0xda014cc0149404010368052b80505810040da01430014f6040103680504093", + "0xd404118014da015180140604118014da0141043c1045c0536805040d704010", + "0x210411a014da01519370072c0103700536805040a204119014da0151845c07", + "0x52f0102bc05368052bc050541004005368050400523c1046c053680546805", + "0xaf040120151b014da0151b01426040a1014da014a1014be04016014da01416", + "0x1047005368053340505410040da014be014160401036805040070411b28416", + "0x10368052f80505810040da014cf014f6040103680504007040106f40504059", + "0x5040f70411d014da0141035c10040da0141024c1047005368050480505410", + "0xda014102881047c05368054791d01cd40411e014da0151e014060411e014da", + "0xda014100148f04136014da015350142104135014da0151f4d0072c0104d005", + "0x536805284052f8100580536805058052f0104700536805470050541004005", + "0x515c10040da0141001c104d8a10591c0401201536014da0153601426040a1", + "0x5368054e005018104e005368050405804137014da0141035c10040da01415", + "0x5368054e53b01cb00413b014da01410288104e405368054e13701cd404138", + "0x22014da014220141504010014da014100148f0413d014da0153c014210413c", + "0x54f405368054f405098102840536805284052f81035c053680535c052f010", + "0x2201dbe0581201cda01c070140701410040da01410040104f4a135c2204012", + "0x12014150401036805040a9040d5014da01415014a1040103680504007040d7", + "0x51a810040da0141001c10288056fcd4018073680735405048100480536805", + "0x60149e040bc014da014210149f04021014da014b0014a4040b0014da014d4", + "0x10040da0141001c10041c0014101641009805368052f005270102f80536805", + "0x5270102f8053680528805278100a405368053000526410300053680504030", + "0x71d810040da0141001c1033c05704c1014da01c260149604026014da01429", + "0x1033805368053380505410040da0141001c1033405708cc338073680730412", + "0xc3014da014c601510040103680504007040c5015c3318c801cda01cbe01412", + "0x1001c10041c401410164102fc053680530c054441030805368053200527810", + "0x53680531405278100fc05368050dc05448100dc0536805040300401036805", + "0xda0141001c100f4057143c014da01cbf01513040bf014da0143f01511040c2", + "0xbd014da014bd01406040bd014da01440014a404040014da0143c0146a04010", + "0x58014150401036805040070404813846285c615c5801cda01cbd3380745410", + "0x544010040da0141001c101400571c4f128073680730805048101600536805", + "0x50405904043014da014420151104053014da0144a0149e04042014da0144f", + "0x9e04059014da014470151204047014da014100c010040da0141001c10041c8", + "0xb9015c92ec053680710c0544c1010c0536805164054441014c053680514005", + "0x5018102dc0536805170052901017005368052ec051a810040da0141001c10", + "0xda0141001c102ccb4180a1728b52d807368072dc5801d15040b7014da014b7", + "0x5368052d805054102c405368052c80545c102c805368052d45701d1604010", + "0x70401072c0504059040ad014da014b101518040ae014da014530149e040af", + "0x103680515c052b810040da014b3014ae04010368052d0052b810040da01410", + "0x52e4053d810040da0141001c10041cc01410164102b005368051800505410", + "0x102a4053680504030040ac014da0145801415040103680515c052b810040da", + "0x118040ae014da014530149e040af014da014ac014dc0406a014da014a901519", + "0x1036805138052b810040da0141001c10041cb01410164102b405368051a805", + "0x504007040107340504059040a4014da01446014150401036805120052b810", + "0x1027c053680504030040a4014da014ce0141504010368050f4053d810040da", + "0x118040ae014da014c20149e040af014da014a4014dc0409e014da0149f01519", + "0x1204010368050400704030015ce27005368072b405468102b4053680527805", + "0x505810040da0141024c10040da0141001c101d80573c9626407368072b805", + "0x10368053300525010040da0149c014b204010368052580508810040da01499", + "0x735010250053680525005018102500536805040d504093014da0141035c10", + "0x508410224053680523c8b01cb00408b014da014102881023c053680525093", + "0x16014bc040af014da014af0141504010014da014100148f04087014da01489", + "0x162bc100480521c053680521c05098102840536805284052f8100580536805", + "0x50a41020c0536805040c004010368051d80505810040da0141001c1021ca1", + "0xda0141001c103c4f001dd00008801cda01c83058af284c104083014da01483", + "0x52f010220053680522005054103c805368050413604010368050409304010", + "0xcc014f2040a1014da014a1014be04010014da014100148f04000014da01400", + "0x1236805270cc3c8a10400022022514102700536805270054dc103300536805", + "0x54ec10040da0141001c103ec05744fa014da01cf901539040f93e0f73d8f3", + "0x5420050f0104250801cda015070143f04107014da0141035c10040da014fa", + "0x53680542c052f41042c053680542805100104280536805424050f410040da", + "0xf6014da014f6014bc040f3014da014f301415040f7014da014f70148f0410c", + "0x70410c3e0f63ccf704805430053680543005098103e005368053e0052f810", + "0x53cc05054103dc05368053dc0523c1043c05368053ec0508410040da01410", + "0xda0150f01426040f8014da014f8014be040f6014da014f6014bc040f3014da", + "0x9c014b20401036805040930401036805040070410f3e0f63ccf70480543c05", + "0x1044405368050405804110014da0141035c10040da014cc014940401036805", + "0xb004113014da014102881044805368054451001cd404111014da0151101406", + "0x1504010014da014100148f04116014da015150142104115014da0151244c07", + "0x5098102840536805284052f8103c405368053c4052f0103c005368053c005", + "0x10040da0141024c10040da0141001c10458a13c4f00401201516014da01516", + "0xda0141035c10040da014cc0149404010368052b80505810040da01430014f6", + "0x5368054611701cd404118014da015180140604118014da0141043c1045c05", + "0x11b014da0151a014210411a014da01519370072c0103700536805040a204119", + "0x100580536805058052f0102bc05368052bc050541004005368050400523c10", + "0x1001c1046ca1058af040120151b014da0151b01426040a1014da014a1014be", + "0x10041d2014101641047005368053340505410040da014be014160401036805", + "0xda014120141504010368052f80505810040da014cf014f6040103680504007", + "0x5018104780536805040f70411d014da0141035c10040da0141024c1047005", + "0x13401cb004134014da014102881047c05368054791d01cd40411e014da0151e", + "0x11c0141504010014da014100148f04136014da015350142104135014da0151f", + "0x54d805098102840536805284052f8100580536805058052f0104700536805", + "0xd704010368050540515c10040da0141001c104d8a10591c0401201536014da", + "0x1384dc07350104e005368054e005018104e005368050405804137014da01410", + "0x54f005084104f005368054e53b01cb00413b014da01410288104e40536805", + "0xda014d7014bc04022014da014220141504010014da014100148f0413d014da", + "0x13d284d708810048054f405368054f405098102840536805284052f81035c05", + "0xda0141001c1035c2201dd30581201cda01c070140701410040da0141004010", + "0x1204012014da01412014150401036805040a9040d5014da01415014a104010", + "0x102c00536805350051a810040da0141001c1028805750d4018073680735405", + "0x9c040be014da014060149e040bc014da014210149f04021014da014b0014a4", + "0xc0014da014100c010040da0141001c10041d5014101641009805368052f005", + "0x1009805368050a405270102f8053680528805278100a405368053000526410", + "0xcc33807368072f80504810040da0141001c1033c05758c1014da01c2601496", + "0xc6014da014c8014a4040c8014da014cc0146a040103680504007040cd015d7", + "0x103080536805314052701030c0536805338052781031405368053180527c10", + "0x5368052fc05264102fc053680504030040103680504007040107600504059", + "0x3f014da01cc201496040c2014da014370149c040c3014da014cd0149e04037", + "0x504007040bd015da1003d01cda01cc3014120401036805040070403c015d9", + "0x536805160054441015c05368050f4052781016005368051000544010040da", + "0x513805448101380536805040300401036805040070401076c050405904046", + "0xda01c460151304046014da014480151104057014da014bd0149e04048014da", + "0xda01450014a404050014da0144a0146a0401036805040070404f015dc12805", + "0x704047015dd10c5301cda01c4204807108101080536805108050181010805", + "0x102e405778bb164073680715c050481014c053680514c0505410040da01410", + "0x5c01511040b7014da014590149e0405c014da014bb01510040103680504007", + "0x112040b5014da014100c010040da0141001c10041df01410164102d80536805", + "0x544c102d8053680518005444102dc05368052e4052781018005368052d405", + "0x5290102c805368052d0051a810040da0141001c102cc05780b4014da01cb6", + "0xa1784ae2bc07368072c45301d15040b1014da014b101406040b1014da014b2", + "0x6a01cda01cb701412040af014da014af01415040103680504007040a92b0ad", + "0x5368051a8052781027805368052900544010040da0141001c1027c05788a4", + "0x5040300401036805040070401078c050405904030014da0149e015110409c", + "0xda01496015110409c014da0149f0149e04096014da014990151204099014da", + "0xda014760146a04010368050400704093015e41d805368070c00544c100c005", + "0xda01c8f2bc074541023c053680523c050181023c0536805250052901025005", + "0x11704000014da014892b80745810040da0141001c102208321ca17948922c07", + "0x5460103c8053680527005278103c4053680522c05054103c0053680500005", + "0x10040da01483014ae040103680504007040107980504059040f3014da014f0", + "0x504059040f6014da014870141504010368052b8052b810040da01488014ae", + "0x505410040da014ae014ae040103680524c053d810040da0141001c10041e7", + "0x53d805370103e005368053dc05464103dc053680504030040f6014da014af", + "0x107980504059040f3014da014f801518040f2014da0149c0149e040f1014da", + "0x52b40505410040da014a9014ae04010368052b0052b810040da0141001c10", + "0x505410040da014b3014f6040103680504007040107a00504059040f9014da", + "0x53e405370103ec05368053e805464103e8053680504030040f9014da01453", + "0xda01cf30151a040f3014da014fb01518040f2014da014b70149e040f1014da", + "0x70410b015ea4290901cda01cf20141204010368050400704108015e941c05", + "0x543c0527c1043c053680543005290104300536805428051a810040da01410", + "0x107ac050405904112014da015100149c04111014da015090149e04110014da", + "0x10b0149e04115014da015130149904113014da014100c010040da0141001c10", + "0x704117015ec45805368074480525810448053680545405270104440536805", + "0x15040103680504007040dc015ed4651801cda01d163c4071d810040da01410", + "0x10040da0141001c10470057b91b46807368074440504810460053680546005", + "0xda0151901494040103680546c0508810040da0151a01416040103680504093", + "0x54d410040da0143f01535040103680510c0551810040da01507014b204010", + "0x53680547805018104780536805040d50411d014da0141035c10040da014c1", + "0x53680547d3401cb004134014da014102881047c05368054791d01cd40411e", + "0x118014da015180141504010014da014100148f04136014da015350142104135", + "0x54d805368054d805098102840536805284052f8100580536805058052f010", + "0x536805040c004010368054700505810040da0141001c104d8a10591804012", + "0x104f13b01def4e53801cda01d3705918284c104137014da015370142904137", + "0x5368054e005054104f4053680504136040103680504093040103680504007", + "0xa1014da014a1014be04010014da014100148f04139014da01539014bc04138", + "0x1010c053680510c0551c100fc05368050fc050181030405368053040501810", + "0x3f3053d284104e5380194904119014da01519014f204107014da0150701537", + "0x1001c10514057c144014da01d430153904143509415013f048da0151941c43", + "0x14701cda015460143f04146014da0141035c10040da015440153b0401036805", + "0x1052c053680552805100105280536805524050f410040da015470143c04149", + "0xbc0413f014da0153f0141504141014da015410148f0414c014da0154b014bd", + "0x14104805530053680553005098105080536805508052f810500053680550005", + "0x5368055040523c1053405368055140508410040da0141001c10531425013f", + "0x142014da01542014be04140014da01540014bc0413f014da0153f0141504141", + "0x5040930401036805040070414d509404fd410480553405368055340509810", + "0x135040103680510c0551810040da01507014b204010368054640525010040da", + "0x536805040580414e014da0141035c10040da014c10153504010368050fc05", + "0x150014da0141028810378053680553d4e01cd40414f014da0154f014060414f", + "0x10014da014100148f04152014da015510142104151014da014de540072c010", + "0x102840536805284052f8104f005368054f0052f0104ec05368054ec0505410", + "0x54440505810040da0141001c10548a14f13b0401201552014da0155201426", + "0x135040103680510c0551810040da01507014b20401036805304054d410040da", + "0x103680504007040107c4050405904153014da014dc0141504010368050fc05", + "0x107014b20401036805304054d410040da0151101416040103680545c053d810", + "0x153014da014f10141504010368050fc054d410040da01443015460401036805", + "0x55c005018105c005368050414a0416f014da0141035c10040da0141024c10", + "0x55c57201cb004172014da01410288105c405368055c16f01cd404170014da", + "0xda015530141504010014da014100148f04173014da014dd01421040dd014da", + "0x5368055cc05098102840536805284052f8100580536805058052f01054c05", + "0x5420053d810040da0141024c10040da0141001c105cca1059530401201573", + "0x135040103680510c0551810040da014f2014160401036805304054d410040da", + "0xda015750140604175014da0141052c105d00536805040d704010368050fc05", + "0xda015765dc072c0105dc0536805040a204176014da015755d007350105d405", + "0x5368053c4050541004005368050400523c105e405368055e005084105e005", + "0x179014da0157901426040a1014da014a1014be04016014da01416014bc040f1", + "0x5304054d410040da014570141604010368050400704179284163c41004805", + "0x7040107c805040590417a014da014470141504010368050fc054d410040da", + "0x1036805304054d410040da0145701416040103680513c053d810040da01410", + "0x5040d70401036805040930417a014da014120141504010368050fc054d410", + "0xda0157c5ec07350105f005368055f005018105f00536805041420417b014da", + "0x53680536c050841036c05368055f57f01cb00417f014da01410288105f405", + "0x16014da01416014bc0417a014da0157a0141504010014da014100148f04180", + "0x704180284165e81004805600053680560005098102840536805284052f810", + "0x10040da014c10153504010368050f0053d810040da0141024c10040da01410", + "0x5608050181060805368050410f04181014da0141035c10040da014c301416", + "0x560d8401cb004184014da014102881060c05368056098101cd404182014da", + "0xda014120141504010014da014100148f04187014da015860142104186014da", + "0x53680561c05098102840536805284052f8100580536805058052f01004805", + "0x533c053d810040da0141024c10040da0141001c1061ca1058120401201587", + "0x604189014da014103dc106200536805040d704010368052f80505810040da", + "0x72c01062c0536805040a20418a014da015896200735010624053680562405", + "0x50541004005368050400523c106340536805630050841063005368056298b", + "0x18d01426040a1014da014a1014be04016014da01416014bc04012014da01412", + "0x10040da01415014570401036805040070418d2841604810048056340536805", + "0x18e01cd40418f014da0158f014060418f014da01410160106380536805040d7", + "0x1f301421041f3014da01590644072c0106440536805040a204190014da0158f", + "0x535c052f0100880536805088050541004005368050400523c107d00536805", + "0xa135c2204012015f4014da015f401426040a1014da014a1014be040d7014da", + "0x7368050481001d4d04012014da01415014a404015014da014a10154c041f4", + "0xda014d5014de04006354073680535c0553c1035c0536805088055381008816", + "0xa201cda014a201551040a2014da014d4014c6040d4014da014060155004010", + "0xbe2f007368052f005548102f00536805040c304021014da014b0014c5040b0", + "0xda01c212f807014150dc10058053680505805054102f805368052f80530810", + "0xbc04029014da0142901406040103680504007040ce33cc1285f50a4c0098a1", + "0x1f6334cc01cda01c2905807454103000536805300052f810098053680509805", + "0x53680530ca201d6f040c3014da0141054c10040da0141001c10314c6320a1", + "0xcc014da014cc01415040c2014da014c2014bf040bc014da014bc014c2040c2", + "0x10040da0141001c101003d0f0a17dc3f0dcbf284da01cc22f0c0098150dc10", + "0x11504037014da01437014be040bf014da014bf014bc0403f014da0143f01406", + "0x5160cd01d160401036805040070404e11857285f8160bd01cda01c3f33007", + "0xda014bd014150404f014da0144a015710404a014da014480157004048014da", + "0x53680513c055c8100dc05368050dc052f8102fc05368052fc052f0102f405", + "0x5138052b810040da01446014ae0401036805040070404f0dcbf2f4150144f", + "0x604042014da01410374101400536805040d70401036805334052b810040da", + "0xbc04043014da014570141504053014da014421400735010108053680510805", + "0x10164102ec053680514c0511c1016405368050dc052f81011c05368052fc05", + "0x102e405368053300505410040da014cd014ae040103680504007040107e405", + "0x59040b6014da0144001447040b7014da0143d014be0405c014da0143c014bc", + "0x10040da014c5014ae0401036805318052b810040da0141001c10041fa01410", + "0xda01410374102d40536805040d704010368052f0055d010040da014a201573", + "0xda014c801415040b4014da014602d407350101800536805180050181018005", + "0x5368052d00511c101640536805300052f81011c0536805098052f01010c05", + "0xb1014da014b201575040b2014da014bb2cc072c0102cc0536805040a2040bb", + "0x101640536805164052f81011c053680511c052f01010c053680510c0505410", + "0xda014bc01574040103680504007040b11644710c15014b1014da014b101572", + "0x101700536805304052f0102e405368050580505410040da014a20157304010", + "0x72c0102bc0536805040a2040b6014da014ce01447040b7014da014cf014be", + "0x52f0102e405368052e405054102b405368052b8055d4102b805368052d8af", + "0x5c2e415014ad014da014ad01572040b7014da014b7014be0405c014da0145c", + "0x536805088055e0100880536805054055dc100580536805048055d8102b4b7", + "0x6040075341001805368050180501810018d501cda0141635c0728579040d7", + "0x5378102f02101cda014b00154f040b0014da014a20154e040a23500736805", + "0x5098055441009805368052f805318102f805368052f00554010040da01421", + "0xda014c101552040c1014da0141030c100a4053680530005314103002601cda", + "0xda014d401415040d5014da014d50148f040cf014da014cf014c2040cf30407", + "0xda0141001c10314c6320a17eccd330ce284da01c2933ca1014150dc1035005", + "0xcc014da014cc014be040ce014da014ce014bc040cd014da014cd0140604010", + "0x5041530401036805040070403f0dcbf285fc308c301cda01ccd3500745410", + "0x50f4052fc10304053680530405308100f405368050f02601d6f0403c014da", + "0x1fd160bd100a1368070f4c1330ce05437040c3014da014c3014150403d014da", + "0x536805100052f01016005368051600501810040da0141001c101384615ca1", + "0x101085013ca17f84a1200736807160c301d15040bd014da014bd014be04040", + "0x55c41010c053680514c055c01014c0536805128c201d16040103680504007", + "0xd50148f04040014da01440014bc04048014da014480141504047014da01443", + "0xd5100480480511c053680511c055c8102f405368052f4052f8103540536805", + "0x52b810040da01442014ae0401036805140052b810040da0141001c1011cbd", + "0x5368052ec05018102ec0536805040dd04059014da0141035c10040da014c2", + "0x536805100052f010170053680513c05054102e405368052ec5901cd4040bb", + "0x7040107fc0504059040b5014da014b901447040b6014da014bd014be040b7", + "0xda01457014bc04060014da014c3014150401036805308052b810040da01410", + "0x100420001410164102c805368051380511c102cc0536805118052f8102d005", + "0xda014260157304010368050fc052b810040da01437014ae040103680504007", + "0x5018102bc0536805040dd040b1014da0141035c10040da014c10157404010", + "0x52f01017005368052fc05054102b805368052bcb101cd4040af014da014af", + "0x5040a2040b5014da014ae01447040b6014da014cc014be040b7014da014ce", + "0x517005054102a405368052b0055d4102b005368052d4ad01cb0040ad014da", + "0xda014b6014be040d5014da014d50148f040b7014da014b7014bc0405c014da", + "0x174040103680504007040a92d8d52dc5c048052a405368052a4055c8102d805", + "0x5320052f01018005368053500505410040da0142601573040103680530405", + "0x536805040a2040b2014da014c501447040b3014da014c6014be040b4014da", + "0x536805180050541027c0536805290055d41029005368052c86a01cb00406a", + "0xb3014da014b3014be040d5014da014d50148f040b4014da014b4014bc04060", + "0x100881601cda014120157a0409f2ccd52d0600480527c053680527c055c810", + "0x17904006014da014d501578040d5014da014150157b040d7014da0141601576", + "0xa2014da014a201406040b0014da0142201576040a2350073680535c0601ca1", + "0x52f01001d4d040bc014da014bc01406040bc08407368052c0a2350a15e410", + "0x29014de040c10a407368053000553c1030005368050980553810098be01cda", + "0xda014ce01551040ce014da014cf014c6040cf014da014c1015500401036805", + "0x73680532005548103200536805040c3040cd014da014cc014c5040cc33807", + "0x5368052f8050541008405368050840523c1031805368053180530810318c8", + "0x1036805040070403f0dcbf28601308c3314a136807334c62840505437040be", + "0x1030c053680530c052f8103140536805314052f01030805368053080501810", + "0xda0141054c10040da0141001c10160bd100a18083d0f00736807308be01d15", + "0xda01446014bf040c8014da014c8014c204046014da01457338075bc1015c05", + "0xa180c4a1204e284da01c46320c3314150dc100f005368050f0050541011805", + "0x4e014da0144e014bc0404a014da0144a01406040103680504007040421404f", + "0x7040bb164472860410c5301cda01c4a0f007454101200536805120052f810", + "0x5c015710405c014da014b901570040b9014da014430f40745810040da01410", + "0x50840523c101380536805138052f01014c053680514c05054102dc0536805", + "0x480844e14c12014b7014da014b70157204048014da01448014be04021014da", + "0x3d014ae04010368052ec052b810040da01459014ae040103680504007040b7", + "0xb5014da014b501406040b5014da01410374102d80536805040d70401036805", + "0xb3014da0144e014bc040b4014da014470141504060014da014b52d80735010", + "0x1001c100420501410164102c405368051800511c102c80536805120052f810", + "0x53680513c052f0102bc05368050f00505410040da0143d014ae0401036805", + "0x7040108180504059040ac014da0144201447040ad014da01450014be040ae", + "0x1036805338055cc10040da01458014ae04010368052f4052b810040da01410", + "0x6a014060406a014da01410374102a40536805040d70401036805320055d010", + "0xc5014bc040b4014da0144001415040a4014da0146a2a407350101a80536805", + "0xda01410288102c405368052900511c102c8053680530c052f8102cc0536805", + "0xda014b4014150409c014da0149e015750409e014da014b127c072c01027c05", + "0x5368052c8052f81008405368050840523c102cc05368052cc052f0102d005", + "0x55d010040da0141001c10270b2084b32d0120149c014da0149c01572040b2", + "0xda014bf014bc040af014da014be014150401036805338055cc10040da014c8", + "0x30014da01410288102b005368050fc0511c102b405368050dc052f8102b805", + "0xaf014da014af0141504096014da014990157504099014da014ac0c0072c010", + "0x102b405368052b4052f81008405368050840523c102b805368052b8052f010", + "0x176040d70480736805048054fc10258ad084ae2bc1201496014da0149601572", + "0x55f410040da0141001c100180581c1036807354055f010354053680535c05", + "0x10368050480525010040da01416014940401036805088052c810040da01415", + "0x7350102880536805288050181028805368050417f040d4014da0141035c10", + "0x536c102f005368052c02101cb004021014da01410288102c00536805288d4", + "0x70148f04005014da01405014bc04010014da0141001415040be014da014bc", + "0x701410048052f805368052f805600102840536805284052f81001c0536805", + "0x100981601cda014160153f04010368050180560410040da0141001c102f8a1", + "0x17d0401036805040070402901608040da01cc00157c040c0014da0142601576", + "0xda014120149404010368050580525010040da01422014b2040103680505405", + "0xd4040cf014da014cf01406040cf014da01410608103040536805040d704010", + "0xdb040cd014da014ce330072c0103300536805040a2040ce014da014cf30407", + "0x523c100140536805014052f01004005368050400505410320053680533405", + "0x504012014c8014da014c801580040a1014da014a1014be04007014da01407", + "0xc60480736805048054fc10040da0142901581040103680504007040c828407", + "0x184040c2014da014c301583040c3014da0141022c103140536805318055d810", + "0x5290100fc05368050dc0561c10040da014bf01586040372fc073680530805", + "0x101003d01cda014c50f007285790403c014da0143c014060403c014da0143f", + "0x57014da0145801588040582f407368051001001d4d04040014da0144001406", + "0x1012005368051380562c10040da014460158a0404e118073680515c0562410", + "0x10140053680513c053141013c4a01cda0144a015510404a014da01448014c6", + "0x8f04053014da01453014c204053108073680510805548101080536805040c3", + "0x43284da01c5014ca1014150dc102f405368052f405054100f405368050f405", + "0x43014bc04059014da01459014060401036805040070405c2e4bb2860916447", + "0xb52860a2d8b701cda01c592f4074541011c053680511c052f81010c0536805", + "0x102c805368052cc4a01d6f040b3014da0141054c10040da0141001c102d060", + "0x37040b7014da014b701415040b2014da014b2014bf04042014da01442014c2", + "0x501810040da0141001c102a4ac2b4a182cae2bcb1284da01cb21084710c15", + "0xb701d15040af014da014af014be040b1014da014b1014bc040ae014da014ae", + "0x100c005368050408b0401036805040070409c2789f2860c2906a01cda01cae", + "0x931d80736805258052bc102582201cda01422014b104099014da0143001583", + "0x5040300401036805040070408922c078348f250073680724ca41a8a163010", + "0xda0148f0158e04088014da014940141504083014da014870158d04087014da", + "0x100c010040da0141001c100420e01410164103c0053680520c0563c1000005", + "0x52240563810220053680522c05054103c805368053c405640103c40536805", + "0xf701e0f3d8f301cda01c762d8882858c040f0014da014f20158f04000014da", + "0x18e040fa014da014f60158e040f9014da014f301415040103680504007040f8", + "0xda0141001c1004210014101641041c05368053c00563c103ec053680500005", + "0x736807420003dca1630104200536805420056381042005368050419104010", + "0x53e005638103e405368054240505410040da0141001c104310b01e1142909", + "0x10840050405904107014da014f00158f040fb014da0150a0158e040fa014da", + "0x543c056401043c05368050403004010368053c0057cc10040da0141001c10", + "0xda0150c0158e040fa014da014f80158e040f9014da0150b0141504110014da", + "0x5040070411201612444053680741c057d01041c05368054400563c103ec05", + "0x53680544c055d81044c1201cda014120153f0401036805444053d810040da", + "0x118014da01517015870401036805458056181045d1601cda014990158404115", + "0x736805455190f4a15e4104640536805464050181046405368054600529010", + "0x53e8052b0104711b01cda0151a3e4075341046805368054680501810468dc", + "0xda0141030c1047c053680547805314104791c01cda0151c015510411d014da", + "0xda014dc0148f04135014da01535014c2041354d007368054d005548104d005", + "0xa1851374d807368074751f4d4af2c41284c1046c053680546c050541037005", + "0x104f40536805041530413c014da014fb014ac0401036805040070413b4e538", + "0x104d005368054d005308104d805368054d8052f0104fc05368054f51c01d6f", + "0x14450d42286155054001cda01d3c4fd344dd3604a130413f014da0153f014bf", + "0x8b04146014da0154501576041450580736805058054fc10040da0141001c10", + "0x56181052d4a01cda015490158404149014da015470158304147014da01410", + "0x5534050181053405368055300529010530053680552c0561c10040da0154a", + "0x75341053c053680553c050181053d4e01cda01546534dc285790414d014da", + "0x1054d5201cda015510158904151014da015500158804150378073680553d1b", + "0x5544105c005368055bc05318105bc053680554c0562c10040da015520158a", + "0xdd01552040dd014da0141030c105c805368055c405314105c57001cda01570", + "0x14e0148f04173014da01573014c204140014da01540014bc041733740736805", + "0x1765d574284da01d725cd41500150dc10378053680537805054105380536805", + "0xda01574014bc04176014da0157601406040103680504007041795e17728616", + "0x17f5f57c286175ed7a01cda01d7637807454105d405368055d4052f8105d005", + "0x530810600053680536d7001d6f040db014da0141054c10040da0141001c10", + "0x174054370417a014da0157a0141504180014da01580014bf040dd014da014dd", + "0x560c0501810040da0141001c1061d86610a18618360981284da01d8037575", + "0x760d7a01d1504182014da01582014be04181014da01581014bc04183014da", + "0x560c1063405368050408b0401036805040070418c62d8a286196258801cda", + "0x21a04191640073680563c052bc1063c2201cda01422014b10418e014da0158d", + "0x536805040300401036805040070421a84c0786df47cc073680764589620a1", + "0x21f014da015f40158e0421e014da015f3014150421d014da0161c0158d0421c", + "0xda014100c010040da0141001c1004221014101641088005368058740563c10", + "0x5368058680563810878053680584c050541088c0536805888056401088805", + "0x108a22701e268962401cda01d905ee1e2861a04220014da016230158f0421f", + "0x21f0158e0422a014da016250158e04229014da0162401415040103680504007", + "0x10040da0141001c100422c01410164108ac05368058800563c103800536805", + "0x22f8b807368078b61f89ca1868108b405368058b405638108b4053680504191", + "0x5368058a005638108a405368058b80505410040da0141001c108ca3101e30", + "0x7040108b005040590422b014da016200158f040e0014da0162f0158e0422a", + "0x5368058cc05640108cc0536805040300401036805880057cc10040da01410", + "0xe0014da016320158e0422a014da016280158e04229014da016310141504234", + "0x10368050400704237016368d405368078ac057d0108ac05368058d00563c10", + "0x108e405368058e0055d8108e01601cda014160153f04010368058d4053d810", + "0xa40423c014da0163b0158704010368058e805618108ee3a01cda0158e01584", + "0x23f8f807368058e63d538a15e4108f405368058f405018108f405368058f005", + "0x5368058a8052b0109064001cda0163f8a407534108fc05368058fc0501810", + "0x244014da0141030c101e4053680590c053141090e4101cda016410155104242", + "0x23e014da0163e0148f04245014da01645014c20424591007368059100554810", + "0x24a924a192247918073680790879915826041284c1090005368059000505410", + "0x75bc109340536805041530424c014da014e0014ac0401036805040070424b", + "0x52fc10910053680591005308109180536805918052f010938053680593641", + "0x70425338e52286519424f01cda01e4c93a4491e4604a130424e014da0164e", + "0x508816048a1870109540536805040d704254014da0141035c10040da01410", + "0x59600587c109665801cda016570161e04257014da016560161d04256014da", + "0x5368059540511c1095005368059500511c1096405368059640588010040da", + "0xe20143c0425c3880736805968050fc1096e5a01cda01655952592862204255", + "0xda0165c0143d0401036805974050f01097a5d01cda0165b0143f0401036805", + "0xe497e5093c1588c1093c053680593c052f0103900536805978050f41097c05", + "0x22404266014da014100c010040da0141001c109966498ca198a619800736807", + "0xbc04240014da0164001415040e1014da016670162504267014da0166605407", + "0x5600109840536805984052f8108f805368058f80523c10980053680598005", + "0x1036805054055f410040da0141001c10386618fa6090012014e1014da014e1", + "0x109a805368059a40536c109a405368059966801cb004268014da0141028810", + "0xbe0423e014da0163e0148f04263014da01663014bc04240014da0164001415", + "0x5040070426a9923e98e40048059a805368059a80560010990053680599005", + "0x9404010368050580525010040da01422014b20401036805054055f410040da", + "0x253014470426c014da014e3014be0426b014da01652014bc040103680504805", + "0xb20401036805054055f410040da0141001c100426e01410164109b40536805", + "0xda016410157304010368050480525010040da0141601494040103680508805", + "0xbe0426b014da01649014bc0401036805910055d010040da014e0014ae04010", + "0x26f01cb00426f014da01410288109b4053680592c0511c109b0053680592805", + "0x26b014bc04240014da016400141504271014da01670014db04270014da0166d", + "0x59c405600109b005368059b0052f8108f805368058f80523c109ac0536805", + "0xae04010368058dc053d810040da0141001c109c66c8fa6b9001201671014da", + "0xda01416014940401036805088052c810040da014150157d04010368058a805", + "0x1035c10040da0158e015860401036805380052b810040da014120149404010", + "0x59ce7201cd404273014da016730140604273014da0141089c109c80536805", + "0xda01675014db04275014da0167437c072c01037c0536805040a204274014da", + "0x5368055380523c106040536805604052f0108a405368058a405054109d805", + "0x109d982539818a41201676014da016760158004182014da01582014be0414e", + "0xda0157b014ae0401036805630052b810040da0158b014ae040103680504007", + "0x525010040da01416014940401036805088052c810040da014150157d04010", + "0x5368059e005018109e00536805040dd04277014da0141035c10040da01412", + "0x536805604052f0109e8053680562805054109e405368059e27701cd404278", + "0x7040109f805040590427d014da01679014470427c014da01582014be0427b", + "0x1036805088052c810040da014150157d04010368055ec052b810040da01410", + "0x52f0109fc05368055e80505410040da014120149404010368050580525010", + "0x50405904282014da015870144704281014da01586014be04280014da01584", + "0x55f410040da0157f014ae04010368055f4052b810040da0141001c1004283", + "0x10368050480525010040da01416014940401036805088052c810040da01415", + "0x5040dd04284014da0141035c10040da014dd0157404010368055c0055cc10", + "0x55f00505410a180536805a168401cd404285014da016850140604285014da", + "0xda01686014470427c014da01575014be0427b014da01574014bc0427a014da", + "0x5368059f0058a410a2005368059ec058a010a1c05368059e805370109f405", + "0xdd0157404010368050400704010a2c05040590428a014da0167d0162a04289", + "0x10040da01416014940401036805088052c810040da014150157d0401036805", + "0x177014bc0427f014da014de0141504010368055c0055cc10040da0141201494", + "0x59fc0537010a0805368055e40511c10a0405368055e0052f810a000536805", + "0xda016820162a04289014da016810162904288014da016800162804287014da", + "0x536805a340536c10a340536805a2a8c01cb00428c014da0141028810a2805", + "0x14e014da0154e0148f04288014da01688014bc04287014da01687014150428e", + "0x70428ea254ea228704805a380536805a380560010a240536805a24052f810", + "0x10368050580525010040da01422014b20401036805054055f410040da01410", + "0x4704290014da01543014be0428f014da01542014bc04010368050480525010", + "0x1036805054055f410040da0141001c10042920141016410a44053680551005", + "0x11c0157304010368050480525010040da01416014940401036805088052c810", + "0x28f014da01538014bc04010368054d0055d010040da014fb014ae0401036805", + "0xb004293014da0141028810a4405368054ec0511c10a4005368054e4052f810", + "0xbc0411b014da0151b0141504295014da01694014db04294014da01691a4c07", + "0x560010a400536805a40052f81037005368053700523c10a3c0536805a3c05", + "0x1036805448053d810040da0141001c10a56903728f46c1201695014da01695", + "0x16014940401036805088052c810040da014fa014ae0401036805054055f410", + "0x10040da014990158604010368053ec052b810040da01412014940401036805", + "0x29601cd404297014da016970140604297014da0141038010a580536805040d7", + "0x29a014db0429a014da01698a64072c010a640536805040a204298014da01697", + "0x50f40523c102c405368052c4052f0103e405368053e405054103980536805", + "0xaf0f4b13e412014e6014da014e601580040af014da014af014be0403d014da", + "0x150157d0401036805270052b810040da0149e014ae040103680504007040e6", + "0x10040da01416014940401036805088052c810040da014b6014ae0401036805", + "0x5a700501810a700536805040dd0429b014da0141035c10040da0141201494", + "0x52c4052f010a78053680527c0505410a740536805a729b01cd40429c014da", + "0x10a880504059042a1014da0169d01447042a0014da014af014be0429f014da", + "0x5088052c810040da014b6014ae0401036805054055f410040da0141001c10", + "0x10a8c05368052dc0505410040da014120149404010368050580525010040da", + "0x59042a6014da014a901447042a5014da014ac014be042a4014da014ad014bc", + "0x10040da014b4014ae0401036805180052b810040da0141001c10042a701410", + "0x50480525010040da01416014940401036805088052c810040da014150157d", + "0xdd042a8014da0141035c10040da01442015740401036805128055cc10040da", + "0x505410aa80536805aa6a801cd4042a9014da016a901406042a9014da01410", + "0x2aa01447042a0014da01447014be0429f014da01443014bc0429e014da014b5", + "0x5a80058a410ab00536805a7c058a010aac0536805a780537010a840536805", + "0x17d04010368050400704010abc0504059042ae014da016a10162a042ad014da", + "0xda01416014940401036805088052c810040da0144201574040103680505405", + "0xbc042a3014da014bd014150401036805128055cc10040da014120149404010", + "0x537010a9805368051700511c10a9405368052e4052f810a9005368052ec05", + "0x2a60162a042ad014da016a501629042ac014da016a401628042ab014da016a3", + "0x5ac40536c10ac40536805abab001cb0042b0014da0141028810ab80536805", + "0xda0143d0148f042ac014da016ac014bc042ab014da016ab01415042b2014da", + "0x2b2ab43dab2ab04805ac80536805ac80560010ab40536805ab4052f8100f405", + "0x100180536805040f8040d5014da014d701576040d70480736805048054fc10", + "0x22f0401036805288058b8102c0a201cda014d40162d040d4014da014060162b", + "0xa15e4102f005368052f005018102f00536805084052901008405368052c005", + "0x29014da014c001576040c00580736805058054fc10098be01cda014d52f007", + "0xda014cf01406040cf30407368050a4262f8a15e41009805368050980501810", + "0x5334056241033405368053300562010330ce01cda014cf040075341033c05", + "0xda014c5014c6040c5014da014c60158b04010368053200562810318c801cda", + "0x536805040c3040bf014da014c2014c5040c230c073680530c055441030c05", + "0x5368053040523c100fc05368050fc05308100fc3701cda014370155204037", + "0xbd286b31003d0f0a1368072fc3f2840505437040ce014da014ce01415040c1", + "0x100f005368050f0052f01010005368051000501810040da0141001c1015c58", + "0x1001c1013c4a120a1ad04e1180736807100ce01d150403d014da0143d014be", + "0xda01437014c204042014da0145030c075bc101400536805041530401036805", + "0x420dc3d0f0150dc10118053680511805054101080536805108052fc100dc05", + "0x47014da0144701406040103680504007040b92ec59286b511c4314ca136807", + "0x5c01cda01c47118074541010c053680510c052f81014c053680514c052f010", + "0xda0144e01632040b4014da014108c410040da0141001c10180b52d8a1ad8b7", + "0xb22cc078cc10170053680517005054102c8b401cda014b401632040b313807", + "0x10042b80141016410040da014b4014ae04010368050400704010adc1036807", + "0x10042b9040da01cb42c4078cc102c4b701cda014b701632040103680504007", + "0xac2b407368072b8b7170a1630102b8af01cda01422014af040103680504007", + "0x9f014da014a40158d040a4014da014100c010040da0141001c101a8a901eba", + "0x100c0053680527c0563c1027005368052b0056381027805368052b40505410", + "0x536805264056401026405368050403004010368050400704010aec0504059", + "0x30014da014960158f0409c014da0146a0158e0409e014da014a90141504096", + "0x76014150401036805040070408f25007af0931d807368072bc4e278a163010", + "0x50c00563c1021c05368052700563810224053680524c056381022c0536805", + "0x56381022005368050419104010368050400704010af4050405904083014da", + "0xda0141001c103c8f101ebe3c00001cda01c88270942858c04088014da01488", + "0x87014da014f00158e04089014da0148f0158e0408b014da014000141504010", + "0x50c0057cc10040da0141001c10042bd014101641020c05368050c00563c10", + "0x8b014da014f101415040f6014da014f301590040f3014da014100c010040da", + "0x1020c05368053d80563c1021c05368053c80563810224053680523c0563810", + "0x11604010368053dc053d810040da0141001c103e005afcf7014da01c83015f4", + "0x8f04053014da01453014bc0408b014da0148b01415040f9014da0148722407", + "0x53c8100480536805048053c81010c053680510c052f810304053680530405", + "0x53e4160481510cc114c8b35d43040f9014da014f90153704016014da01416", + "0x53e0053d810040da0141001c104250841cfb3e81201509421073ecfa048da", + "0xae0401036805054055f410040da014120149404010368050580525010040da", + "0x536805040e00410a014da0141035c10040da01489014ae040103680521c05", + "0x10f014da0141028810430053680542d0a01cd40410b014da0150b014060410b", + "0x8b014da0148b0141504111014da01510014db04110014da0150c43c072c010", + "0x1010c053680510c052f81030405368053040523c1014c053680514c052f010", + "0x5138052b810040da0141001c10444433045322c1201511014da0151101580", + "0xb204010368052dc052b810040da014120149404010368050580525010040da", + "0x1130162504113014da015120540789010448053680504030040103680508805", + "0x53040523c1014c053680514c052f010170053680517005054104540536805", + "0x43304531701201515014da015150158004043014da01443014be040c1014da", + "0x4e014ae0401036805180052b810040da014b5014ae04010368050400704115", + "0x10040da014150157d04010368050480525010040da01416014940401036805", + "0x545c050181045c0536805040dd04116014da0141035c10040da01422014b2", + "0x514c052f01046405368052d80505410460053680545d1601cd404117014da", + "0x10b0005040590411b014da01518014470411a014da01443014be040dc014da", + "0x50480525010040da01416014940401036805138052b810040da0141001c10", + "0x1047005368051180505410040da01422014b20401036805054055f410040da", + "0x590411f014da014b9014470411e014da014bb014be0411d014da01459014bc", + "0x10040da0144f014ae0401036805128052b810040da0141001c10042c101410", + "0x5088052c810040da014150157d04010368050480525010040da0141601494", + "0xdd04134014da0141035c10040da0143701574040103680530c055cc10040da", + "0x5054104d805368054d53401cd404135014da015350140604135014da01410", + "0x136014470411a014da0143d014be040dc014da0143c014bc04119014da01448", + "0x5468058a4104e00536805370058a0104dc0536805464053701046c0536805", + "0x17404010368050400704010b0805040590413b014da0151b0162a04139014da", + "0xda014150157d04010368050480525010040da014160149404010368050dc05", + "0xbc0411c014da014ce01415040103680530c055cc10040da01422014b204010", + "0x53701047c053680515c0511c104780536805160052f81047405368052f405", + "0x11f0162a04139014da0151e0162904138014da0151d0162804137014da0151c", + "0x54f40536c104f405368054ed3c01cb00413c014da01410288104ec0536805", + "0xda014c10148f04138014da01538014bc04137014da01537014150413f014da", + "0x13f4e4c14e137048054fc05368054fc05600104e405368054e4052f81030405", + "0x2c3040da01cd50157c040d5014da014d701576040d70580736805058054fc10", + "0x525010040da01422014b20401036805054055f410040da0141001c1001805", + "0xa2014da014108d0103500536805040d704010368050480525010040da01416", + "0x100840536805040a2040b0014da014a2350073501028805368052880501810", + "0x10040053680504005054102f805368052f00536c102f005368052c02101cb0", + "0x180040a1014da014a1014be04007014da014070148f04005014da01405014bc", + "0xda0140601581040103680504007040be2840701410048052f805368052f805", + "0x29014da014103e0103000536805098055d8100981201cda014120153f04010", + "0x10040da014cf0162e040ce33c0736805304058b41030405368050a4058ac10", + "0x179040cd014da014cd01406040cd014da014cc014a4040cc014da014ce0162f", + "0x536805314055d8103141601cda014160153f040c63200736805300cd01ca1", + "0x52fc05018102fcc201cda014c3318c828579040c6014da014c601406040c3", + "0x52bc100f02201cda01422014b10403f0dc07368052fc1001d4d040bf014da", + "0xc5040580fc07368050fc05544102f405368050f4052b0101003d01cda0143c", + "0x5308101384601cda014460155204046014da0141030c1015c053680516005", + "0x504a1304037014da0143701415040c2014da014c20148f0404e014da0144e", + "0x5100052b010040da0141001c101085013ca1b104a12007368072f457138a1", + "0xda01448014bc04047014da014430fc075bc1010c05368050415304053014da", + "0x471184a1201284c1011c053680511c052fc101180536805118053081012005", + "0x102d80536805040d7040103680504007040b7170b9286c52ec5901cda01c53", + "0x102d00536805180058dc10180053680508816048a18d4102d40536805040d7", + "0x47040b2014da014b20162004010368052cc0587c102c8b301cda014b40161e", + "0xaf2c407368052d4b62c8a1888102d405368052d40511c102d805368052d805", + "0xa92b007368052bc050fc10040da014ae0143c040ad2b807368052c4050fc10", + "0xbc040a4014da014a90143d0406a014da014ad0143d04010368052b0050f010", + "0x7040990c09c286c62789f01cda01ca41a8bb1641588c10164053680516405", + "0x51d805894101d805368052581501e2404096014da014100c010040da01410", + "0xda014c20148f0409f014da0149f014bc04037014da014370141504093014da", + "0x93278c227c370480524c053680524c05600102780536805278052f81030805", + "0x99250072c0102500536805040a20401036805054055f410040da0141001c10", + "0x5270052f0100dc05368050dc050541022c053680523c0536c1023c0536805", + "0xda0148b0158004030014da01430014be040c2014da014c20148f0409c014da", + "0x52c810040da014150157d0401036805040070408b0c0c2270370480522c05", + "0x5368052e4052f010040da014120149404010368050580525010040da01422", + "0x704010b1c050405904083014da014b70144704087014da0145c014be04089", + "0x10368050580525010040da01422014b20401036805054055f410040da01410", + "0x46015740401036805100052b810040da0143f0157304010368050480525010", + "0xda014420144704087014da01450014be04089014da0144f014bc0401036805", + "0x5368050000536c10000053680520c8801cb004088014da014102881020c05", + "0xc2014da014c20148f04089014da01489014bc04037014da0143701415040f0", + "0x11b040f021cc222437048053c005368053c0056001021c053680521c052f810", + "0x53540547010040da0141001c10288d4018a1b20d535c22284da01ca101407", + "0x11f040c0098be2f021048da014b00151e040b0014da014d50151d040d5014da", + "0xda014c00153504010368050980525010040da014bc01534040103680508405", + "0x5368050a4055d8100a4be01cda014be0153f040be014da014be014f204010", + "0xcd3300736805338058b410338053680533c058ac1033c0536805040f8040c1", + "0x6040c6014da014c8014a4040c8014da014cd0162f0401036805330058b810", + "0x1201cda014120153f040c33140736805304c601ca15e410318053680531805", + "0xda014bf30cc528579040c3014da014c301406040bf014da014c201576040c2", + "0x3d015880403d0f007368050fc1001d4d0403f014da0143f014060403f0dc07", + "0x51600562c10040da014bd0158a040582f4073680510005624101000536805", + "0x513805314101384601cda014460155104046014da01457014c604057014da", + "0xda01422014bc0404f128073680512805548101280536805040c304048014da", + "0x5368050f005054100dc05368050dc0523c1013c053680513c053081008805", + "0x1036805040070405911c43286c914c42140a1368071204f35c22054370403c", + "0x101080536805108052f8101400536805140052f01014c053680514c0501810", + "0xda0141054c10040da0141001c102d8b7170a1b28b92ec073680714c3c01d15", + "0xda01460014bf0404a014da0144a014c204060014da014b5118075bc102d405", + "0xa1b2cb22ccb4284da01c6012842140150dc102ec05368052ec050541018005", + "0xb4014da014b4014bc040b2014da014b201406040103680504007040ae2bcb1", + "0x7040a41a8a9286cc2b0ad01cda01cb22ec07454102cc05368052cc052f810", + "0x2cd0c09c01cda01c9e2b0ad2861a0409e27c0736805058052bc10040da01410", + "0x1024c05368051d805634101d80536805040300401036805040070409626407", + "0x590408b014da014930158f0408f014da014300158e04094014da0149c01415", + "0x87014da014890159004089014da014100c010040da0141001c10042ce01410", + "0x1022c053680521c0563c1023c0536805258056381025005368052640505410", + "0x520c0505410040da0141001c103c00001ecf2208301cda01c9f2e4942861a", + "0xda0148b0158f040f3014da0148f0158e040f2014da014880158e040f1014da", + "0xf70158e040f7014da0141064410040da0141001c10042d001410164103d805", + "0x103680504007040fb3e807b44f93e007368073dc8f000a1868103dc0536805", + "0x103cc05368053e405638103c805368053c005638103c405368053e00505410", + "0xda0148b015f304010368050400704010b400504059040f6014da0148b0158f", + "0x103c405368053e80505410420053680541c056401041c05368050403004010", + "0x1f4040f6014da015080158f040f3014da014fb0158e040f2014da014f00158e", + "0x745810040da01509014f60401036805040070410a016d242405368073d805", + "0x523c102d005368052d0052f0103c405368053c4050541042c05368053ccf2", + "0x12014f2040be014da014be014f2040b3014da014b3014be04037014da01437", + "0xda0150b048be054b30dcb43c4d750c1042c053680542c054dc100480536805", + "0xda0150a014f6040103680504007041124451043d0c04805449114410f43012", + "0x52b810040da014150157d04010368052f80525010040da014120149404010", + "0x115014da0141089c1044c0536805040d704010368053c8052b810040da014f3", + "0x1045c0536805040a204116014da0151544c073501045405368054540501810", + "0x103c405368053c4050541046405368054600536c1046005368054591701cb0", + "0x180040b3014da014b3014be04037014da014370148f040b4014da014b4014bc", + "0xda0146a014ae040103680504007041192cc372d0f104805464053680546405", + "0x525010040da014120149404010368052e4052b810040da014a4014ae04010", + "0xdc014da0141035c10040da01416014b20401036805054055f410040da014be", + "0x1046c0536805468dc01cd40411a014da0151a014060411a014da0141037410", + "0x470411e014da014b3014be0411d014da014b4014bc0411c014da014a901415", + "0x10368052e4052b810040da0141001c10042d3014101641047c053680546c05", + "0x16014b20401036805054055f410040da014be0149404010368050480525010", + "0xda014af014be04135014da014b1014bc04134014da014bb014150401036805", + "0x52b810040da0141001c10042d401410164104dc05368052b80511c104d805", + "0x10368052f80525010040da014120149404010368052d8052b810040da014b7", + "0x4a015740401036805118055cc10040da01416014b20401036805054055f410", + "0x139014da015390140604139014da01410374104e00536805040d70401036805", + "0x11d014da01450014bc0411c014da0145c014150413b014da015394e00735010", + "0x104f00536805470053701047c05368054ec0511c104780536805108052f810", + "0x5904140014da0151f0162a0413f014da0151e016290413d014da0151d01628", + "0x10040da01412014940401036805128055d010040da0141001c10042d501410", + "0x5118055cc10040da01416014b20401036805054055f410040da014be01494", + "0x53680511c052f8104d4053680510c052f0104d005368050f00505410040da", + "0x13d014da01535016280413c014da01534014dc04137014da014590144704136", + "0xb004141014da014102881050005368054dc058a8104fc05368054d8058a410", + "0xbc0413c014da0153c0141504143014da01542014db04142014da0154050407", + "0x5600104fc05368054fc052f8100dc05368050dc0523c104f405368054f405", + "0x10368050480525010040da0141001c1050d3f0dd3d4f01201543014da01543", + "0x14401cb004144014da0141028810040da01416014b20401036805054055f410", + "0x6014bc04010014da014100141504146014da01545014db04145014da014a2", + "0x551805600103500536805350052f81001c053680501c0523c100180536805", + "0xd4018a1b58d535c22284da01ca10140746c10518d401c060401201546014da", + "0x11e040b0014da014d50151d040d5014da014d50151c040103680504007040a2", + "0x10040da014bc0153404010368050840547c10300262f8bc08412368052c005", + "0xbe0153f040be014da014be014f20401036805300054d410040da0142601494", + "0x533c058ac1033c0536805040f8040c1014da0142901576040292f80736805", + "0xda014cd0162f0401036805330058b810334cc01cda014ce0162d040ce014da", + "0x5304c601ca15e410318053680531805018103180536805320052901032005", + "0xc301406040bf014da014c201576040c20480736805048054fc1030cc501cda", + "0x14d0403f014da0143f014060403f0dc07368052fcc3314a15e41030c0536805", + "0x582f40736805100056241010005368050f405620100f43c01cda0143f04007", + "0x15104046014da01457014c604057014da014580158b04010368052f40562810", + "0x5548101280536805040c304048014da0144e014c50404e118073680511805", + "0x523c1013c053680513c05308100880536805088052f01013c4a01cda0144a", + "0x42140a1368071204f35c22054370403c014da0143c0141504037014da01437", + "0x5140052f01014c053680514c0501810040da0141001c101644710ca1b5c53", + "0xb7170a1b60b92ec073680714c3c01d1504042014da01442014be04050014da", + "0xc204060014da014b5118075bc102d4053680504153040103680504007040b6", + "0x150dc102ec05368052ec05054101800536805180052fc10128053680512805", + "0xb201406040103680504007040ae2bcb1286d92c8b32d0a1368071804a10850", + "0xb22ec07454102cc05368052cc052f8102d005368052d0052f0102c80536805", + "0x9e27c0736805058052bc10040da0141001c102906a2a4a1b68ac2b40736807", + "0x5040300401036805040070409626407b6c302700736807278ac2b4a163010", + "0xda014300158e04094014da0149c0141504093014da014760158d04076014da", + "0x100c010040da0141001c10042dc014101641022c053680524c0563c1023c05", + "0x525805638102500536805264050541021c053680522405640102240536805", + "0x1edd2208301cda01c9f2e4942858c0408b014da014870158f0408f014da", + "0x18e040f2014da014880158e040f1014da0148301415040103680504007040f0", + "0xda0141001c10042de01410164103d8053680522c0563c103cc053680523c05", + "0x7368073dc8f000a1630103dc05368053dc05638103dc05368050419104010", + "0x53c005638103c405368053e00505410040da0141001c103ecfa01edf3e4f8", + "0x10b780504059040f6014da0148b0158f040f3014da014f90158e040f2014da", + "0x541c056401041c053680504030040103680522c057cc10040da0141001c10", + "0xda014fb0158e040f2014da014f00158e040f1014da014fa0141504108014da", + "0x5040070410a016e042405368073d8057d0103d805368054200563c103cc05", + "0x5368053c4050541042c05368053ccf201d160401036805424053d810040da", + "0xb3014da014b3014be04037014da014370148f040b4014da014b4014bc040f1", + "0x1042c053680542c054dc100480536805048053c8102f805368052f8053c810", + "0x1124451043d0c04805449114410f430123680542c122f8152cc372d0f135d43", + "0x52f80525010040da01412014940401036805428053d810040da0141001c10", + "0xd704010368053c8052b810040da014f3014ae0401036805054055f410040da", + "0x11544c0735010454053680545405018104540536805040e004113014da01410", + "0x54600536c1046005368054591701cb004117014da01410288104580536805", + "0xda014370148f040b4014da014b4014bc040f1014da014f10141504119014da", + "0x1192cc372d0f104805464053680546405600102cc05368052cc052f8100dc05", + "0x52e4052b810040da014a4014ae04010368051a8052b810040da0141001c10", + "0xb20401036805054055f410040da014be0149404010368050480525010040da", + "0xda0151a014060411a014da01410374103700536805040d7040103680505805", + "0xda014b4014bc0411c014da014a9014150411b014da0151a370073501046805", + "0x10042e1014101641047c053680546c0511c1047805368052cc052f81047405", + "0xda014be0149404010368050480525010040da014b9014ae040103680504007", + "0xbc04134014da014bb014150401036805058052c810040da014150157d04010", + "0x10164104dc05368052b80511c104d805368052bc052f8104d405368052c405", + "0x9404010368052d8052b810040da014b7014ae04010368050400704010b8805", + "0xda01416014b20401036805054055f410040da014be01494040103680504805", + "0x10374104e00536805040d70401036805128055d010040da014460157304010", + "0x5c014150413b014da015394e007350104e405368054e405018104e40536805", + "0x54ec0511c104780536805108052f8104740536805140052f0104700536805", + "0xda0151e016290413d014da0151d016280413c014da0151c014dc0411f014da", + "0x55d010040da0141001c10042e30141016410500053680547c058a8104fc05", + "0x1036805054055f410040da014be0149404010368050480525010040da0144a", + "0x52f0104d005368050f00505410040da01446015730401036805058052c810", + "0x134014dc04137014da014590144704136014da01447014be04135014da01443", + "0x54dc058a8104fc05368054d8058a4104f405368054d4058a0104f00536805", + "0xda01542014db04142014da01540504072c0105040536805040a204140014da", + "0x5368050dc0523c104f405368054f4052f0104f005368054f0050541050c05", + "0x1050d3f0dd3d4f01201543014da01543015800413f014da0153f014be04037", + "0xda01416014b20401036805054055f410040da0141201494040103680504007", + "0x146014da01545014db04145014da014a2510072c0105100536805040a204010", + "0x1001c053680501c0523c100180536805018052f01004005368050400505410", + "0x1033c10518d401c060401201546014da0154601580040d4014da014d4014be", + "0xda014a2014c2040a2014da0141030c10350053680501805314100180536805", + "0xa1b90212c00736807048d4288a10141284c103500536805350052fc1028805", + "0x100a405368053000531410300053680504046040103680504007040262f8bc", + "0x52fc10304053680530405308102c005368052c0052f0103040536805040c3", + "0x7040c8334cc286e5338cf01cda01c160a4c1084b004a1304029014da01429", + "0xda014c6014c5040c5014da0142201453040c6014da0141013810040da01410", + "0xc2014da014c2014c2040cf014da014cf014bc040c2014da0141030c1030c05", + "0x3c0fca1b98372fc0736807314c3308ce33c1284c1030c053680530c052fc10", + "0x102f40536805100055d810100d501cda014d50153f0401036805040070403d", + "0x58016e7040da01cbd0157c04037014da01437014be040bf014da014bf014bc", + "0x535c052c810040da014d5014940401036805054055f410040da0141001c10", + "0x101180536805118050181011805368050423804057014da0141035c10040da", + "0x1012805368051384801cb004048014da014102881013805368051185701cd4", + "0x8f040bf014da014bf014bc04010014da01410014150404f014da0144a014db", + "0x100480513c053680513c05600100dc05368050dc052f81001c053680501c05", + "0x1014005368050423904010368051600560410040da0141001c1013c3701cbf", + "0x47014da01453014ac0404314c0736805108052bc10108d701cda014d7014b1", + "0x102e40536805040c3040bb014da01459014c50405914007368051400554410", + "0x102ec05368052ec052fc1017005368051700530810170b901cda014b901552", + "0xac040103680504007040b4180b5286e82d8b701cda01c472ec5c0dcbf04a13", + "0x5001d6f04050014da014500163a040b2014da0141054c102cc053680510c05", + "0xb1014bf040b9014da014b9014c2040b7014da014b7014bc040b1014da014b2", + "0x1001c102a4ac2b4a1ba4ae2bc07368072ccb12e4b62dc1284c102c40536805", + "0xda0141022c1029005368051a8055d8101a8d501cda014d50153f0401036805", + "0xda0149c015860403027007368052780561010278053680527c0560c1027c05", + "0x96014da014960140604096014da01499014a404099014da014300158704010", + "0x524c1001d4d04093014da0149301406040931d807368052909601ca15e410", + "0x52b01021c8901cda0148b014af0408b35c073680535c052c41023c9401cda", + "0x1030c10000053680522005314102208f01cda0148f0155104083014da01489", + "0xf1014c2040af014da014af014bc040f13c007368053c005548103c00536805", + "0xae2bc1284c10250053680525005054101d805368051d80523c103c40536805", + "0xda01487014ac040103680504007040f83dcf6286ea3ccf201cda01c83000f1", + "0x5368053c8052f0103ec05368053e88f01d6f040fa014da0141054c103e405", + "0xf93ecf03ccf204a13040fb014da014fb014bf040f0014da014f0014c2040f2", + "0xd70410c014da014108ec10040da0141001c1042d0a424a1bad0841c0736807", + "0x587410444053680535cd5430a1870104400536805040d70410f014da01410", + "0x11501620040103680544c0587c104551301cda015120161e04112014da01511", + "0x10f454a18881044005368054400511c1043c053680543c0511c104540536805", + "0x50fc10040da015180143c041194600736805458050fc1045d1601cda01510", + "0x11a0143d0411b014da015190143d0401036805370050f010468dc01cda01517", + "0x2ec4791d01cda01d1c46d0841c1588c1041c053680541c052f0104700536805", + "0x5368054d81501e2404136014da014100c010040da0141001c104d53447ca1", + "0x11d014da0151d014bc04094014da014940141504138014da015370162504137", + "0x54e005368054e005600104780536805478052f8101d805368051d80523c10", + "0x536805040a20401036805054055f410040da0141001c104e11e1d91d25012", + "0x53680525005054104f005368054ec0536c104ec05368054d53901cb004139", + "0x134014da01534014be04076014da014760148f0411f014da0151f014bc04094", + "0x150157d0401036805040070413c4d07647c94048054f005368054f00560010", + "0x13d014da01509014bc040103680535c052c810040da014d5014940401036805", + "0x1001c10042ed0141016410500053680542c0511c104fc0536805428052f810", + "0x10040da014d7014b204010368053540525010040da014150157d0401036805", + "0x53d8052f010040da014f001574040103680521c052b810040da0148f01573", + "0x536805040a204140014da014f8014470413f014da014f7014be0413d014da", + "0x536805250050541050c05368055080536c1050805368055014101cb004141", + "0x13f014da0153f014be04076014da014760148f0413d014da0153d014bc04094", + "0x150157d040103680504007041434fc764f4940480550c053680550c0560010", + "0x144014da014ad014bc040103680535c052c810040da014d5014940401036805", + "0x1001c10042ee014101641051805368052a40511c1051405368052b0052f810", + "0x10040da014d7014b204010368053540525010040da014150157d0401036805", + "0x52d4052f010040da014b901574040103680510c052b810040da0145001573", + "0x536805040a204146014da014b40144704145014da01460014be04144014da", + "0x536805040050541052805368055240536c1052405368055194701cb004147", + "0x145014da01545014be04007014da014070148f04144014da01544014bc04010", + "0xd5014940401036805040070414a51407510100480552805368055280560010", + "0x1052c0536805040a20401036805054055f410040da014d7014b20401036805", + "0x100400536805040050541053405368055300536c1053005368050f54b01cb0", + "0x1800403c014da0143c014be04007014da014070148f0403f014da0143f014bc", + "0xda014d5014940401036805040070414d0f0070fc1004805534053680553405", + "0x1028810040da01422015460401036805054055f410040da014d7014b204010", + "0x1001415040de014da0154f014db0414f014da014c8538072c0105380536805", + "0x5334052f81001c053680501c0523c103300536805330052f0100400536805", + "0x10040da0141001c10378cd01ccc04012014de014da014de01580040cd014da", + "0x50880551810040da014150157d040103680535c052c810040da014d501494", + "0x151014da01426540072c0105400536805040a20401036805058054d410040da", + "0x102f005368052f0052f0100400536805040050541054805368055440536c10", + "0x1201552014da0155201580040be014da014be014be04007014da014070148f", + "0x108f410040da0141001c1005405bbca1014da01c100163c041522f8072f010", + "0xa10163e04016014da014120140735010048053680504805018100480536805", + "0x52c810040da014d50149404006354d7284da014220163f040222840736805", + "0xa201c07350102880536805350055d810350053680535c0590010040da01406", + "0x94040262f8bc284da014210163f040212840736805284058f8102c00536805", + "0x5300055d81030005368052f80590010040da01426014b204010368052f005", + "0x525010330ce33ca136805284058fc1030405368050a4b001cd404029014da", + "0x5334052bc10334cc01cda014cc014b104010368053380525010040da014cf", + "0xda014c5014ac040c5014da014c8014ad0401036805318052b810318c801cda", + "0x52fc052b8100dcbf01cda014cc014af040c2014da014c3304073501030c05", + "0xda0143c30807350100f005368050fc052b0100fc05368050dc052b410040da", + "0x1001c100f41601c050f405368050f40511c1005805368050580511c100f405", + "0xda014400140735010100053680510005018101000536805042410401036805", + "0x46014940404e11857284da014580164304058054073680505405908102f405", + "0x536805120055d810120053680515c0590010040da0144e014b20401036805", + "0xda0145001643040500540736805054059081013c05368051280701cd40404a", + "0x53680514c0590010040da01443014b20401036805108052501010c53108a1", + "0xa1368050540590c102ec05368051644f01cd404059014da014470157604047", + "0xb701cda014b7014b104010368051700525010040da014b901494040b7170b9", + "0xb4014da014b5014ad0401036805180052b810180b501cda014b6014af040b6", + "0xb101cda014b7014af040b2014da014b32ec07350102cc05368052d0052b010", + "0x102b405368052b8052b0102b805368052bc052b410040da014b1014ae040af", + "0x52b005368052b00511c102f405368052f40511c102b005368052b4b201cd4", + "0x15138892201005410284070141021c89220100544e2248804015338ac2f407", + "0x15638a101c050408722488040151388922010054f7284070141021c8922010", + "0x89220102b01213889220102b012a10a101c050408722488040151388922010", + "0x2f1054a101c050408722488040ac0484e22488040ac04af0054a101c0504087", + "0x1213889220102b012bc815284070141021c89220102b01213889220102b012", + "0x50408722488040ac0484e22488040ac04af3054a101c050408722488040ac", + "0x102b012bd415284070141021c89220102b01213889220102b012bd01528407", + "0x88040ac0484e22488040ac04af6054a101c050408722488040ac0484e22488", + "0x1005af8284070141029089220100549f2248804015bdc15284070141021c89", + "0xb52d0892b08804016be412054a101c05040a4224ac22010048152bc892b088", + "0x88040120581505437224ac2201035efa048152840701410290892b08804012", + "0xac2201004816054150dc892b088040d7bec2205812054a101c05040bd224ac", + "0x892b088040120581505437224ac2201035efc088160481528407014102f489", + "0x102f4892b08804012058150dc892b08804022bf42205812054a101c05040bd", + "0xa101c05040bd224ac220100481605437224ac2201008afe05812054a101c05", + "0xa101c05040bd224ac220100481505830018060dc892b08804006bfc1604815", + "0xc0407014100f43d01c3d0f4bc28700354d70881604815" + ], + "sierra_program_debug_info": { + "type_names": [ + [ + 0, + "RangeCheck" + ], + [ + 1, + "Const" + ], + [ + 2, + "Const" + ], + [ + 3, + "Const" + ], + [ + 4, + "ContractAddress" + ], + [ + 5, + "u128" + ], + [ + 6, + "core::integer::u256" + ], + [ + 7, + "cairo_level_tests::contracts::erc20::erc_20::Approval" + ], + [ + 8, + "Const" + ], + [ + 9, + "Const" + ], + [ + 10, + "felt252" + ], + [ + 11, + "core::starknet::storage::storage_base::StorageBase::>>" + ], + [ + 12, + "Const" + ], + [ + 13, + "Const" + ], + [ + 14, + "cairo_level_tests::contracts::erc20::erc_20::Transfer" + ], + [ + 15, + "cairo_level_tests::contracts::erc20::erc_20::Event" + ], + [ + 16, + "Const" + ], + [ + 17, + "Unit" + ], + [ + 18, + "core::bool" + ], + [ + 19, + "StorageBaseAddress" + ], + [ + 20, + "core::starknet::storage::StoragePointer0Offset::>" + ], + [ + 21, + "core::starknet::storage::storage_base::StorageBase::>>" + ], + [ + 22, + "Const" + ], + [ + 23, + "Const" + ], + [ + 24, + "NonZero" + ], + [ + 25, + "Const" + ], + [ + 26, + "Const" + ], + [ + 27, + "core::starknet::storage::StoragePointer0Offset::" + ], + [ + 28, + "Const" + ], + [ + 29, + "Const" + ], + [ + 30, + "Const" + ], + [ + 31, + "cairo_level_tests::contracts::erc20::erc_20::ContractState" + ], + [ + 32, + "Tuple" + ], + [ + 33, + "core::panics::Panic" + ], + [ + 34, + "Array" + ], + [ + 35, + "Tuple>" + ], + [ + 36, + "core::panics::PanicResult::<(cairo_level_tests::contracts::erc20::erc_20::ContractState, ())>" + ], + [ + 37, + "Box" + ], + [ + 38, + "Box" + ], + [ + 39, + "Snapshot>" + ], + [ + 40, + "core::array::Span::" + ], + [ + 41, + "Array" + ], + [ + 42, + "Snapshot>" + ], + [ + 43, + "core::array::Span::" + ], + [ + 44, + "u32" + ], + [ + 45, + "core::starknet::info::v2::TxInfo" + ], + [ + 46, + "u64" + ], + [ + 47, + "core::starknet::info::BlockInfo" + ], + [ + 48, + "core::starknet::info::v2::ResourceBounds" + ], + [ + 49, + "core::starknet::info::v2::ExecutionInfo" + ], + [ + 50, + "Box" + ], + [ + 51, + "core::option::Option::" + ], + [ + 52, + "Box" + ], + [ + 53, + "core::option::Option::>" + ], + [ + 54, + "Const" + ], + [ + 55, + "Tuple" + ], + [ + 56, + "core::pedersen::HashState" + ], + [ + 57, + "core::starknet::storage::StoragePath::>" + ], + [ + 58, + "core::starknet::storage::storage_base::StorageBase::>" + ], + [ + 59, + "Const" + ], + [ + 60, + "Const" + ], + [ + 61, + "core::starknet::storage::StoragePath::>" + ], + [ + 62, + "core::starknet::storage::storage_base::StorageBase::>" + ], + [ + 63, + "Const" + ], + [ + 64, + "Pedersen" + ], + [ + 65, + "core::option::Option::" + ], + [ + 66, + "Tuple" + ], + [ + 67, + "core::panics::PanicResult::<(core::integer::u256,)>" + ], + [ + 68, + "core::starknet::storage::storage_base::StorageBase::" + ], + [ + 69, + "Const" + ], + [ + 70, + "Const" + ], + [ + 71, + "u8" + ], + [ + 72, + "core::starknet::storage::StoragePointer0Offset::" + ], + [ + 73, + "Const" + ], + [ + 74, + "Tuple>" + ], + [ + 75, + "Const" + ], + [ + 76, + "StorageAddress" + ], + [ + 77, + "core::starknet::storage::StoragePointer0Offset::" + ], + [ + 78, + "BuiltinCosts" + ], + [ + 79, + "System" + ], + [ + 80, + "core::panics::PanicResult::<(core::array::Span::,)>" + ], + [ + 81, + "Const" + ], + [ + 82, + "GasBuiltin" + ] + ], + "libfunc_names": [ + [ + 0, + "revoke_ap_tracking" + ], + [ + 1, + "withdraw_gas" + ], + [ + 2, + "branch_align" + ], + [ + 3, + "struct_deconstruct>" + ], + [ + 4, + "store_temp" + ], + [ + 5, + "array_snapshot_pop_front" + ], + [ + 6, + "drop>>" + ], + [ + 7, + "drop>" + ], + [ + 8, + "array_new" + ], + [ + 9, + "const_as_immediate>" + ], + [ + 10, + "store_temp" + ], + [ + 11, + "array_append" + ], + [ + 12, + "struct_construct" + ], + [ + 13, + "struct_construct>>" + ], + [ + 14, + "enum_init,)>, 1>" + ], + [ + 15, + "store_temp" + ], + [ + 16, + "store_temp" + ], + [ + 17, + "store_temp,)>>" + ], + [ + 18, + "get_builtin_costs" + ], + [ + 19, + "store_temp" + ], + [ + 20, + "withdraw_gas_all" + ], + [ + 21, + "storage_base_address_const<1528802474226268325865027367859591458315299653151958663884057507666229546336>" + ], + [ + 22, + "struct_construct>" + ], + [ + 23, + "snapshot_take>" + ], + [ + 24, + "drop>" + ], + [ + 25, + "struct_deconstruct>" + ], + [ + 26, + "rename" + ], + [ + 27, + "storage_address_from_base" + ], + [ + 28, + "const_as_immediate>" + ], + [ + 29, + "store_temp" + ], + [ + 30, + "store_temp" + ], + [ + 31, + "storage_read_syscall" + ], + [ + 32, + "snapshot_take>" + ], + [ + 33, + "drop>" + ], + [ + 34, + "struct_construct>" + ], + [ + 35, + "struct_construct>>" + ], + [ + 36, + "enum_init,)>, 0>" + ], + [ + 37, + "const_as_immediate>" + ], + [ + 38, + "drop>" + ], + [ + 39, + "storage_base_address_const<944713526212149105522785400348068751682982210605126537021911324578866405028>" + ], + [ + 40, + "storage_base_address_const<134830404806214277570220174593674215737759987247891306080029841794115377321>" + ], + [ + 41, + "struct_construct>" + ], + [ + 42, + "snapshot_take>" + ], + [ + 43, + "drop>" + ], + [ + 44, + "struct_deconstruct>" + ], + [ + 45, + "u8_try_from_felt252" + ], + [ + 46, + "u8_to_felt252" + ], + [ + 47, + "const_as_immediate>" + ], + [ + 48, + "store_temp>" + ], + [ + 49, + "jump" + ], + [ + 50, + "const_as_immediate>" + ], + [ + 51, + "struct_construct>" + ], + [ + 52, + "snapshot_take>" + ], + [ + 53, + "drop>" + ], + [ + 54, + "store_temp>" + ], + [ + 55, + "function_call, core::starknet::storage::StorablePathableStorageAsPointer::, core::starknet::storage::storage_base::StorageBaseAsPath::, core::starknet::storage::StorableStoragePathAsPointer::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::StorableStoragePointer0OffsetReadAccess::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read>" + ], + [ + 56, + "enum_match>" + ], + [ + 57, + "struct_deconstruct>" + ], + [ + 58, + "snapshot_take" + ], + [ + 59, + "drop" + ], + [ + 60, + "dup" + ], + [ + 61, + "struct_deconstruct" + ], + [ + 62, + "drop" + ], + [ + 63, + "rename" + ], + [ + 64, + "u128_to_felt252" + ], + [ + 65, + "enable_ap_tracking" + ], + [ + 66, + "unbox" + ], + [ + 67, + "rename" + ], + [ + 68, + "enum_init, 0>" + ], + [ + 69, + "store_temp>>" + ], + [ + 70, + "store_temp>" + ], + [ + 71, + "struct_construct" + ], + [ + 72, + "enum_init, 1>" + ], + [ + 73, + "enum_match>" + ], + [ + 74, + "contract_address_try_from_felt252" + ], + [ + 75, + "disable_ap_tracking" + ], + [ + 76, + "drop" + ], + [ + 77, + "store_temp" + ], + [ + 78, + "const_as_immediate>" + ], + [ + 79, + "struct_construct>>" + ], + [ + 80, + "snapshot_take>>" + ], + [ + 81, + "drop>>" + ], + [ + 82, + "struct_deconstruct>>" + ], + [ + 83, + "struct_construct" + ], + [ + 84, + "struct_construct>>" + ], + [ + 85, + "store_temp>>" + ], + [ + 86, + "store_temp" + ], + [ + 87, + "function_call, core::starknet::storage::map::EntryInfoImpl::, core::hash::into_felt252_based::HashImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read>" + ], + [ + 88, + "drop" + ], + [ + 89, + "const_as_immediate>" + ], + [ + 90, + "const_as_immediate>" + ], + [ + 91, + "struct_construct>>" + ], + [ + 92, + "snapshot_take>>" + ], + [ + 93, + "drop>>" + ], + [ + 94, + "struct_deconstruct>>" + ], + [ + 95, + "struct_construct>>" + ], + [ + 96, + "struct_construct>" + ], + [ + 97, + "store_temp>>" + ], + [ + 98, + "store_temp>" + ], + [ + 99, + "function_call, core::starknet::storage::map::EntryInfoImpl::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::integer::u256>, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize2::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress,), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize1::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleSize0Hash::, core::traits::TupleSize0Drop>, core::traits::TupleNextDrop::<(core::starknet::contract_address::ContractAddress,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::starknet::contract_address::ContractAddressDrop, core::traits::TupleSize0Drop>>, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read>" + ], + [ + 100, + "const_as_immediate>" + ], + [ + 101, + "enum_init>, 0>" + ], + [ + 102, + "store_temp>>" + ], + [ + 103, + "enum_init>, 1>" + ], + [ + 104, + "enum_match>>" + ], + [ + 105, + "u128s_from_felt252" + ], + [ + 106, + "struct_construct" + ], + [ + 107, + "enum_init, 0>" + ], + [ + 108, + "store_temp>" + ], + [ + 109, + "enum_init, 1>" + ], + [ + 110, + "rename" + ], + [ + 111, + "enum_match>" + ], + [ + 112, + "get_execution_info_v2_syscall" + ], + [ + 113, + "store_temp>" + ], + [ + 114, + "unbox" + ], + [ + 115, + "struct_deconstruct" + ], + [ + 116, + "drop>" + ], + [ + 117, + "drop>" + ], + [ + 118, + "drop" + ], + [ + 119, + "struct_construct" + ], + [ + 120, + "store_temp" + ], + [ + 121, + "function_call" + ], + [ + 122, + "enum_match>" + ], + [ + 123, + "drop>" + ], + [ + 124, + "struct_deconstruct>>" + ], + [ + 125, + "drop" + ], + [ + 126, + "dup" + ], + [ + 127, + "function_call" + ], + [ + 128, + "struct_deconstruct>" + ], + [ + 129, + "const_as_immediate>" + ], + [ + 130, + "function_call" + ], + [ + 131, + "function_call" + ], + [ + 132, + "function_call" + ], + [ + 133, + "drop" + ], + [ + 134, + "store_temp" + ], + [ + 135, + "function_call" + ], + [ + 136, + "const_as_immediate>" + ], + [ + 137, + "const_as_immediate>" + ], + [ + 138, + "struct_deconstruct>" + ], + [ + 139, + "storage_base_address_from_felt252" + ], + [ + 140, + "struct_construct>" + ], + [ + 141, + "snapshot_take>" + ], + [ + 142, + "drop>" + ], + [ + 143, + "struct_deconstruct>" + ], + [ + 144, + "dup" + ], + [ + 145, + "dup" + ], + [ + 146, + "const_as_immediate>" + ], + [ + 147, + "storage_address_from_base_and_offset" + ], + [ + 148, + "struct_construct>" + ], + [ + 149, + "enum_init, 0>" + ], + [ + 150, + "store_temp>" + ], + [ + 151, + "const_as_immediate>" + ], + [ + 152, + "drop" + ], + [ + 153, + "drop" + ], + [ + 154, + "enum_init, 1>" + ], + [ + 155, + "contract_address_to_felt252" + ], + [ + 156, + "struct_deconstruct>>" + ], + [ + 157, + "struct_deconstruct" + ], + [ + 158, + "pedersen" + ], + [ + 159, + "struct_deconstruct>" + ], + [ + 160, + "struct_deconstruct>>" + ], + [ + 161, + "felt252_is_zero" + ], + [ + 162, + "drop" + ], + [ + 163, + "const_as_immediate>" + ], + [ + 164, + "enum_init, 1>" + ], + [ + 165, + "store_temp>" + ], + [ + 166, + "drop>" + ], + [ + 167, + "const_as_immediate>" + ], + [ + 168, + "struct_construct>>>" + ], + [ + 169, + "snapshot_take>>>" + ], + [ + 170, + "drop>>>" + ], + [ + 171, + "struct_deconstruct>>>" + ], + [ + 172, + "struct_construct>>" + ], + [ + 173, + "snapshot_take>>" + ], + [ + 174, + "drop>>" + ], + [ + 175, + "struct_deconstruct>>" + ], + [ + 176, + "u128_overflowing_sub" + ], + [ + 177, + "enum_init" + ], + [ + 178, + "store_temp" + ], + [ + 179, + "store_temp" + ], + [ + 180, + "enum_init" + ], + [ + 181, + "const_as_immediate>" + ], + [ + 182, + "drop" + ], + [ + 183, + "enum_match" + ], + [ + 184, + "storage_write_syscall" + ], + [ + 185, + "u128_overflowing_add" + ], + [ + 186, + "struct_construct" + ], + [ + 187, + "enum_init" + ], + [ + 188, + "snapshot_take" + ], + [ + 189, + "drop" + ], + [ + 190, + "store_temp" + ], + [ + 191, + "function_call" + ], + [ + 192, + "emit_event_syscall" + ], + [ + 193, + "struct_construct>" + ], + [ + 194, + "enum_init, 0>" + ], + [ + 195, + "const_as_immediate>" + ], + [ + 196, + "rename" + ], + [ + 197, + "rename" + ], + [ + 198, + "rename>" + ], + [ + 199, + "const_as_immediate>" + ], + [ + 200, + "struct_construct>>>" + ], + [ + 201, + "snapshot_take>>>" + ], + [ + 202, + "drop>>>" + ], + [ + 203, + "struct_deconstruct>>>" + ], + [ + 204, + "const_as_immediate>" + ], + [ + 205, + "dup" + ], + [ + 206, + "u128_eq" + ], + [ + 207, + "const_as_immediate>" + ], + [ + 208, + "struct_construct" + ], + [ + 209, + "enum_init" + ], + [ + 210, + "const_as_immediate>" + ], + [ + 211, + "storage_base_address_const<603278275252936218847294002513349627170936020082667936993356353388973422646>" + ], + [ + 212, + "store_temp" + ], + [ + 213, + "contract_address_const<0>" + ], + [ + 214, + "enum_match" + ], + [ + 215, + "const_as_immediate>" + ], + [ + 216, + "dup" + ], + [ + 217, + "struct_deconstruct" + ], + [ + 218, + "rename" + ], + [ + 219, + "const_as_immediate>" + ], + [ + 220, + "dup" + ], + [ + 221, + "struct_deconstruct" + ] + ], + "user_func_names": [ + [ + 0, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__get_name" + ], + [ + 1, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__get_symbol" + ], + [ + 2, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__get_decimals" + ], + [ + 3, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__get_total_supply" + ], + [ + 4, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__balance_of" + ], + [ + 5, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__allowance" + ], + [ + 6, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__transfer" + ], + [ + 7, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__transfer_from" + ], + [ + 8, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__approve" + ], + [ + 9, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__increase_allowance" + ], + [ + 10, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__IERC20Impl__decrease_allowance" + ], + [ + 11, + "cairo_level_tests::contracts::erc20::erc_20::__wrapper__constructor" + ], + [ + 12, + "core::starknet::storage::StorablePointerReadAccessImpl::, core::starknet::storage::StorablePathableStorageAsPointer::, core::starknet::storage::storage_base::StorageBaseAsPath::, core::starknet::storage::StorableStoragePathAsPointer::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>, core::starknet::storage::StorableStoragePointer0OffsetReadAccess::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>>::read" + ], + [ + 13, + "core::starknet::storage::map::StorableEntryReadAccess::, core::starknet::storage::map::EntryInfoImpl::, core::hash::into_felt252_based::HashImpl::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read" + ], + [ + 14, + "core::starknet::storage::map::StorableEntryReadAccess::, core::starknet::storage::map::EntryInfoImpl::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::integer::u256>, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress, core::starknet::contract_address::ContractAddress), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize2::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleNextHash::<(core::starknet::contract_address::ContractAddress,), core::pedersen::HashState, core::pedersen::HashStateImpl, core::metaprogramming::TupleSplitTupleSize1::, core::hash::into_felt252_based::HashImpl::, core::hash::TupleSize0Hash::, core::traits::TupleSize0Drop>, core::traits::TupleNextDrop::<(core::starknet::contract_address::ContractAddress,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::starknet::contract_address::ContractAddressDrop, core::traits::TupleSize0Drop>>, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::, core::starknet::storage_access::StoreUsingPacking::<(core::integer::u128,), core::integer::u128, core::starknet::storage_access::StorePackingTuple1::, core::starknet::storage_access::StoreUsingPacking::>, core::integer::u128Drop, core::traits::TupleNextDrop::<(core::integer::u128,), core::metaprogramming::TupleSplitTupleSize1::, core::metaprogramming::IsTupleTupleSize1::, core::integer::u128Drop, core::traits::TupleSize0Drop>, core::metaprogramming::TupleSplitTupleSize1::>>>::read" + ], + [ + 15, + "cairo_level_tests::contracts::erc20::erc_20::StorageImpl::transfer_helper" + ], + [ + 16, + "cairo_level_tests::contracts::erc20::erc_20::StorageImpl::spend_allowance" + ], + [ + 17, + "cairo_level_tests::contracts::erc20::erc_20::StorageImpl::approve_helper" + ], + [ + 18, + "cairo_level_tests::contracts::erc20::erc_20::IERC20Impl::increase_allowance" + ], + [ + 19, + "cairo_level_tests::contracts::erc20::erc_20::IERC20Impl::decrease_allowance" + ], + [ + 20, + "cairo_level_tests::contracts::erc20::erc_20::constructor" + ], + [ + 21, + "cairo_level_tests::contracts::erc20::erc_20::EventIsEvent::append_keys_and_data" + ] + ] + }, + "contract_class_version": "0.1.0", + "entry_points_by_type": { + "EXTERNAL": [ + { + "selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", + "function_idx": 6 + }, + { + "selector": "0x16d9d5d83f8eecc5d7450519aad7e6e649be1a6c9d6df85bd0b177cc59a926a", + "function_idx": 2 + }, + { + "selector": "0x1d13ab0a76d7407b1d5faccd4b3d8a9efe42f3d3c21766431d4fafb30f45bd4", + "function_idx": 9 + }, + { + "selector": "0x1e888a1026b19c8c0b57c72d63ed1737106aa10034105b980ba117bd0c29fe1", + "function_idx": 5 + }, + { + "selector": "0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c", + "function_idx": 8 + }, + { + "selector": "0x2819e8b2b82ee4c56798709651ab9e8537f644c0823e42ba017efce4f2077e4", + "function_idx": 3 + }, + { + "selector": "0x31341177714d81ad9ccd0c903211bc056a60e8af988d0fd918cc43874549653", + "function_idx": 0 + }, + { + "selector": "0x351ccc9e7b13b17e701a7d4f5f85b525bac37b7648419fe194e6c15bc73da47", + "function_idx": 1 + }, + { + "selector": "0x35a73cd311a05d46deda634c5ee045db92f811b4e74bca4437fcb5302b7af33", + "function_idx": 4 + }, + { + "selector": "0x3704ffe8fba161be0e994951751a5033b1462b918ff785c0a636be718dfdb68", + "function_idx": 7 + }, + { + "selector": "0x3b076186c19fe96221e4dfacd40c519f612eae02e0555e4e115a2a6cf2f1c1f", + "function_idx": 10 + } + ], + "L1_HANDLER": [], + "CONSTRUCTOR": [ + { + "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", + "function_idx": 11 + } + ] + }, + "abi": [ + { + "type": "impl", + "name": "IERC20Impl", + "interface_name": "cairo_level_tests::contracts::erc20::IERC20" + }, + { + "type": "struct", + "name": "core::integer::u256", + "members": [ + { + "name": "low", + "type": "core::integer::u128" + }, + { + "name": "high", + "type": "core::integer::u128" + } + ] + }, + { + "type": "interface", + "name": "cairo_level_tests::contracts::erc20::IERC20", + "items": [ + { + "type": "function", + "name": "get_name", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_symbol", + "inputs": [], + "outputs": [ + { + "type": "core::felt252" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_decimals", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u8" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "get_total_supply", + "inputs": [], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "balance_of", + "inputs": [ + { + "name": "account", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "spender", + "type": "core::starknet::contract_address::ContractAddress" + } + ], + "outputs": [ + { + "type": "core::integer::u256" + } + ], + "state_mutability": "view" + }, + { + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u256" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "transfer_from", + "inputs": [ + { + "name": "sender", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u256" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "spender", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "amount", + "type": "core::integer::u256" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "increase_allowance", + "inputs": [ + { + "name": "spender", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "added_value", + "type": "core::integer::u256" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "decrease_allowance", + "inputs": [ + { + "name": "spender", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "subtracted_value", + "type": "core::integer::u256" + } + ], + "outputs": [], + "state_mutability": "external" + } + ] + }, + { + "type": "constructor", + "name": "constructor", + "inputs": [ + { + "name": "name_", + "type": "core::felt252" + }, + { + "name": "symbol_", + "type": "core::felt252" + }, + { + "name": "decimals_", + "type": "core::integer::u8" + }, + { + "name": "initial_supply", + "type": "core::integer::u256" + }, + { + "name": "recipient", + "type": "core::starknet::contract_address::ContractAddress" + } + ] + }, + { + "type": "event", + "name": "cairo_level_tests::contracts::erc20::erc_20::Transfer", + "kind": "struct", + "members": [ + { + "name": "from", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "to", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "value", + "type": "core::integer::u256", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "cairo_level_tests::contracts::erc20::erc_20::Approval", + "kind": "struct", + "members": [ + { + "name": "owner", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "spender", + "type": "core::starknet::contract_address::ContractAddress", + "kind": "data" + }, + { + "name": "value", + "type": "core::integer::u256", + "kind": "data" + } + ] + }, + { + "type": "event", + "name": "cairo_level_tests::contracts::erc20::erc_20::Event", + "kind": "enum", + "variants": [ + { + "name": "Transfer", + "type": "cairo_level_tests::contracts::erc20::erc_20::Transfer", + "kind": "nested" + }, + { + "name": "Approval", + "type": "cairo_level_tests::contracts::erc20::erc_20::Approval", + "kind": "nested" + } + ] + } + ] +} \ No newline at end of file diff --git a/crates/blockifier/feature_contracts/cairo1/account_faulty.cairo b/crates/blockifier/feature_contracts/cairo1/account_faulty.cairo index 136173de071..dda81581527 100644 --- a/crates/blockifier/feature_contracts/cairo1/account_faulty.cairo +++ b/crates/blockifier/feature_contracts/cairo1/account_faulty.cairo @@ -140,7 +140,7 @@ mod Account { return starknet::VALIDATED; } if (scenario == GET_BLOCK_HASH){ - let block_number: u64 = 0; + let block_number: u64 = 1992; get_block_hash_syscall(block_number).unwrap_syscall(); return starknet::VALIDATED; } diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/account_faulty.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/account_faulty.casm.json index fe5640a53c8..c629b1dbbe7 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/account_faulty.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/account_faulty.casm.json @@ -1,6 +1,6 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [ "0xa0680017fff8000", "0x7", @@ -8,32 +8,36 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x6c", + "0x73", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1a04", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x54", + "0x58", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -42,28 +46,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x7a9", + "0x84d", "0x482480017fff8000", - "0x7a8", - "0x480080007fff8000", + "0x84c", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff5", - "0x53ca", + "0x4824800180007ffd", + "0x7472", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff47fff", + "0x400080007ff17fff", "0x10780017fff7fff", - "0x21", - "0x4824800180007ff5", - "0x53ca", - "0x400080007ff57fff", - "0x482480017ff58000", + "0x22", + "0x4824800180007ffd", + "0x7472", + "0x400080007ff27fff", + "0x482480017ff28000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x437", + "0x492", "0x20680017fff7ffd", "0xe", "0x40780017fff7fff", @@ -79,7 +84,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0xc8", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -91,9 +97,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff28000", + "0x482480017fef8000", "0x1", - "0x48127ff07fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -106,8 +112,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x622", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -122,7 +129,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -136,57 +144,66 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xbe", + "0xd1", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1428", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa6", + "0xb6", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x90", - "0x482480017ffd8000", + "0x9e", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x7a", - "0x480080007ffd8000", - "0x482480017ffc8000", + "0x86", + "0x480080007ffc8000", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x20680017fff7ffd", - "0x6", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x20680017fff7ffc", + "0x7", + "0x48127fff7fff8000", "0x480680017fff8000", "0x1", "0x10780017fff7fff", - "0x4", + "0x6", + "0x482480017fff8000", + "0x64", "0x480680017fff8000", "0x0", - "0x48307ffd80007ffe", + "0x48307ffb80007ffc", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff17fff8000", - "0x48127fef7fff8000", + "0x48127fec7fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -195,53 +212,59 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x710", + "0x7a7", "0x482480017fff8000", - "0x70f", - "0x480080007fff8000", + "0x7a6", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fed", - "0x5d8e", + "0x4824800180007ffd", + "0x7a4e", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fec7fff", + "0x400080007fe67fff", "0x10780017fff7fff", - "0x3e", - "0x4824800180007fed", - "0x5d8e", - "0x400080007fed7fff", + "0x44", + "0x4824800180007ffd", + "0x7a4e", + "0x400080007fe77fff", "0x480680017fff8000", "0x1", - "0x48307ff780007fff", - "0x482480017feb8000", + "0x48307ff680007fff", + "0x482480017fe58000", "0x1", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", - "0x20680017fff7ffd", - "0x7", + "0x20680017fff7ffc", + "0x8", "0x480680017fff8000", "0x1", - "0x48307ffe80007fff", + "0x48127ffd7fff8000", + "0x48307ffd80007ffe", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", "0x1", - "0x48127ffe7fff8000", + "0x482480017ffd8000", + "0x5a", + "0x48127ffd7fff8000", "0x20680017fff7fff", - "0x9", - "0x48127ffc7fff8000", - "0x48127ff87fff8000", + "0xa", + "0x48127ffa7fff8000", + "0x482480017ffd8000", + "0x753a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x56414c4944", "0x10780017fff7fff", "0xd", - "0x48127ffc7fff8000", - "0x48127ff87fff8000", + "0x48127ffa7fff8000", + "0x48127ffd7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x385", + "0x3ce", "0x20680017fff7ffd", "0x12", "0x48127ffa7fff8000", @@ -261,7 +284,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x258", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -273,9 +297,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fea8000", + "0x482480017fe48000", "0x1", - "0x48127fe87fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -288,8 +312,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x816", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -302,8 +327,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0xa0a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -316,8 +342,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0xbfe", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -332,7 +359,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -346,17 +374,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x109", + "0x121", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x2a8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -364,7 +395,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -372,87 +404,95 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xde", + "0xf2", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xcc", + "0xdd", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xaf", - "0x482480017ff58000", + "0xbe", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x87", + "0x92", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x501", + "0x56e", "0x20680017fff7ffa", - "0x72", - "0x20680017fff7ffd", - "0x6c", - "0x48307ffb80007ffc", + "0x7c", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x74", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -461,49 +501,53 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x606", + "0x686", "0x482480017fff8000", - "0x605", - "0x480080007fff8000", + "0x685", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x9556", + "0x4824800180007ffd", + "0xa1c2", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x3c", - "0x4824800180007ff3", - "0x9556", - "0x400080007ff17fff", + "0x41", + "0x4824800180007ffd", + "0xa1c2", + "0x400080007fee7fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff08000", + "0x482480017fec8000", "0x1", "0x480680017fff8000", "0x53656e644d657373616765546f4c31", "0x400280007ffb7fff", "0x400280017ffb7ffc", "0x400280027ffb7ffd", - "0x400280037ffb7ff4", - "0x400280047ffb7ff5", + "0x400280037ffb7ff0", + "0x400280047ffb7ff1", "0x480280067ffb8000", "0x20680017fff7fff", - "0x1d", - "0x48127ffd7fff8000", + "0x1f", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0x7", "0x1104800180018000", - "0x286", + "0x2bb", "0x20680017fff7ffd", - "0xe", + "0xf", "0x40780017fff7fff", "0x1", "0x400080007fff7ffe", "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ff98000", + "0x190", "0x48127ff97fff8000", "0x480680017fff8000", "0x0", @@ -517,9 +561,11 @@ "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", + "0xa", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x7602", "0x482680017ffb8000", "0x9", "0x480280077ffb8000", @@ -537,9 +583,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -547,20 +593,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -580,8 +629,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1540", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -589,20 +639,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x1540", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1a5e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -617,7 +669,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -633,17 +686,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xf4", + "0x108", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -651,7 +707,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -659,89 +716,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc9", - "0x40137fff7fff8000", + "0xd9", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xb6", + "0xc3", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x99", - "0x400180007ff58001", - "0x482480017ff58000", + "0xa4", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x70", + "0x77", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x3e0", + "0x434", "0x20680017fff7ffa", - "0x5b", - "0x20680017fff7ffd", - "0x55", - "0x48307ffb80007ffc", + "0x61", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x59", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -750,32 +815,33 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4e5", + "0x54c", "0x482480017fff8000", - "0x4e4", - "0x480080007fff8000", + "0x54b", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x607c", + "0x4824800180007ffd", + "0x67d4", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x25", - "0x4824800180007ff3", - "0x607c", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x26", + "0x4824800180007ffd", + "0x67d4", + "0x400080007fee7fff", + "0x482480017fee8000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", - "0x480a80007fff8000", "0x480a80017fff8000", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x480a80007fff8000", + "0x48127fef7fff8000", + "0x48127fef7fff8000", "0x1104800180018000", - "0x40a", + "0x460", "0x20680017fff7ffd", "0xe", "0x40780017fff7fff", @@ -791,7 +857,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0xc8", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -803,9 +870,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -813,20 +880,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -846,8 +916,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -855,20 +926,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -883,7 +956,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -897,24 +971,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x45", + "0x4a", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -923,27 +1000,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x438", + "0x493", "0x482480017fff8000", - "0x437", - "0x480080007fff8000", + "0x492", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x10", - "0x4824800180007ff8", + "0x11", + "0x4824800180007ffd", "0x0", - "0x400080007ff87fff", + "0x400080007ff67fff", "0x40780017fff7fff", "0x1", - "0x482480017ff78000", + "0x482480017ff58000", "0x1", - "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x190", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -955,9 +1034,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -972,7 +1051,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -986,41 +1066,48 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x8d", + "0x9c", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1810", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x75", + "0x81", "0x480280007ffc8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x20680017fff7ffd", - "0x6", + "0x48127ffb7fff8000", + "0x20680017fff7ffc", + "0x7", + "0x48127fff7fff8000", "0x480680017fff8000", "0x1", "0x10780017fff7fff", - "0x4", + "0x6", + "0x482480017fff8000", + "0x64", "0x480680017fff8000", "0x0", - "0x48307ffd80007ffe", + "0x48307ffb80007ffc", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff77fff8000", - "0x48127ff57fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1029,51 +1116,57 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3ce", + "0x41f", "0x482480017fff8000", - "0x3cd", - "0x480080007fff8000", + "0x41e", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x59a6", + "0x4824800180007ffd", + "0x7986", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff27fff", + "0x400080007fee7fff", "0x10780017fff7fff", - "0x39", - "0x4824800180007ff3", - "0x59a6", - "0x400080007ff37fff", + "0x3f", + "0x4824800180007ffd", + "0x7986", + "0x400080007fef7fff", "0x480680017fff8000", "0x1", - "0x48307ff780007fff", - "0x482480017ff18000", + "0x48307ff680007fff", + "0x482480017fed8000", "0x1", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x1", - "0x20680017fff7ffd", - "0x7", + "0x20680017fff7ffc", + "0x8", "0x480680017fff8000", "0x1", - "0x48307ffe80007fff", + "0x48127ffd7fff8000", + "0x48307ffd80007ffe", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", "0x1", - "0x48127ffe7fff8000", + "0x482480017ffd8000", + "0x5a", + "0x48127ffd7fff8000", "0x20680017fff7fff", - "0x7", - "0x48127ffc7fff8000", - "0x48127ff87fff8000", + "0x8", + "0x48127ffa7fff8000", + "0x482480017ffd8000", + "0x753a", "0x480a7ffb7fff8000", "0x10780017fff7fff", "0xc", - "0x48127ffc7fff8000", - "0x48127ff87fff8000", + "0x48127ffa7fff8000", + "0x48127ffd7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x45", + "0x48", "0x20680017fff7ffd", "0xf", "0x48127ffa7fff8000", @@ -1090,7 +1183,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x190", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -1102,9 +1196,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff08000", + "0x482480017fec8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1117,8 +1211,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x816", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1133,7 +1228,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1147,29 +1243,32 @@ "0x400380017ffd7ffc", "0x480280037ffd8000", "0x20680017fff7fff", - "0x22f", + "0x25f", + "0x480280027ffd8000", "0x480280047ffd8000", "0x480080017fff8000", "0x480080037fff8000", "0x480080047ffe8000", - "0x480280027ffd8000", "0x482680017ffd8000", "0x5", + "0x48127ffa7fff8000", "0x480080037ffb8000", "0x480080047ffa8000", "0x48307ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x211", + "0x23f", "0x480080007ff98000", - "0x20680017fff7fff", - "0xe", + "0x48127ffb7fff8000", + "0x20680017fff7ffe", + "0xf", "0x40780017fff7fff", - "0x29", + "0x35", "0x480a7ffb7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fc98000", + "0x3ffc", + "0x48127fc27fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -1177,23 +1276,27 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", - "0x4824800180007fff", + "0x4824800180007ffe", "0x1", - "0x20680017fff7fff", - "0x24", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x27", "0x40780017fff7fff", - "0x24", + "0x2e", "0x480680017fff8000", "0x0", "0x4824800180007fff", "0x1", - "0x20680017fff7fff", - "0xe", + "0x482480017fcf8000", + "0x3c5a", + "0x20680017fff7ffe", + "0xf", "0x40780017fff7fff", "0x2", "0x480a7ffb7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017ffc8000", + "0xb4", + "0x48127fc27fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -1207,40 +1310,44 @@ "0x496e76616c6964207363656e6172696f", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x48127ffc7fff8000", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffe", + "0x4824800180007ffc", "0x2", - "0x20680017fff7fff", - "0x70", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x78", "0x40780017fff7fff", - "0x16", + "0x1c", "0x480680017fff8000", "0x1", - "0x48307fe380007fe4", + "0x482480017fe28000", + "0xa5a", + "0x48307fd980007fda", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffd", + "0x48307ffe80007ffc", "0x400280007ffb7fff", "0x10780017fff7fff", - "0x54", - "0x482480017ffd8000", + "0x59", + "0x482480017ffc8000", "0x1", "0x48307fff80007ffd", "0x400280007ffb7fff", - "0x48307ffb7fdf8000", + "0x48307ffa7fd58000", "0x40780017fff7fff", "0x1", "0x480080007ffe8000", + "0x48127ff87fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", @@ -1251,33 +1358,35 @@ "0xffffffffffffffeeffffffffffffffff", "0x400280037ffb7ffd", "0x10780017fff7fff", - "0x2d", + "0x30", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", + "0x48307fff80007ffc", "0x480280017ffb7ffd", "0x480280027ffb7ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", "0x400280037ffb7ffe", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d", "0x482680017ffb8000", "0x4", "0x480680017fff8000", "0x43616c6c436f6e7472616374", - "0x400080007fd37fff", - "0x400080017fd37fd2", - "0x400080027fd37ff7", - "0x400080037fd37ffd", - "0x400080047fd37ff6", - "0x400080057fd37ff6", - "0x480080077fd38000", + "0x400080007fc67fff", + "0x400080017fc67ffc", + "0x400080027fc67ff5", + "0x400080037fc67ffd", + "0x400080047fc67ff4", + "0x400080057fc67ff4", + "0x480080077fc68000", "0x20680017fff7fff", - "0xd", - "0x48127ffd7fff8000", - "0x480080067fd18000", - "0x482480017fd08000", + "0xe", + "0x480080067fc58000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0xa", "0x480680017fff8000", "0x0", @@ -1286,17 +1395,18 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", - "0x480080067fd18000", - "0x482480017fd08000", + "0x480080067fc58000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0xa", "0x480680017fff8000", "0x1", - "0x480080087fce8000", - "0x480080097fcd8000", + "0x480080087fc08000", + "0x480080097fbf8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1", + "0x3", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1304,8 +1414,9 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x4", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017ff38000", + "0x29ae", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1313,7 +1424,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xb", + "0xe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1321,33 +1432,38 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x1", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017feb8000", + "0x2f26", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffd", + "0x4824800180007ffa", "0x3", - "0x20680017fff7fff", - "0x22", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x26", "0x40780017fff7fff", - "0x23", + "0x2a", + "0x482480017fd58000", + "0x1252", "0x480680017fff8000", - "0x0", + "0x7c8", "0x480680017fff8000", "0x476574426c6f636b48617368", - "0x400080007fd37fff", - "0x400080017fd37fd2", - "0x400080027fd37ffe", - "0x480080047fd38000", + "0x400080007fc67fff", + "0x400080017fc67ffd", + "0x400080027fc67ffe", + "0x480080047fc68000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480080037fc58000", "0x480a7ffb7fff8000", - "0x480080037fd18000", - "0x482480017fd08000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0x6", "0x480680017fff8000", "0x0", @@ -1356,26 +1472,30 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", + "0x480080037fc58000", "0x480a7ffb7fff8000", - "0x480080037fd18000", - "0x482480017fd08000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0x7", "0x480680017fff8000", "0x1", - "0x480080057fce8000", - "0x480080067fcd8000", + "0x480080057fc08000", + "0x480080067fbf8000", "0x208b7fff7fff7ffe", - "0x4824800180007ffc", + "0x4824800180007ff8", "0x8", - "0x20680017fff7fff", - "0x6f", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x77", "0x40780017fff7fff", - "0x14", + "0x18", "0x480680017fff8000", "0xf", + "0x482480017fe68000", + "0x88e", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", @@ -1386,10 +1506,10 @@ "0xffffffffffffffeeffffffffffffffff", "0x400280027ffb7ffd", "0x10780017fff7fff", - "0x4c", + "0x51", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", + "0x48307fff80007ffc", "0x480280007ffb7ffd", "0x480280017ffb7ffd", "0x402480017ffc7ffe", @@ -1397,36 +1517,39 @@ "0x400280027ffb7ffe", "0x480680017fff8000", "0x1", - "0x48307fdd80007fde", + "0x48127ff97fff8000", + "0x48307fd280007fd3", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffd", + "0x48307ffe80007ffc", "0x400280037ffb7fff", "0x10780017fff7fff", - "0x2a", - "0x482480017ffd8000", + "0x2d", + "0x482480017ffc8000", "0x1", "0x48307fff80007ffd", "0x400280037ffb7fff", - "0x48307ffb7fd98000", + "0x48307ffa7fce8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", - "0x480080007ffe8000", + "0x480080007ffd8000", "0x482680017ffb8000", "0x4", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080007fd37fff", - "0x400080017fd37fd2", - "0x400080027fd37ffc", - "0x400080037fd37ff0", - "0x400080047fd37ffd", - "0x480080067fd38000", + "0x400080007fc67fff", + "0x400080017fc67ffb", + "0x400080027fc67ffc", + "0x400080037fc67fed", + "0x400080047fc67ffd", + "0x480080067fc68000", "0x20680017fff7fff", - "0xd", - "0x48127ffd7fff8000", - "0x480080057fd18000", - "0x482480017fd08000", + "0xe", + "0x480080057fc58000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0x7", "0x480680017fff8000", "0x0", @@ -1435,17 +1558,18 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", - "0x480080057fd18000", - "0x482480017fd08000", + "0x480080057fc58000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fc28000", "0x9", "0x480680017fff8000", "0x1", - "0x480080077fce8000", - "0x480080087fcd8000", + "0x480080077fc08000", + "0x480080087fbf8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1453,8 +1577,9 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x4", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017ff28000", + "0x2ab2", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1462,7 +1587,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x8", + "0xb", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1470,94 +1595,104 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x3", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017feb8000", + "0x2cc4", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffb", + "0x4824800180007ff6", "0x4", - "0x20680017fff7fff", - "0xc1", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xd0", "0x480680017fff8000", "0x1", - "0x48307ff680007ff7", + "0x48127ffe7fff8000", + "0x48307fef80007ff0", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffd", + "0x48307ffe80007ffc", "0x400280007ffb7fff", "0x10780017fff7fff", - "0xa7", - "0x482480017ffd8000", + "0xb4", + "0x482480017ffc8000", "0x1", "0x48307fff80007ffd", "0x400280007ffb7fff", - "0x48307ffb7ff28000", + "0x48307ffa7feb8000", "0x480680017fff8000", "0x2", - "0x480080007ffe8000", - "0x48307fef80007ff0", + "0x48127ff97fff8000", + "0x480080007ffd8000", + "0x48307fe780007fe8", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffc", + "0x48307ffe80007ffb", "0x400280017ffb7fff", "0x10780017fff7fff", - "0x87", - "0x482480017ffc8000", + "0x92", + "0x482480017ffb8000", "0x1", "0x48307fff80007ffd", "0x400280017ffb7fff", - "0x48307ffa7feb8000", + "0x48307ff97fe38000", "0x480680017fff8000", "0x3", - "0x480080007ffe8000", - "0x48307fe880007fe9", + "0x48127ff87fff8000", + "0x480080007ffd8000", + "0x48307fdf80007fe0", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffc", + "0x48307ffe80007ffb", "0x400280027ffb7fff", "0x10780017fff7fff", - "0x67", - "0x482480017ffc8000", + "0x70", + "0x482480017ffb8000", "0x1", "0x48307fff80007ffd", "0x400280027ffb7fff", - "0x48307ffa7fe48000", + "0x48307ff97fdb8000", + "0x48127ff97fff8000", "0x482680017ffb8000", "0x3", - "0x480080007ffe8000", + "0x480080007ffd8000", "0x480680017fff8000", "0x476574457865637574696f6e496e666f", - "0x400080007fdf7fff", - "0x400080017fdf7fde", - "0x480080037fdf8000", + "0x400080007fd47fff", + "0x400080017fd47ffc", + "0x480080037fd48000", "0x20680017fff7fff", - "0x4d", - "0x480080047fde8000", + "0x53", + "0x480080027fd38000", + "0x480080047fd28000", "0x480080007fff8000", "0x480080007fff8000", - "0x48307fec80007fff", - "0x480080027fda8000", - "0x482480017fd98000", + "0x48307fe980007fff", + "0x482480017fce8000", "0x5", + "0x48127ffa7fff8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x20680017fff7ffb", - "0x32", - "0x48307fee80007ffe", - "0x20680017fff7fff", - "0x1f", - "0x48307ff480007ffe", - "0x20680017fff7fff", - "0xe", + "0x36", + "0x48307fec80007ffe", + "0x48127ffc7fff8000", + "0x20680017fff7ffe", + "0x21", + "0x48307ff280007ffd", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xf", "0x40780017fff7fff", "0x2", - "0x48127ff07fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127fed7fff8000", + "0x482480017ffc8000", + "0xb4", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -1570,9 +1705,9 @@ "0x480680017fff8000", "0x53455155454e4345525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127fed7fff8000", + "0x48127ffc7fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1580,15 +1715,16 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1", + "0x2", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x424c4f434b5f54494d455354414d505f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127fed7fff8000", + "0x482480017ffa8000", + "0xb4", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1596,15 +1732,16 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2", + "0x4", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x424c4f434b5f4e554d4245525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127fed7fff8000", + "0x482480017ff68000", + "0x1cc", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1612,18 +1749,20 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xc", - "0x48127ff07fff8000", - "0x480080027fd18000", - "0x482480017fd08000", + "0xe", + "0x480080027fc58000", + "0x48127fed7fff8000", + "0x482480017ffe8000", + "0x618", + "0x482480017fc28000", "0x6", "0x480680017fff8000", "0x1", - "0x480080047fce8000", - "0x480080057fcd8000", + "0x480080047fc08000", + "0x480080057fbf8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x10", + "0x14", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1631,8 +1770,9 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x3", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fe48000", + "0x2fa8", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1640,7 +1780,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x17", + "0x1c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1648,8 +1788,9 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x2", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fdc8000", + "0x3322", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1657,7 +1798,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1e", + "0x24", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1665,8 +1806,9 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x1", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fd58000", + "0x369c", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1674,15 +1816,16 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x22", + "0x29", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x556e6b6e6f776e207363656e6172696f", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fd38000", + "0x396c", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1690,15 +1833,16 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x28", + "0x35", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", + "0x482480017fc48000", + "0x3f98", + "0x48127fc27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1706,9 +1850,11 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x33", - "0x480a7ffb7fff8000", + "0x40", "0x480280027ffd8000", + "0x480a7ffb7fff8000", + "0x482480017ffe8000", + "0x44a2", "0x482680017ffd8000", "0x6", "0x480680017fff8000", @@ -1719,19 +1865,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ff88000", - "0xfffffffffffffffffffffffffffff6be", + "0xfffffffffffffffffffffffffffff592", "0x400280007ff77fff", "0x10780017fff7fff", - "0x43", + "0x49", "0x4825800180007ff8", - "0x942", + "0xa6e", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xd", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xe", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0xad2", "0x480680017fff8000", "0x0", "0x480a7ff97fff8000", @@ -1741,11 +1889,13 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x48297ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ff98000", "0x1", "0x480a7ffa7fff8000", @@ -1753,7 +1903,8 @@ "0x0", "0x480280007ff98000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", @@ -1763,8 +1914,8 @@ "0x20680017fff7ffe", "0xf", "0x400280007ffc7fff", + "0x48127ff77fff8000", "0x48127ffa7fff8000", - "0x48127ff87fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x480a7ffb7fff8000", @@ -1773,10 +1924,11 @@ "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc9", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -1814,31 +1966,34 @@ "0x400380017ff97ff8", "0x480280037ff98000", "0x20680017fff7fff", - "0xb2", + "0xc0", + "0x480280027ff98000", "0x480280047ff98000", "0x480080017fff8000", "0x480080037fff8000", "0x480080047ffe8000", - "0x480280027ff98000", "0x482680017ff98000", "0x5", + "0x48127ffa7fff8000", "0x480080037ffb8000", "0x480080047ffa8000", "0x48307ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x94", + "0xa0", "0x480080007ff98000", "0x4824800180007fff", "0x8", - "0x20680017fff7fff", - "0x6d", + "0x48127ffa7fff8000", + "0x20680017fff7ffe", + "0x74", "0x480680017fff8000", "0xf", + "0x48127ffe7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", @@ -1849,10 +2004,10 @@ "0xffffffffffffffeeffffffffffffffff", "0x400280027ff77ffd", "0x10780017fff7fff", - "0x4c", + "0x51", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", + "0x48307fff80007ffc", "0x480280007ff77ffd", "0x480280017ff77ffd", "0x402480017ffc7ffe", @@ -1860,36 +2015,39 @@ "0x400280027ff77ffe", "0x480680017fff8000", "0x2", - "0x48307ff480007ff5", + "0x48127ff97fff8000", + "0x48307ff180007ff2", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffd", + "0x48307ffe80007ffc", "0x400280037ff77fff", "0x10780017fff7fff", - "0x2a", - "0x482480017ffd8000", + "0x2d", + "0x482480017ffc8000", "0x1", "0x48307fff80007ffd", "0x400280037ff77fff", - "0x48307ffb7ff08000", + "0x48307ffa7fed8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", - "0x480080007ffe8000", + "0x480080007ffd8000", "0x482680017ff78000", "0x4", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080007fea7fff", - "0x400080017fea7fe9", - "0x400080027fea7ffc", - "0x400080037fea7ff0", - "0x400080047fea7ffd", - "0x480080067fea8000", + "0x400080007fe57fff", + "0x400080017fe57ffb", + "0x400080027fe57ffc", + "0x400080037fe57fed", + "0x400080047fe57ffd", + "0x480080067fe58000", "0x20680017fff7fff", - "0xd", - "0x48127ffd7fff8000", - "0x480080057fe88000", - "0x482480017fe78000", + "0xe", + "0x480080057fe48000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fe18000", "0x7", "0x480680017fff8000", "0x0", @@ -1898,17 +2056,18 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", - "0x480080057fe88000", - "0x482480017fe78000", + "0x480080057fe48000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", + "0x482480017fe18000", "0x9", "0x480680017fff8000", "0x1", - "0x480080077fe58000", - "0x480080087fe48000", + "0x480080077fdf8000", + "0x480080087fde8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1916,8 +2075,9 @@ "0x400080007ffe7fff", "0x482680017ff78000", "0x4", - "0x48127fe77fff8000", - "0x48127fe77fff8000", + "0x482480017ff28000", + "0x2ab2", + "0x48127fe17fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1925,7 +2085,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x8", + "0xb", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1933,8 +2093,9 @@ "0x400080007ffe7fff", "0x482680017ff78000", "0x3", - "0x48127fe77fff8000", - "0x48127fe77fff8000", + "0x482480017feb8000", + "0x2cc4", + "0x48127fe17fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1942,22 +2103,25 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xe", + "0x10", + "0x482480017fef8000", + "0x780", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x53656e644d657373616765546f4c31", - "0x400080007fea7fff", - "0x400080017fea7fe9", - "0x400080027fea7ffe", - "0x400180037fea7ffc", - "0x400180047fea7ffd", - "0x480080067fea8000", + "0x400080007fe57fff", + "0x400080017fe57ffd", + "0x400080027fe57ffe", + "0x400180037fe57ffc", + "0x400180047fe57ffd", + "0x480080067fe58000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480080057fe48000", "0x480a7ff77fff8000", - "0x480080057fe88000", - "0x482480017fe78000", + "0x48127ffe7fff8000", + "0x482480017fe18000", "0x7", "0x480680017fff8000", "0x0", @@ -1966,25 +2130,27 @@ "0x480680017fff8000", "0x56414c4944", "0x208b7fff7fff7ffe", + "0x480080057fe48000", "0x480a7ff77fff8000", - "0x480080057fe88000", - "0x482480017fe78000", + "0x48127ffe7fff8000", + "0x482480017fe18000", "0x9", "0x480680017fff8000", "0x1", - "0x480080077fe58000", - "0x480080087fe48000", + "0x480080077fdf8000", + "0x480080087fde8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x11", + "0x16", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", "0x480a7ff77fff8000", - "0x48127fe77fff8000", - "0x48127fe77fff8000", + "0x482480017fe38000", + "0x32a0", + "0x48127fe17fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -1992,9 +2158,11 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1c", - "0x480a7ff77fff8000", + "0x21", "0x480280027ff98000", + "0x480a7ff77fff8000", + "0x482480017ffe8000", + "0x37aa", "0x482680017ff98000", "0x6", "0x480680017fff8000", @@ -2004,15 +2172,15 @@ "0x208b7fff7fff7ffe" ], "bytecode_segment_lengths": [ - 128, - 210, - 285, - 266, - 89, - 161, - 575, - 92, - 194 + 136, + 230, + 310, + 287, + 95, + 177, + 625, + 98, + 210 ], "hints": [ [ @@ -2038,7 +2206,7 @@ ] ], [ - 25, + 28, [ { "AllocSegment": { @@ -2051,17 +2219,17 @@ ] ], [ - 44, + 49, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x53ca" + "Immediate": "0x7472" }, "rhs": { "Deref": { "register": "AP", - "offset": -10 + "offset": -2 } }, "dst": { @@ -2073,7 +2241,7 @@ ] ], [ - 64, + 69, [ { "AllocSegment": { @@ -2086,7 +2254,7 @@ ] ], [ - 84, + 90, [ { "AllocSegment": { @@ -2099,7 +2267,7 @@ ] ], [ - 99, + 105, [ { "AllocSegment": { @@ -2112,7 +2280,7 @@ ] ], [ - 113, + 120, [ { "AllocSegment": { @@ -2125,7 +2293,7 @@ ] ], [ - 128, + 136, [ { "TestLessThanOrEqual": { @@ -2147,7 +2315,7 @@ ] ], [ - 178, + 194, [ { "AllocSegment": { @@ -2160,17 +2328,17 @@ ] ], [ - 197, + 215, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x5d8e" + "Immediate": "0x7a4e" }, "rhs": { "Deref": { "register": "AP", - "offset": -18 + "offset": -2 } }, "dst": { @@ -2182,7 +2350,7 @@ ] ], [ - 246, + 269, [ { "AllocSegment": { @@ -2195,7 +2363,7 @@ ] ], [ - 266, + 290, [ { "AllocSegment": { @@ -2208,7 +2376,7 @@ ] ], [ - 281, + 305, [ { "AllocSegment": { @@ -2221,7 +2389,7 @@ ] ], [ - 295, + 320, [ { "AllocSegment": { @@ -2234,7 +2402,7 @@ ] ], [ - 309, + 335, [ { "AllocSegment": { @@ -2247,7 +2415,7 @@ ] ], [ - 323, + 350, [ { "AllocSegment": { @@ -2260,7 +2428,7 @@ ] ], [ - 338, + 366, [ { "TestLessThanOrEqual": { @@ -2282,14 +2450,14 @@ ] ], [ - 371, + 404, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -2304,7 +2472,7 @@ ] ], [ - 375, + 408, [ { "LinearSplit": { @@ -2333,14 +2501,14 @@ ] ], [ - 385, + 418, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -2362,7 +2530,7 @@ ] ], [ - 424, + 461, [ { "AllocSegment": { @@ -2375,7 +2543,7 @@ ] ], [ - 444, + 483, [ { "AllocSegment": { @@ -2388,17 +2556,17 @@ ] ], [ - 463, + 504, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x9556" + "Immediate": "0xa1c2" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -2410,7 +2578,7 @@ ] ], [ - 486, + 528, [ { "SystemCall": { @@ -2425,7 +2593,7 @@ ] ], [ - 497, + 540, [ { "AllocSegment": { @@ -2438,7 +2606,7 @@ ] ], [ - 530, + 576, [ { "AllocSegment": { @@ -2451,7 +2619,7 @@ ] ], [ - 559, + 608, [ { "AllocSegment": { @@ -2464,7 +2632,7 @@ ] ], [ - 573, + 622, [ { "AllocSegment": { @@ -2477,7 +2645,7 @@ ] ], [ - 594, + 646, [ { "AllocSegment": { @@ -2490,7 +2658,7 @@ ] ], [ - 608, + 660, [ { "AllocSegment": { @@ -2503,7 +2671,7 @@ ] ], [ - 625, + 678, [ { "TestLessThanOrEqual": { @@ -2525,14 +2693,14 @@ ] ], [ - 659, + 717, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -2547,7 +2715,7 @@ ] ], [ - 663, + 721, [ { "LinearSplit": { @@ -2576,14 +2744,14 @@ ] ], [ - 673, + 731, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -2605,7 +2773,7 @@ ] ], [ - 713, + 775, [ { "AllocSegment": { @@ -2618,7 +2786,7 @@ ] ], [ - 733, + 797, [ { "AllocSegment": { @@ -2631,17 +2799,17 @@ ] ], [ - 752, + 818, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x607c" + "Immediate": "0x67d4" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -2653,7 +2821,7 @@ ] ], [ - 776, + 842, [ { "AllocSegment": { @@ -2666,7 +2834,7 @@ ] ], [ - 796, + 863, [ { "AllocSegment": { @@ -2679,7 +2847,7 @@ ] ], [ - 825, + 895, [ { "AllocSegment": { @@ -2692,7 +2860,7 @@ ] ], [ - 839, + 909, [ { "AllocSegment": { @@ -2705,7 +2873,7 @@ ] ], [ - 860, + 933, [ { "AllocSegment": { @@ -2718,7 +2886,7 @@ ] ], [ - 874, + 947, [ { "AllocSegment": { @@ -2731,7 +2899,7 @@ ] ], [ - 889, + 963, [ { "TestLessThanOrEqual": { @@ -2753,7 +2921,7 @@ ] ], [ - 906, + 982, [ { "AllocSegment": { @@ -2766,7 +2934,7 @@ ] ], [ - 925, + 1003, [ { "TestLessThanOrEqual": { @@ -2776,7 +2944,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -2788,7 +2956,7 @@ ] ], [ - 937, + 1015, [ { "AllocSegment": { @@ -2801,7 +2969,7 @@ ] ], [ - 948, + 1027, [ { "AllocSegment": { @@ -2814,7 +2982,7 @@ ] ], [ - 963, + 1042, [ { "AllocSegment": { @@ -2827,7 +2995,7 @@ ] ], [ - 978, + 1058, [ { "TestLessThanOrEqual": { @@ -2849,7 +3017,7 @@ ] ], [ - 1012, + 1098, [ { "AllocSegment": { @@ -2862,17 +3030,17 @@ ] ], [ - 1031, + 1119, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x59a6" + "Immediate": "0x7986" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -2884,7 +3052,7 @@ ] ], [ - 1077, + 1170, [ { "AllocSegment": { @@ -2897,7 +3065,7 @@ ] ], [ - 1095, + 1189, [ { "AllocSegment": { @@ -2910,7 +3078,7 @@ ] ], [ - 1110, + 1204, [ { "AllocSegment": { @@ -2923,7 +3091,7 @@ ] ], [ - 1124, + 1219, [ { "AllocSegment": { @@ -2936,7 +3104,7 @@ ] ], [ - 1143, + 1239, [ { "SystemCall": { @@ -2951,7 +3119,7 @@ ] ], [ - 1199, + 1302, [ { "AllocSegment": { @@ -2964,14 +3132,14 @@ ] ], [ - 1222, + 1328, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -2989,7 +3157,7 @@ ] ], [ - 1233, + 1339, [ { "AllocSegment": { @@ -3002,14 +3170,14 @@ ] ], [ - 1236, + 1343, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -3024,7 +3192,7 @@ ] ], [ - 1240, + 1347, [ { "LinearSplit": { @@ -3053,14 +3221,14 @@ ] ], [ - 1250, + 1357, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -3082,14 +3250,14 @@ ] ], [ - 1270, + 1378, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -45 + "offset": -58 } } } @@ -3097,7 +3265,7 @@ ] ], [ - 1295, + 1405, [ { "AllocSegment": { @@ -3110,7 +3278,7 @@ ] ], [ - 1312, + 1423, [ { "AllocSegment": { @@ -3123,14 +3291,14 @@ ] ], [ - 1340, + 1455, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -45 + "offset": -58 } } } @@ -3138,14 +3306,14 @@ ] ], [ - 1371, + 1491, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -3160,7 +3328,7 @@ ] ], [ - 1375, + 1495, [ { "LinearSplit": { @@ -3189,14 +3357,14 @@ ] ], [ - 1385, + 1505, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -3218,14 +3386,14 @@ ] ], [ - 1396, + 1517, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -3243,14 +3411,14 @@ ] ], [ - 1419, + 1541, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -45 + "offset": -58 } } } @@ -3258,7 +3426,7 @@ ] ], [ - 1444, + 1568, [ { "AllocSegment": { @@ -3271,7 +3439,7 @@ ] ], [ - 1461, + 1586, [ { "AllocSegment": { @@ -3284,14 +3452,14 @@ ] ], [ - 1483, + 1611, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -3309,14 +3477,14 @@ ] ], [ - 1498, + 1627, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -3 + "offset": -4 } }, "rhs": { @@ -3334,14 +3502,14 @@ ] ], [ - 1513, + 1643, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -3 + "offset": -4 } }, "rhs": { @@ -3359,14 +3527,14 @@ ] ], [ - 1531, + 1662, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -33 + "offset": -44 } } } @@ -3374,7 +3542,7 @@ ] ], [ - 1563, + 1698, [ { "AllocSegment": { @@ -3387,7 +3555,7 @@ ] ], [ - 1579, + 1714, [ { "AllocSegment": { @@ -3400,7 +3568,7 @@ ] ], [ - 1595, + 1731, [ { "AllocSegment": { @@ -3413,7 +3581,7 @@ ] ], [ - 1622, + 1761, [ { "AllocSegment": { @@ -3426,7 +3594,7 @@ ] ], [ - 1639, + 1779, [ { "AllocSegment": { @@ -3439,7 +3607,7 @@ ] ], [ - 1656, + 1797, [ { "AllocSegment": { @@ -3452,7 +3620,7 @@ ] ], [ - 1673, + 1815, [ { "AllocSegment": { @@ -3465,7 +3633,7 @@ ] ], [ - 1689, + 1832, [ { "AllocSegment": { @@ -3478,12 +3646,12 @@ ] ], [ - 1714, + 1860, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x942" + "Immediate": "0xa6e" }, "rhs": { "Deref": { @@ -3500,7 +3668,7 @@ ] ], [ - 1786, + 1938, [ { "AllocSegment": { @@ -3513,7 +3681,7 @@ ] ], [ - 1810, + 1962, [ { "SystemCall": { @@ -3528,14 +3696,14 @@ ] ], [ - 1834, + 1989, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -3550,7 +3718,7 @@ ] ], [ - 1838, + 1993, [ { "LinearSplit": { @@ -3579,14 +3747,14 @@ ] ], [ - 1848, + 2003, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -3608,14 +3776,14 @@ ] ], [ - 1859, + 2015, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -3633,14 +3801,14 @@ ] ], [ - 1882, + 2039, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -22 + "offset": -27 } } } @@ -3648,7 +3816,7 @@ ] ], [ - 1907, + 2066, [ { "AllocSegment": { @@ -3661,7 +3829,7 @@ ] ], [ - 1924, + 2084, [ { "AllocSegment": { @@ -3674,14 +3842,14 @@ ] ], [ - 1950, + 2113, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -22 + "offset": -27 } } } @@ -3689,7 +3857,7 @@ ] ], [ - 1975, + 2140, [ { "AllocSegment": { @@ -3706,21 +3874,21 @@ "EXTERNAL": [ { "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "offset": 623, + "offset": 676, "builtins": [ "range_check" ] }, { "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", - "offset": 338, + "offset": 366, "builtins": [ "range_check" ] }, { "selector": "0x1b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d", - "offset": 889, + "offset": 963, "builtins": [ "range_check" ] @@ -3734,7 +3902,7 @@ }, { "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", - "offset": 128, + "offset": 136, "builtins": [ "range_check" ] @@ -3744,7 +3912,7 @@ "CONSTRUCTOR": [ { "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", - "offset": 978, + "offset": 1058, "builtins": [ "range_check" ] diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/account_with_dummy_validate.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/account_with_dummy_validate.casm.json index fc52fe2b950..f9ac4569cf9 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/account_with_dummy_validate.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/account_with_dummy_validate.casm.json @@ -1,6 +1,6 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [ "0xa0680017fff8000", "0x7", @@ -8,40 +8,45 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x75", + "0x7e", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1810", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5d", + "0x63", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x47", - "0x482480017ffd8000", + "0x4b", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -50,30 +55,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x45d", + "0x4b9", "0x482480017fff8000", - "0x45c", - "0x480080007fff8000", + "0x4b8", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff2", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff17fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x14", - "0x4824800180007ff2", + "0x15", + "0x4824800180007ffd", "0x0", - "0x400080007ff27fff", + "0x400080007fee7fff", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x56414c4944", "0x400080007ffe7fff", - "0x482480017ff08000", + "0x482480017fec8000", "0x1", - "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -86,9 +93,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fef8000", + "0x482480017feb8000", "0x1", - "0x48127fed7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -101,8 +108,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x622", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -115,8 +123,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x816", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -131,7 +140,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -145,32 +155,36 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x5f", + "0x66", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1a04", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x47", + "0x4b", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -179,30 +193,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3dc", + "0x42f", "0x482480017fff8000", - "0x3db", - "0x480080007fff8000", + "0x42e", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff5", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff47fff", + "0x400080007ff17fff", "0x10780017fff7fff", - "0x14", - "0x4824800180007ff5", + "0x15", + "0x4824800180007ffd", "0x0", - "0x400080007ff57fff", + "0x400080007ff27fff", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x56414c4944", "0x400080007ffe7fff", - "0x482480017ff38000", + "0x482480017ff08000", "0x1", - "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -215,9 +231,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff28000", + "0x482480017fef8000", "0x1", - "0x48127ff07fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -230,8 +246,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x622", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -246,7 +263,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -260,17 +278,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xe1", + "0xf5", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x2a8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -278,7 +299,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -286,87 +308,95 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xb6", + "0xc6", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xa4", + "0xb1", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x87", - "0x482480017ff58000", + "0x92", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x5f", + "0x66", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x2d5", + "0x315", "0x20680017fff7ffa", - "0x4a", - "0x20680017fff7ffd", - "0x44", - "0x48307ffb80007ffc", + "0x50", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x48", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -375,30 +405,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x318", + "0x35b", "0x482480017fff8000", - "0x317", - "0x480080007fff8000", + "0x35a", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x14", - "0x4824800180007ff3", + "0x15", + "0x4824800180007ffd", "0x0", - "0x400080007ff17fff", + "0x400080007fee7fff", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x56414c4944", "0x400080007ffe7fff", - "0x482480017fef8000", + "0x482480017fec8000", "0x1", - "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -411,9 +443,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -421,20 +453,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -454,8 +489,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1540", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -463,20 +499,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x1540", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1a5e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -491,7 +529,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -507,17 +546,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x118", + "0x133", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -525,7 +567,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -533,89 +576,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xed", - "0x40137fff7fff8000", + "0x104", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xda", + "0xee", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xbd", - "0x400180007ff58001", - "0x482480017ff58000", + "0xcf", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x94", + "0xa2", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x1dc", + "0x207", "0x20680017fff7ffa", - "0x7f", - "0x20680017fff7ffd", - "0x79", - "0x48307ffb80007ffc", + "0x8c", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x84", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -624,23 +675,25 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x21f", + "0x24d", "0x482480017fff8000", - "0x21e", - "0x480080007fff8000", + "0x24c", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x4efc", + "0x4824800180007ffd", + "0x558c", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x49", - "0x4824800180007ff3", - "0x4efc", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x51", + "0x4824800180007ffd", + "0x558c", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x476574457865637574696f6e496e666f", @@ -648,59 +701,66 @@ "0x400280017ffb7ffd", "0x480280037ffb8000", "0x20680017fff7fff", - "0x34", + "0x39", + "0x480280027ffb8000", "0x480280047ffb8000", "0x480080027fff8000", - "0x480280027ffb8000", "0x482680017ffb8000", "0x5", + "0x48127ffc7fff8000", "0x20680017fff7ffd", - "0x1f", + "0x22", + "0x48127fff7fff8000", "0x480680017fff8000", "0x43616c6c436f6e7472616374", - "0x400080007ffe7fff", - "0x400080017ffe7ffd", - "0x400180027ffe8000", - "0x400180037ffe8001", - "0x400080047ffe7fef", - "0x400080057ffe7ff0", - "0x480080077ffe8000", + "0x400080007ffc7fff", + "0x400080017ffc7ffe", + "0x400180027ffc8001", + "0x400180037ffc8000", + "0x400080047ffc7fe9", + "0x400080057ffc7fea", + "0x480080077ffc8000", "0x20680017fff7fff", - "0xb", - "0x48127ff77fff8000", - "0x480080067ffc8000", - "0x482480017ffb8000", + "0xc", + "0x480080067ffb8000", + "0x48127ff47fff8000", + "0x48127ffe7fff8000", + "0x482480017ff88000", "0xa", "0x480680017fff8000", "0x0", - "0x480080087ff98000", - "0x480080097ff88000", + "0x480080087ff68000", + "0x480080097ff58000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x480080067ffc8000", - "0x482480017ffb8000", + "0x480080067ffb8000", + "0x48127ff47fff8000", + "0x48127ffe7fff8000", + "0x482480017ff88000", "0xa", "0x480680017fff8000", "0x1", - "0x480080087ff98000", - "0x480080097ff88000", + "0x480080087ff68000", + "0x480080097ff58000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x494e56414c49445f43414c4c4552", "0x400080007ffe7fff", - "0x48127ff77fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x48127ff67fff8000", + "0x482480017ffc8000", + "0x2a30", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280027ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x2d50", "0x482680017ffb8000", "0x6", "0x480680017fff8000", @@ -713,9 +773,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -723,20 +783,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -756,8 +819,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -765,20 +829,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -793,7 +859,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -809,17 +876,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xfb", + "0x112", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -827,7 +897,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -835,89 +906,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xd0", - "0x40137fff7fff8001", + "0xe3", + "0x40137fff7fff8000", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048001", + "0x4825800180048000", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xbd", + "0xcd", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008001", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008000", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa0", - "0x400180007ff58000", - "0x482480017ff58000", + "0xae", + "0x400180007ff38001", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x77", + "0x81", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0xae", + "0xbd", "0x20680017fff7ffa", - "0x62", - "0x20680017fff7ffd", - "0x5c", - "0x48307ffb80007ffc", + "0x6b", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x63", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -926,44 +1005,47 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0xf1", + "0x103", "0x482480017fff8000", - "0xf0", - "0x480080007fff8000", + "0x102", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x25f8", + "0x4824800180007ffd", + "0x2bc0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x2c", - "0x4824800180007ff3", - "0x25f8", - "0x400080007ff17fff", + "0x30", + "0x4824800180007ffd", + "0x2bc0", + "0x400080007fee7fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff08000", + "0x482480017fec8000", "0x1", "0x480680017fff8000", "0x4465706c6f79", "0x400280007ffb7fff", "0x400280017ffb7ffc", - "0x400380027ffb8001", - "0x400380037ffb8000", - "0x400280047ffb7ff4", - "0x400280057ffb7ff5", + "0x400380027ffb8000", + "0x400380037ffb8001", + "0x400280047ffb7ff0", + "0x400280057ffb7ff1", "0x400280067ffb7ffd", "0x480280087ffb8000", "0x20680017fff7fff", - "0x10", + "0x11", + "0x480280077ffb8000", "0x40780017fff7fff", "0x1", "0x480280097ffb8000", "0x400080007ffe7fff", - "0x48127ffb7fff8000", - "0x480280077ffb8000", + "0x48127ffa7fff8000", + "0x48127ffc7fff8000", "0x482680017ffb8000", "0xc", "0x480680017fff8000", @@ -972,8 +1054,10 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280077ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x12c", "0x482680017ffb8000", "0xb", "0x480680017fff8000", @@ -986,9 +1070,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -996,20 +1080,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1029,8 +1116,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1038,20 +1126,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1066,7 +1156,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1077,19 +1168,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ff88000", - "0xfffffffffffffffffffffffffffff6be", + "0xfffffffffffffffffffffffffffff592", "0x400280007ff77fff", "0x10780017fff7fff", - "0x43", + "0x49", "0x4825800180007ff8", - "0x942", + "0xa6e", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xd", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xe", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0xad2", "0x480680017fff8000", "0x0", "0x480a7ff97fff8000", @@ -1099,11 +1192,13 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x48297ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ff98000", "0x1", "0x480a7ffa7fff8000", @@ -1111,7 +1206,8 @@ "0x0", "0x480280007ff98000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", @@ -1121,8 +1217,8 @@ "0x20680017fff7ffe", "0xf", "0x400280007ffc7fff", + "0x48127ff77fff8000", "0x48127ffa7fff8000", - "0x48127ff87fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x480a7ffb7fff8000", @@ -1131,10 +1227,11 @@ "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc9", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -1168,12 +1265,12 @@ "0x208b7fff7fff7ffe" ], "bytecode_segment_lengths": [ - 137, - 115, - 245, - 302, - 273, - 92 + 147, + 123, + 266, + 330, + 297, + 98 ], "hints": [ [ @@ -1199,7 +1296,7 @@ ] ], [ - 33, + 37, [ { "AllocSegment": { @@ -1212,7 +1309,7 @@ ] ], [ - 52, + 58, [ { "TestLessThanOrEqual": { @@ -1222,7 +1319,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -13 + "offset": -2 } }, "dst": { @@ -1234,7 +1331,7 @@ ] ], [ - 64, + 70, [ { "AllocSegment": { @@ -1247,7 +1344,7 @@ ] ], [ - 79, + 86, [ { "AllocSegment": { @@ -1260,7 +1357,7 @@ ] ], [ - 94, + 101, [ { "AllocSegment": { @@ -1273,7 +1370,7 @@ ] ], [ - 108, + 116, [ { "AllocSegment": { @@ -1286,7 +1383,7 @@ ] ], [ - 122, + 131, [ { "AllocSegment": { @@ -1299,7 +1396,7 @@ ] ], [ - 137, + 147, [ { "TestLessThanOrEqual": { @@ -1321,7 +1418,7 @@ ] ], [ - 162, + 175, [ { "AllocSegment": { @@ -1334,7 +1431,7 @@ ] ], [ - 181, + 196, [ { "TestLessThanOrEqual": { @@ -1344,7 +1441,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -10 + "offset": -2 } }, "dst": { @@ -1356,7 +1453,7 @@ ] ], [ - 193, + 208, [ { "AllocSegment": { @@ -1369,7 +1466,7 @@ ] ], [ - 208, + 224, [ { "AllocSegment": { @@ -1382,7 +1479,7 @@ ] ], [ - 223, + 239, [ { "AllocSegment": { @@ -1395,7 +1492,7 @@ ] ], [ - 237, + 254, [ { "AllocSegment": { @@ -1408,7 +1505,7 @@ ] ], [ - 252, + 270, [ { "TestLessThanOrEqual": { @@ -1430,14 +1527,14 @@ ] ], [ - 285, + 308, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -1452,7 +1549,7 @@ ] ], [ - 289, + 312, [ { "LinearSplit": { @@ -1481,14 +1578,14 @@ ] ], [ - 299, + 322, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -1510,7 +1607,7 @@ ] ], [ - 338, + 365, [ { "AllocSegment": { @@ -1523,7 +1620,7 @@ ] ], [ - 358, + 387, [ { "AllocSegment": { @@ -1536,7 +1633,7 @@ ] ], [ - 377, + 408, [ { "TestLessThanOrEqual": { @@ -1546,7 +1643,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -1558,7 +1655,7 @@ ] ], [ - 389, + 420, [ { "AllocSegment": { @@ -1571,7 +1668,7 @@ ] ], [ - 404, + 436, [ { "AllocSegment": { @@ -1584,7 +1681,7 @@ ] ], [ - 433, + 468, [ { "AllocSegment": { @@ -1597,7 +1694,7 @@ ] ], [ - 447, + 482, [ { "AllocSegment": { @@ -1610,7 +1707,7 @@ ] ], [ - 468, + 506, [ { "AllocSegment": { @@ -1623,7 +1720,7 @@ ] ], [ - 482, + 520, [ { "AllocSegment": { @@ -1636,7 +1733,7 @@ ] ], [ - 499, + 538, [ { "TestLessThanOrEqual": { @@ -1658,14 +1755,14 @@ ] ], [ - 533, + 577, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -1680,7 +1777,7 @@ ] ], [ - 537, + 581, [ { "LinearSplit": { @@ -1709,14 +1806,14 @@ ] ], [ - 547, + 591, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -1738,7 +1835,7 @@ ] ], [ - 587, + 635, [ { "AllocSegment": { @@ -1751,7 +1848,7 @@ ] ], [ - 607, + 657, [ { "AllocSegment": { @@ -1764,17 +1861,17 @@ ] ], [ - 626, + 678, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x4efc" + "Immediate": "0x558c" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -1786,7 +1883,7 @@ ] ], [ - 644, + 697, [ { "SystemCall": { @@ -1801,14 +1898,14 @@ ] ], [ - 662, + 717, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } } } @@ -1816,7 +1913,7 @@ ] ], [ - 683, + 740, [ { "AllocSegment": { @@ -1829,7 +1926,7 @@ ] ], [ - 706, + 766, [ { "AllocSegment": { @@ -1842,7 +1939,7 @@ ] ], [ - 735, + 798, [ { "AllocSegment": { @@ -1855,7 +1952,7 @@ ] ], [ - 749, + 812, [ { "AllocSegment": { @@ -1868,7 +1965,7 @@ ] ], [ - 770, + 836, [ { "AllocSegment": { @@ -1881,7 +1978,7 @@ ] ], [ - 784, + 850, [ { "AllocSegment": { @@ -1894,7 +1991,7 @@ ] ], [ - 801, + 868, [ { "TestLessThanOrEqual": { @@ -1916,14 +2013,14 @@ ] ], [ - 835, + 907, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 1 + "offset": 0 } }, "rhs": { @@ -1938,7 +2035,7 @@ ] ], [ - 839, + 911, [ { "LinearSplit": { @@ -1967,14 +2064,14 @@ ] ], [ - 849, + 921, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 1 + "offset": 0 } }, "scalar": { @@ -1996,7 +2093,7 @@ ] ], [ - 889, + 965, [ { "AllocSegment": { @@ -2009,7 +2106,7 @@ ] ], [ - 909, + 987, [ { "AllocSegment": { @@ -2022,17 +2119,17 @@ ] ], [ - 928, + 1008, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x25f8" + "Immediate": "0x2bc0" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -2044,7 +2141,7 @@ ] ], [ - 953, + 1034, [ { "SystemCall": { @@ -2059,7 +2156,7 @@ ] ], [ - 956, + 1038, [ { "AllocSegment": { @@ -2072,7 +2169,7 @@ ] ], [ - 979, + 1063, [ { "AllocSegment": { @@ -2085,7 +2182,7 @@ ] ], [ - 1008, + 1095, [ { "AllocSegment": { @@ -2098,7 +2195,7 @@ ] ], [ - 1022, + 1109, [ { "AllocSegment": { @@ -2111,7 +2208,7 @@ ] ], [ - 1043, + 1133, [ { "AllocSegment": { @@ -2124,7 +2221,7 @@ ] ], [ - 1057, + 1147, [ { "AllocSegment": { @@ -2137,12 +2234,12 @@ ] ], [ - 1072, + 1163, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x942" + "Immediate": "0xa6e" }, "rhs": { "Deref": { @@ -2159,7 +2256,7 @@ ] ], [ - 1144, + 1241, [ { "AllocSegment": { @@ -2176,28 +2273,28 @@ "EXTERNAL": [ { "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "offset": 497, + "offset": 536, "builtins": [ "range_check" ] }, { "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", - "offset": 252, + "offset": 270, "builtins": [ "range_check" ] }, { "selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", - "offset": 799, + "offset": 866, "builtins": [ "range_check" ] }, { "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", - "offset": 137, + "offset": 147, "builtins": [ "range_check" ] diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/account_with_long_validate.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/account_with_long_validate.casm.json index fc2260526e3..e47854b87e3 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/account_with_long_validate.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/account_with_long_validate.casm.json @@ -1,6 +1,6 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [ "0xa0680017fff8000", "0x7", @@ -8,57 +8,64 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xbb", + "0xca", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x13c4", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa3", + "0xaf", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8d", - "0x482480017ffd8000", + "0x97", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x77", - "0x482480017ffd8000", + "0x7f", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x480080007ffb8000", - "0x48307ffd80007ffe", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480080007ff98000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x60", - "0x482480017ffc8000", + "0x66", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x48307ffe80007fff", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127fef7fff8000", - "0x48127fed7fff8000", + "0x48127fea7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -67,36 +74,39 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x487", + "0x4e1", "0x482480017fff8000", - "0x486", - "0x480080007fff8000", + "0x4e0", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007feb", - "0x0", + "0x4824800180007ffd", + "0x87a", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fea7fff", + "0x400080007fe47fff", "0x10780017fff7fff", - "0x2d", - "0x4824800180007feb", - "0x0", - "0x400080007feb7fff", - "0x482480017feb8000", + "0x30", + "0x4824800180007ffd", + "0x87a", + "0x400080007fe57fff", + "0x482480017fe58000", "0x1", - "0x20680017fff7ff4", - "0x6", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x20680017fff7ff1", + "0x7", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0x6ea", "0x10780017fff7fff", "0xc", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x989680", "0x1104800180018000", - "0x3e2", + "0x431", "0x20680017fff7ffd", "0x12", "0x48127ffb7fff8000", @@ -116,7 +126,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1f4", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -128,9 +139,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fe88000", + "0x482480017fe28000", "0x1", - "0x48127fe67fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -143,8 +154,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127ff27fff8000", - "0x48127ff07fff8000", + "0x48127fee7fff8000", + "0x482480017ffa8000", + "0x622", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -157,8 +169,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x87a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -171,8 +184,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0xa6e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -185,8 +199,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0xc62", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -201,7 +216,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -215,32 +231,36 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x6f", + "0x76", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1a04", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x57", + "0x5b", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -249,29 +269,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3d1", + "0x41e", "0x482480017fff8000", - "0x3d0", - "0x480080007fff8000", + "0x41d", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff5", - "0x0", + "0x4824800180007ffd", + "0x686", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff47fff", + "0x400080007ff17fff", "0x10780017fff7fff", - "0x24", - "0x4824800180007ff5", - "0x0", - "0x400080007ff57fff", - "0x482480017ff58000", + "0x25", + "0x4824800180007ffd", + "0x686", + "0x400080007ff27fff", + "0x482480017ff28000", "0x1", "0x48127ffe7fff8000", "0x480680017fff8000", "0x989680", "0x1104800180018000", - "0x333", + "0x377", "0x20680017fff7ffd", "0x10", "0x40780017fff7fff", @@ -289,7 +310,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x12c", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -301,9 +323,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff28000", + "0x482480017fef8000", "0x1", - "0x48127ff07fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -316,8 +338,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x622", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -332,7 +355,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -346,17 +370,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x106", + "0x11c", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x2a8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -364,7 +391,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -372,87 +400,95 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xdb", + "0xed", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xc9", + "0xd8", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xac", - "0x482480017ff58000", + "0xb9", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x84", + "0x8d", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x2ba", + "0x2f4", "0x20680017fff7ffa", + "0x77", + "0x48127ff97fff8000", + "0x20680017fff7ffc", "0x6f", - "0x20680017fff7ffd", - "0x69", - "0x48307ffb80007ffc", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -461,43 +497,46 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x2fd", + "0x33a", "0x482480017fff8000", - "0x2fc", - "0x480080007fff8000", + "0x339", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x24e", + "0x4824800180007ffd", + "0x8de", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x39", - "0x4824800180007ff3", - "0x24e", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x3c", + "0x4824800180007ffd", + "0x8de", + "0x400080007fee7fff", + "0x482480017fee8000", "0x1", - "0x48307ff680007ff7", + "0x48127ffe7fff8000", + "0x48307ff280007ff3", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x1d", - "0x48127ffe7fff8000", - "0x48127ffc7fff8000", - "0x480080007ff38000", + "0x1e", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", + "0x480080007fef8000", "0x1104800180018000", - "0x25a", + "0x28d", "0x20680017fff7ffd", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x56414c4944", "0x400080007ffe7fff", "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ff98000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -510,14 +549,15 @@ "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x10780017fff7fff", - "0xc", + "0xd", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x622", "0x48127ffc7fff8000", "0x482480017ffb8000", "0x1", @@ -534,9 +574,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -544,20 +584,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -577,8 +620,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1540", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -586,20 +630,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x1540", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1a5e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -614,7 +660,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -630,17 +677,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x11e", + "0x13a", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -648,7 +698,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -656,89 +707,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xf3", - "0x40137fff7fff8000", + "0x10b", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xe0", + "0xf5", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xc3", - "0x400180007ff58001", - "0x482480017ff58000", + "0xd6", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x9a", + "0xa9", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x19c", + "0x1bf", "0x20680017fff7ffa", - "0x85", - "0x20680017fff7ffd", - "0x7f", - "0x48307ffb80007ffc", + "0x93", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x8b", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -747,23 +806,25 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x1df", + "0x205", "0x482480017fff8000", - "0x1de", - "0x480080007fff8000", + "0x204", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x5028", + "0x4824800180007ffd", + "0x56b8", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x4f", - "0x4824800180007ff3", - "0x5028", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x58", + "0x4824800180007ffd", + "0x56b8", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x476574457865637574696f6e496e666f", @@ -771,42 +832,47 @@ "0x400280017ffb7ffd", "0x480280037ffb8000", "0x20680017fff7fff", - "0x3a", + "0x40", + "0x480280027ffb8000", "0x480280047ffb8000", "0x480080027fff8000", - "0x480280027ffb8000", "0x482680017ffb8000", "0x5", + "0x48127ffc7fff8000", "0x20680017fff7ffd", - "0x25", + "0x29", + "0x48127fff7fff8000", "0x480680017fff8000", "0x43616c6c436f6e7472616374", - "0x400080007ffe7fff", - "0x400080017ffe7ffd", - "0x400180027ffe8000", - "0x400180037ffe8001", - "0x400080047ffe7fef", - "0x400080057ffe7ff0", - "0x480080077ffe8000", + "0x400080007ffc7fff", + "0x400080017ffc7ffe", + "0x400180027ffc8001", + "0x400180037ffc8000", + "0x400080047ffc7fe9", + "0x400080057ffc7fea", + "0x480080077ffc8000", "0x20680017fff7fff", - "0xb", - "0x48127ff77fff8000", - "0x480080067ffc8000", - "0x482480017ffb8000", + "0xd", + "0x480080067ffb8000", + "0x48127ff47fff8000", + "0x482480017ffe8000", + "0x12c", + "0x482480017ff88000", "0xa", "0x480680017fff8000", "0x0", - "0x480080087ff98000", - "0x480080097ff88000", + "0x480080087ff68000", + "0x480080097ff58000", "0x208b7fff7fff7ffe", + "0x480080067ffb8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x526573756c743a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x480080067ffa8000", - "0x482480017ff98000", + "0x48127ff27fff8000", + "0x48127ffc7fff8000", + "0x482480017ff68000", "0xa", "0x480680017fff8000", "0x1", @@ -819,17 +885,20 @@ "0x480680017fff8000", "0x494e56414c49445f43414c4c4552", "0x400080007ffe7fff", - "0x48127ff77fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x48127ff67fff8000", + "0x482480017ffc8000", + "0x2b5c", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280027ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x2e7c", "0x482680017ffb8000", "0x6", "0x480680017fff8000", @@ -842,9 +911,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -852,20 +921,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -885,8 +957,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -894,20 +967,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -922,7 +997,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -936,41 +1012,46 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x8b", + "0x97", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17ac", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x73", + "0x7c", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5d", - "0x482480017ffd8000", + "0x64", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x480080007ffb8000", - "0x48307ffd80007ffe", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480080007ff98000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff37fff8000", + "0x48127ff27fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -979,27 +1060,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0xf7", + "0x107", "0x482480017fff8000", - "0xf6", - "0x480080007fff8000", + "0x106", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff1", - "0x1090", + "0x4824800180007ffd", + "0x2a94", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fec7fff", "0x10780017fff7fff", - "0x29", - "0x4824800180007ff1", - "0x1090", - "0x400080007ff17fff", + "0x2d", + "0x4824800180007ffd", + "0x2a94", + "0x400080007fed7fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x38077b29e57bba3aa860b08652a77bd1076d0f70e38f019ba9920b820cf78f6", - "0x482480017fef8000", + "0x482480017fea8000", "0x1", "0x480680017fff8000", "0x53746f726167655772697465", @@ -1007,14 +1090,15 @@ "0x400280017ffb7ffb", "0x400280027ffb7ffc", "0x400280037ffb7ffd", - "0x400280047ffb7ff4", + "0x400280047ffb7ff2", "0x480280067ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280057ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280057ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -1022,8 +1106,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0x9", "0x480680017fff8000", @@ -1036,9 +1122,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017fea8000", "0x1", - "0x48127fec7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1051,8 +1137,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1065,8 +1152,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x87a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1081,7 +1169,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1092,19 +1181,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ffc8000", - "0xfffffffffffffffffffffffffffffbd2", + "0xfffffffffffffffffffffffffffffb6e", "0x400280007ffb7fff", "0x10780017fff7fff", - "0x19", + "0x1b", "0x4825800180007ffc", - "0x42e", + "0x492", "0x400280007ffb7fff", "0x482680017ffb8000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xb", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xc", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0x4f6", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -1112,12 +1203,12 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", @@ -1136,19 +1227,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ff88000", - "0xfffffffffffffffffffffffffffff6be", + "0xfffffffffffffffffffffffffffff592", "0x400280007ff77fff", "0x10780017fff7fff", - "0x43", + "0x49", "0x4825800180007ff8", - "0x942", + "0xa6e", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xd", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xe", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0xad2", "0x480680017fff8000", "0x0", "0x480a7ff97fff8000", @@ -1158,11 +1251,13 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x48297ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ff98000", "0x1", "0x480a7ffa7fff8000", @@ -1170,7 +1265,8 @@ "0x0", "0x480280007ff98000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", @@ -1180,8 +1276,8 @@ "0x20680017fff7ffe", "0xf", "0x400280007ffc7fff", + "0x48127ff77fff8000", "0x48127ffa7fff8000", - "0x48127ff87fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x480a7ffb7fff8000", @@ -1190,10 +1286,11 @@ "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc9", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -1227,13 +1324,13 @@ "0x208b7fff7fff7ffe" ], "bytecode_segment_lengths": [ - 207, - 131, - 282, - 308, - 159, - 44, - 92 + 223, + 139, + 305, + 337, + 172, + 46, + 98 ], "hints": [ [ @@ -1259,7 +1356,7 @@ ] ], [ - 50, + 56, [ { "AllocSegment": { @@ -1272,17 +1369,17 @@ ] ], [ - 69, + 77, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x87a" }, "rhs": { "Deref": { "register": "AP", - "offset": -20 + "offset": -2 } }, "dst": { @@ -1294,7 +1391,7 @@ ] ], [ - 99, + 109, [ { "AllocSegment": { @@ -1307,7 +1404,7 @@ ] ], [ - 121, + 132, [ { "AllocSegment": { @@ -1320,7 +1417,7 @@ ] ], [ - 136, + 147, [ { "AllocSegment": { @@ -1333,7 +1430,7 @@ ] ], [ - 150, + 162, [ { "AllocSegment": { @@ -1346,7 +1443,7 @@ ] ], [ - 164, + 177, [ { "AllocSegment": { @@ -1359,7 +1456,7 @@ ] ], [ - 178, + 192, [ { "AllocSegment": { @@ -1372,7 +1469,7 @@ ] ], [ - 192, + 207, [ { "AllocSegment": { @@ -1385,7 +1482,7 @@ ] ], [ - 207, + 223, [ { "TestLessThanOrEqual": { @@ -1407,7 +1504,7 @@ ] ], [ - 232, + 251, [ { "AllocSegment": { @@ -1420,17 +1517,17 @@ ] ], [ - 251, + 272, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x686" }, "rhs": { "Deref": { "register": "AP", - "offset": -10 + "offset": -2 } }, "dst": { @@ -1442,7 +1539,7 @@ ] ], [ - 272, + 293, [ { "AllocSegment": { @@ -1455,7 +1552,7 @@ ] ], [ - 294, + 316, [ { "AllocSegment": { @@ -1468,7 +1565,7 @@ ] ], [ - 309, + 331, [ { "AllocSegment": { @@ -1481,7 +1578,7 @@ ] ], [ - 323, + 346, [ { "AllocSegment": { @@ -1494,7 +1591,7 @@ ] ], [ - 338, + 362, [ { "TestLessThanOrEqual": { @@ -1516,14 +1613,14 @@ ] ], [ - 371, + 400, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -1538,7 +1635,7 @@ ] ], [ - 375, + 404, [ { "LinearSplit": { @@ -1567,14 +1664,14 @@ ] ], [ - 385, + 414, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -1596,7 +1693,7 @@ ] ], [ - 424, + 457, [ { "AllocSegment": { @@ -1609,7 +1706,7 @@ ] ], [ - 444, + 479, [ { "AllocSegment": { @@ -1622,17 +1719,17 @@ ] ], [ - 463, + 500, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x24e" + "Immediate": "0x8de" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -1644,7 +1741,7 @@ ] ], [ - 489, + 527, [ { "AllocSegment": { @@ -1657,7 +1754,7 @@ ] ], [ - 509, + 548, [ { "AllocSegment": { @@ -1670,7 +1767,7 @@ ] ], [ - 527, + 567, [ { "AllocSegment": { @@ -1683,7 +1780,7 @@ ] ], [ - 556, + 599, [ { "AllocSegment": { @@ -1696,7 +1793,7 @@ ] ], [ - 570, + 613, [ { "AllocSegment": { @@ -1709,7 +1806,7 @@ ] ], [ - 591, + 637, [ { "AllocSegment": { @@ -1722,7 +1819,7 @@ ] ], [ - 605, + 651, [ { "AllocSegment": { @@ -1735,7 +1832,7 @@ ] ], [ - 622, + 669, [ { "TestLessThanOrEqual": { @@ -1757,14 +1854,14 @@ ] ], [ - 656, + 708, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -1779,7 +1876,7 @@ ] ], [ - 660, + 712, [ { "LinearSplit": { @@ -1808,14 +1905,14 @@ ] ], [ - 670, + 722, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -1837,7 +1934,7 @@ ] ], [ - 710, + 766, [ { "AllocSegment": { @@ -1850,7 +1947,7 @@ ] ], [ - 730, + 788, [ { "AllocSegment": { @@ -1863,17 +1960,17 @@ ] ], [ - 749, + 809, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x5028" + "Immediate": "0x56b8" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -1885,7 +1982,7 @@ ] ], [ - 767, + 828, [ { "SystemCall": { @@ -1900,14 +1997,14 @@ ] ], [ - 785, + 848, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } } } @@ -1915,7 +2012,7 @@ ] ], [ - 797, + 863, [ { "AllocSegment": { @@ -1928,7 +2025,7 @@ ] ], [ - 812, + 878, [ { "AllocSegment": { @@ -1941,7 +2038,7 @@ ] ], [ - 835, + 904, [ { "AllocSegment": { @@ -1954,7 +2051,7 @@ ] ], [ - 864, + 936, [ { "AllocSegment": { @@ -1967,7 +2064,7 @@ ] ], [ - 878, + 950, [ { "AllocSegment": { @@ -1980,7 +2077,7 @@ ] ], [ - 899, + 974, [ { "AllocSegment": { @@ -1993,7 +2090,7 @@ ] ], [ - 913, + 988, [ { "AllocSegment": { @@ -2006,7 +2103,7 @@ ] ], [ - 928, + 1004, [ { "TestLessThanOrEqual": { @@ -2028,7 +2125,7 @@ ] ], [ - 962, + 1042, [ { "AllocSegment": { @@ -2041,17 +2138,17 @@ ] ], [ - 981, + 1063, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1090" + "Immediate": "0x2a94" }, "rhs": { "Deref": { "register": "AP", - "offset": -14 + "offset": -2 } }, "dst": { @@ -2063,7 +2160,7 @@ ] ], [ - 1006, + 1089, [ { "SystemCall": { @@ -2078,7 +2175,7 @@ ] ], [ - 1009, + 1093, [ { "AllocSegment": { @@ -2091,7 +2188,7 @@ ] ], [ - 1029, + 1115, [ { "AllocSegment": { @@ -2104,7 +2201,7 @@ ] ], [ - 1044, + 1130, [ { "AllocSegment": { @@ -2117,7 +2214,7 @@ ] ], [ - 1058, + 1145, [ { "AllocSegment": { @@ -2130,7 +2227,7 @@ ] ], [ - 1072, + 1160, [ { "AllocSegment": { @@ -2143,12 +2240,12 @@ ] ], [ - 1087, + 1176, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x42e" + "Immediate": "0x492" }, "rhs": { "Deref": { @@ -2165,7 +2262,7 @@ ] ], [ - 1117, + 1208, [ { "AllocSegment": { @@ -2178,12 +2275,12 @@ ] ], [ - 1131, + 1222, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x942" + "Immediate": "0xa6e" }, "rhs": { "Deref": { @@ -2200,7 +2297,7 @@ ] ], [ - 1203, + 1300, [ { "AllocSegment": { @@ -2217,21 +2314,21 @@ "EXTERNAL": [ { "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "offset": 620, + "offset": 667, "builtins": [ "range_check" ] }, { "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", - "offset": 338, + "offset": 362, "builtins": [ "range_check" ] }, { "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", - "offset": 207, + "offset": 223, "builtins": [ "range_check" ] @@ -2248,7 +2345,7 @@ "CONSTRUCTOR": [ { "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", - "offset": 928, + "offset": 1004, "builtins": [ "range_check" ] diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/empty_contract.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/empty_contract.casm.json index e26e68d7fc7..6fba89ebb45 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/empty_contract.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/empty_contract.casm.json @@ -1,6 +1,6 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [], "bytecode_segment_lengths": 0, "hints": [], diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/test_contract.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/test_contract.casm.json index f2db595b712..b1bef6dcd3d 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/test_contract.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/test_contract.casm.json @@ -1,6 +1,6 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [ "0xa0680017fff8000", "0x7", @@ -8,17 +8,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xd1", + "0xe4", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1162", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -26,7 +29,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -34,52 +38,56 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xa6", + "0xb5", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0x94", + "0xa0", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x77", - "0x482480017ff58000", + "0x81", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x480080007ff38000", - "0x48307ffd80007ffe", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x480080007ff08000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127feb7fff8000", + "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -88,37 +96,40 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4d1c", + "0x5790", "0x482480017fff8000", - "0x4d1b", - "0x480080007fff8000", + "0x578f", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fe9", - "0x41d2", + "0x4824800180007ffd", + "0x56b8", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x43", - "0x4824800180007fe9", - "0x41d2", - "0x400080007ff47fff", + "0x4a", + "0x4824800180007ffd", + "0x56b8", + "0x400080007ff17fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff38000", + "0x482480017fef8000", "0x1", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", "0x400280017ffb7ffc", "0x400280027ffb7ffd", - "0x400280037ffb7feb", - "0x400280047ffb7ff5", + "0x400280037ffb7fe6", + "0x400280047ffb7ff3", "0x480280067ffb8000", "0x20680017fff7fff", - "0x23", + "0x27", "0x480280057ffb8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -126,16 +137,18 @@ "0x400280077ffb7fff", "0x400280087ffb7ffd", "0x400280097ffb7ffe", - "0x4002800a7ffb7fe7", + "0x4002800a7ffb7fe1", "0x4802800c7ffb8000", "0x20680017fff7fff", - "0x10", + "0x12", + "0x4802800b7ffb8000", "0x40780017fff7fff", "0x1", "0x4802800d7ffb8000", "0x400080007ffe7fff", - "0x48127ff77fff8000", - "0x4802800b7ffb8000", + "0x48127ff57fff8000", + "0x482480017ffc8000", + "0xc8", "0x482680017ffb8000", "0xe", "0x480680017fff8000", @@ -145,20 +158,23 @@ "0x1", "0x208b7fff7fff7ffe", "0x4802800b7ffb8000", + "0x48127fff7fff8000", "0x482680017ffb8000", "0xf", "0x4802800d7ffb8000", "0x4802800e7ffb8000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x4", + "0x5", "0x480280057ffb8000", + "0x482480017fff8000", + "0x2ac6", "0x482680017ffb8000", "0x9", "0x480280077ffb8000", "0x480280087ffb8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", @@ -171,9 +187,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fe47fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -186,8 +202,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -195,20 +212,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x686", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xba4", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -223,7 +242,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -237,24 +257,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xa0", + "0xad", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -263,63 +286,67 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4c6d", + "0x56d2", "0x482480017fff8000", - "0x4c6c", - "0x480080007fff8000", + "0x56d1", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x3e4e", + "0x4824800180007ffd", + "0x5c9e", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x6b", - "0x4824800180007ff8", - "0x3e4e", - "0x400080007ff87fff", + "0x74", + "0x4824800180007ffd", + "0x5c9e", + "0x400080007ff67fff", "0x480680017fff8000", "0xf", + "0x48127ffe7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080017ff37ffc", - "0x480080027ff27ffc", + "0x480080017ff07ffc", + "0x480080027fef7ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080037ff17ffd", + "0x400080037fee7ffd", "0x10780017fff7fff", - "0x44", + "0x4b", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080017ff47ffd", - "0x480080027ff37ffd", + "0x48307fff80007ffc", + "0x480080017ff17ffd", + "0x480080027ff07ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080037ff27ffe", + "0x400080037fef7ffe", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", - "0x482480017ff08000", + "0x482480017fec8000", "0x4", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", - "0x400280017ffb7ff5", + "0x400280017ffb7ffb", "0x400280027ffb7ffc", - "0x400280037ffb7ff6", + "0x400280037ffb7ff4", "0x400280047ffb7ffd", "0x480280067ffb8000", "0x20680017fff7fff", - "0x24", + "0x28", "0x480280057ffb8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -329,15 +356,17 @@ "0x400280077ffb7fff", "0x400280087ffb7ffc", "0x400280097ffb7ffd", - "0x4002800a7ffb7ff1", + "0x4002800a7ffb7fee", "0x4002800b7ffb7ffe", "0x4802800d7ffb8000", "0x20680017fff7fff", - "0xd", + "0xf", + "0x4802800c7ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ff77fff8000", - "0x4802800c7ffb8000", + "0x48127ff57fff8000", + "0x482480017ffd8000", + "0x1f4", "0x482680017ffb8000", "0xe", "0x480680017fff8000", @@ -345,30 +374,34 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", "0x4802800c7ffb8000", + "0x48127ff67fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0x10", "0x4802800e7ffb8000", "0x4802800f7ffb8000", "0x10780017fff7fff", - "0x16", - "0x48127ffd7fff8000", + "0x19", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x2bc0", "0x482680017ffb8000", "0x9", "0x480280077ffb8000", "0x480280087ffb8000", "0x10780017fff7fff", - "0xe", + "0xf", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017fef8000", + "0x482480017fec8000", "0x4", - "0x48127ff57fff8000", + "0x482480017ff68000", + "0x5654", "0x480a7ffb7fff8000", "0x48127ffb7fff8000", "0x482480017ffa8000", @@ -386,9 +419,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -403,7 +436,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -419,17 +453,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xf3", + "0x109", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -437,7 +474,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -445,89 +483,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc8", - "0x40137fff7fff8000", + "0xda", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xb5", + "0xc4", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x98", - "0x400180007ff58001", - "0x482480017ff58000", + "0xa5", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6f", + "0x78", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x1b5e", + "0x2099", "0x20680017fff7ffa", + "0x62", + "0x48127ff97fff8000", + "0x20680017fff7ffc", "0x5a", - "0x20680017fff7ffd", - "0x54", - "0x48307ffb80007ffc", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -536,37 +582,40 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4b5c", + "0x55aa", "0x482480017fff8000", - "0x4b5b", - "0x480080007fff8000", + "0x55a9", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x2404", + "0x4824800180007ffd", + "0x29cc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x24", - "0x4824800180007ff3", - "0x2404", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x27", + "0x4824800180007ffd", + "0x29cc", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400380027ffb8000", - "0x400380037ffb8001", - "0x400280047ffb7ff5", - "0x400280057ffb7ff6", + "0x400380027ffb8001", + "0x400380037ffb8000", + "0x400280047ffb7ff1", + "0x400280057ffb7ff2", "0x480280077ffb8000", "0x20680017fff7fff", - "0xb", - "0x48127ffd7fff8000", + "0xc", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -574,8 +623,9 @@ "0x480280087ffb8000", "0x480280097ffb8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -588,9 +638,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -598,20 +648,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -631,8 +684,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -640,20 +694,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -668,7 +724,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -681,20 +738,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xffffffffffffffffffffffffffffecbe", + "0xffffffffffffffffffffffffffffe67e", "0x400280007ff97fff", "0x10780017fff7fff", - "0x1e8", + "0x212", "0x4825800180007ffa", - "0x1342", + "0x1982", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x48127ffe7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -702,7 +761,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -710,182 +770,199 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x1bd", - "0x40137fff7fff8008", + "0x1e4", + "0x40137fff7fff8005", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048008", + "0x4825800180048005", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0x1aa", + "0x1ce", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008008", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008005", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x18d", - "0x400180007ff58004", - "0x482480017ff58000", + "0x1af", + "0x400180007ff38007", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x164", + "0x182", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x1a55", + "0x1f7a", "0x20680017fff7ffa", - "0x14f", - "0x20680017fff7ffd", - "0x149", - "0x40137ffe7fff8005", - "0x40137fff7fff8006", - "0x48307ffb80007ffc", + "0x16c", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x164", + "0x40137ffd7fff8003", + "0x40137ffe7fff8004", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffa8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff78000", "0x1", - "0x48127ffa7fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x0", - "0x480080007ff78000", + "0x480080007ff48000", "0x10780017fff7fff", - "0x8", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x121", - "0x40137fff7fff8007", + "0x139", + "0x40137fff7fff8006", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048007", + "0x4825800180048006", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007fef7ffc", - "0x480080017fee7ffc", + "0x480080007feb7ffc", + "0x480080017fea7ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027fed7ffd", + "0x400080027fe97ffd", "0x10780017fff7fff", - "0x10e", + "0x123", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008007", - "0x480080007ff07ffd", - "0x480080017fef7ffd", + "0x48317fff80008006", + "0x480080007fec7ffd", + "0x480080017feb7ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027fee7ffe", - "0x482480017fee8000", + "0x400080027fea7ffe", + "0x482480017fea8000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xf1", - "0x400180007ff58003", - "0x482480017ff58000", + "0x104", + "0x400180007ff38008", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc8", + "0xd7", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe47fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x19f8", + "0x1f14", "0x20680017fff7ffa", - "0xb3", - "0x20680017fff7ffd", - "0xad", - "0x48307ffb80007ffc", + "0xc1", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0xb9", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -894,65 +971,69 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x49f6", + "0x5425", "0x482480017fff8000", - "0x49f5", - "0x480080007fff8000", + "0x5424", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x70d0", + "0x4824800180007ffd", + "0x71fc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x7d", - "0x4824800180007ff3", - "0x70d0", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x86", + "0x4824800180007ffd", + "0x71fc", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400380027ffb8008", - "0x400380037ffb8004", - "0x400380047ffb8005", - "0x400380057ffb8006", + "0x400380027ffb8005", + "0x400380037ffb8007", + "0x400380047ffb8003", + "0x400380057ffb8004", "0x480280077ffb8000", "0x20680017fff7fff", - "0x5f", + "0x65", "0x480280067ffb8000", + "0x48127fff7fff8000", "0x480280087ffb8000", "0x480280097ffb8000", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x4002800a7ffb7fff", "0x4002800b7ffb7ffc", - "0x4003800c7ffb8007", - "0x4003800d7ffb8003", - "0x4002800e7ffb7ff0", - "0x4002800f7ffb7ff1", + "0x4003800c7ffb8006", + "0x4003800d7ffb8008", + "0x4002800e7ffb7feb", + "0x4002800f7ffb7fec", "0x480280117ffb8000", "0x20680017fff7fff", - "0x49", + "0x4c", + "0x480280107ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ff77fff8000", - "0x480280107ffb8000", + "0x48127ff57fff8000", + "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127ffc7fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x402780017ffb8000", "0x14", "0x400380127ffb8001", "0x400380137ffb8002", "0x1104800180018000", - "0x1a03", + "0x1f1e", "0x20680017fff7ffd", - "0x32", + "0x33", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", @@ -960,7 +1041,7 @@ "0x480a80017fff8000", "0x480a80027fff8000", "0x1104800180018000", - "0x19f9", + "0x1f14", "0x20680017fff7ffd", "0x21", "0x40780017fff7fff", @@ -975,7 +1056,7 @@ "0x482480017ff98000", "0x1", "0x1104800180018000", - "0x1a1d", + "0x1f3a", "0x20680017fff7ffd", "0xa", "0x48127ffb7fff8000", @@ -995,29 +1076,35 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x74e", "0x480a80007fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x17", - "0x48127ffb7fff8000", + "0x1c", "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0xfc8", "0x480a80007fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x10", - "0x48127ff87fff8000", + "0x14", "0x480280107ffb8000", + "0x48127ff67fff8000", + "0x482480017ffe8000", + "0x19b4", "0x482680017ffb8000", "0x14", "0x480280127ffb8000", "0x480280137ffb8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", + "0xa", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x463c", "0x482680017ffb8000", "0xa", "0x480280087ffb8000", @@ -1035,9 +1122,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1045,20 +1132,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fe57fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1078,8 +1168,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202335", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fea7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1087,20 +1178,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017fed8000", + "0x482480017fe98000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127fed7fff8000", + "0x48127ff07fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fea7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1108,20 +1201,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x1f4a", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x226a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x2ae4", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1141,8 +1237,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x3052", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1150,20 +1247,244 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x3052", "0x10780017fff7fff", "0x5", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x35ca", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x20f8", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xc9", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x482480017ffe8000", + "0xfd2", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb", + "0x48127ffe7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480280007ffc8000", + "0x10780017fff7fff", + "0x9", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0x9a", + "0x48127ffb7fff8000", + "0xa0680017fff8004", + "0xe", + "0x4824800180047ffd", + "0x800000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8002", + "0x480080007ff37ffc", + "0x480080017ff27ffc", + "0x402480017ffb7ffd", + "0xffffffffffffffeeffffffffffffffff", + "0x400080027ff17ffd", + "0x10780017fff7fff", + "0x85", + "0x484480017fff8001", + "0x8000000000000000000000000000000", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", + "0x402480017ffc7ffe", + "0xf8000000000000000000000000000000", + "0x400080027ff27ffe", + "0x482480017ff28000", + "0x3", + "0x48127ff97fff8000", + "0x48307ff480007ff5", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x66", + "0x480080007ff38000", + "0x482480017ff28000", + "0x1", + "0x48127ff27fff8000", + "0x48127ffb7fff8000", + "0x20680017fff7ffc", + "0x7", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x1", + "0x10780017fff7fff", "0x6", + "0x482480017fff8000", + "0x64", + "0x480680017fff8000", + "0x0", + "0x48307ffb80007ffc", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x492", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x5281", + "0x482480017fff8000", + "0x5280", + "0x48127ffa7fff8000", + "0x480080007ffe8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ffd", + "0xb4dc", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fee7fff", + "0x10780017fff7fff", + "0x24", + "0x4824800180007ffd", + "0xb4dc", + "0x400080007fef7fff", + "0x480680017fff8000", + "0x1", + "0x48127ffe7fff8000", + "0x480a7ffb7fff8000", + "0x48127fe57fff8000", + "0x48307ff380007ffc", + "0x1104800180018000", + "0x1e08", + "0x482480017fc88000", + "0x1", + "0x20680017fff7ffc", + "0xc", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", + "0x482480017ff98000", + "0x64", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017fec8000", + "0x1", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x400080007ffe7fff", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x816", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x3", + "0x482480017ff88000", + "0x816", + "0x10780017fff7fff", + "0x5", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xd34", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1178,7 +1499,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1192,17 +1514,145 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x97", + "0x68", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x51e9", + "0x482480017fff8000", + "0x51e8", + "0x48127ffb7fff8000", + "0x480080007ffe8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ffd", + "0x2af8", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff57fff", + "0x10780017fff7fff", + "0x2f", + "0x4824800180007ffd", + "0x2af8", + "0x400080007ff67fff", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", + "0x480680017fff8000", "0xa", + "0x482480017ff28000", + "0x1", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffb7fff", + "0x400280017ffb7ffa", + "0x400280027ffb7ffb", + "0x400280037ffb7ffc", + "0x400280047ffb7ffd", + "0x480280067ffb8000", + "0x20680017fff7fff", + "0xe", + "0x480280057ffb8000", + "0x40780017fff7fff", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", + "0x482680017ffb8000", + "0x7", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", + "0x482680017ffb8000", + "0x9", + "0x480680017fff8000", + "0x1", + "0x480280077ffb8000", + "0x480280087ffb8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff38000", + "0x1", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x21b6", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0xeb", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x482480017ffe8000", + "0xb7c", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -1210,7 +1660,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -1218,43 +1669,464 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6c", + "0xbc", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0x5a", + "0xa7", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff28000", + "0x1", + "0x48127ff27fff8000", + "0x480680017fff8000", + "0x0", + "0x480080007fef8000", + "0x10780017fff7fff", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0x74", + "0x48127ffb7fff8000", + "0xa0680017fff8004", + "0xe", + "0x4824800180047ffd", + "0x800000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8002", + "0x480080007ff37ffc", + "0x480080017ff27ffc", + "0x402480017ffb7ffd", + "0xffffffffffffffeeffffffffffffffff", + "0x400080027ff17ffd", + "0x10780017fff7fff", + "0x5f", + "0x484480017fff8001", + "0x8000000000000000000000000000000", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", + "0x402480017ffc7ffe", + "0xf8000000000000000000000000000000", + "0x400080027ff27ffe", + "0x482480017ff28000", + "0x3", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x510a", + "0x482480017fff8000", + "0x5109", + "0x48127ffb7fff8000", + "0x480080007ffe8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ffd", + "0x8bd8", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff57fff", + "0x10780017fff7fff", + "0x22", + "0x4824800180007ffd", + "0x8bd8", + "0x400080007ff67fff", + "0x48127fff7fff8000", + "0x480a7ffb7fff8000", + "0x48127fdf7fff8000", + "0x48127fec7fff8000", + "0x1104800180018000", + "0x1d1f", + "0x482480017fd18000", + "0x1", + "0x20680017fff7ffc", + "0xc", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", + "0x482480017ff98000", + "0x64", + "0x48127ff97fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff38000", + "0x1", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x3", + "0x482480017ff88000", + "0x42e", + "0x10780017fff7fff", + "0x5", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x94c", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x482480017ff18000", + "0x3", + "0x482480017ff88000", + "0xc6c", + "0x10780017fff7fff", + "0x5", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x118a", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4661696c656420746f20646573657269616c697a6520706172616d202331", + "0x400080007ffe7fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x21b6", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x114", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x482480017ffe8000", + "0x17c", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb", + "0x48127ffe7fff8000", + "0x482680017ffc8000", + "0x1", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x0", + "0x480280007ffc8000", + "0x10780017fff7fff", + "0x9", + "0x48127ffe7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0xe5", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", + "0xa0680017fff8004", + "0xe", + "0x4825800180048001", + "0x800000000000000000000000000000000000000000000000000000000000000", + "0x484480017ffe8000", + "0x110000000000000000", + "0x48307ffe7fff8002", + "0x480080007ff37ffc", + "0x480080017ff27ffc", + "0x402480017ffb7ffd", + "0xffffffffffffffeeffffffffffffffff", + "0x400080027ff17ffd", + "0x10780017fff7fff", + "0xcf", + "0x484480017fff8001", + "0x8000000000000000000000000000000", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", + "0x402480017ffc7ffe", + "0xf8000000000000000000000000000000", + "0x400080027ff27ffe", + "0x482480017ff28000", + "0x3", + "0x48127ff97fff8000", + "0x48307ff480007ff5", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb0", + "0x400180007ff38000", + "0x482480017ff38000", + "0x1", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", + "0x1", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ff87fff8000", + "0x10780017fff7fff", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x480680017fff8000", + "0x0", + "0x20680017fff7ffe", + "0x83", + "0x40780017fff7fff", + "0x1", + "0x48127ff37fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x480080007ff88000", + "0x1104800180018000", + "0x1af5", + "0x20680017fff7ffa", + "0x6d", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x65", + "0x48127fff7fff8000", + "0x48307ff980007ffa", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x5006", + "0x482480017fff8000", + "0x5005", + "0x48127ffb7fff8000", + "0x480080007ffe8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ffd", + "0x2cec", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007fed7fff", + "0x10780017fff7fff", + "0x32", + "0x4824800180007ffd", + "0x2cec", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", + "0x1", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x400280007ffb7fff", + "0x400280017ffb7ffd", + "0x400380027ffb8001", + "0x400380037ffb8000", + "0x400280047ffb7ff1", + "0x400280057ffb7ff2", + "0x480280077ffb8000", + "0x20680017fff7fff", "0x10", + "0x480280067ffb8000", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x657865637574655f616e645f726576657274", + "0x400080007ffe7fff", + "0x48127ffd7fff8000", + "0x482680017ffb8000", + "0xa", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x1", + "0x10780017fff7fff", + "0xb", + "0x40780017fff7fff", + "0x2", + "0x480280067ffb8000", + "0x482480017fff8000", + "0x118", + "0x482680017ffb8000", + "0xa", + "0x480280087ffb8000", + "0x480280097ffb8000", + "0x48127ff67fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017feb8000", + "0x1", + "0x48127ff87fff8000", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", + "0x10780017fff7fff", + "0xe", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", - "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1262,58 +2134,14 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x1104800180018000", - "0x4885", - "0x482480017fff8000", - "0x4884", - "0x480080007fff8000", - "0xa0680017fff8000", - "0x9", - "0x4824800180007fed", - "0x9baa", - "0x482480017fff8000", - "0x100000000000000000000000000000000", - "0x400080007ff77fff", - "0x10780017fff7fff", - "0x20", - "0x4824800180007fed", - "0x9baa", - "0x400080007ff87fff", - "0x48127fff7fff8000", - "0x480a7ffb7fff8000", - "0x48127ff07fff8000", - "0x1104800180018000", - "0x191c", - "0x482480017fd98000", - "0x1", - "0x20680017fff7ffc", - "0xc", - "0x40780017fff7fff", - "0x1", - "0x48127ffe7fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x480680017fff8000", - "0x0", - "0x48127ffb7fff8000", - "0x48127ffa7fff8000", - "0x208b7fff7fff7ffe", - "0x48127fff7fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x480680017fff8000", - "0x1", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", - "0x4f7574206f6620676173", + "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x482480017ff58000", - "0x1", - "0x48127fe87fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1321,20 +2149,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1349,7 +2179,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1362,20 +2193,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xfffffffffffffffffffffffffffff9ac", + "0xfffffffffffffffffffffffffffff560", "0x400280007ff97fff", "0x10780017fff7fff", - "0x120", + "0x138", "0x4825800180007ffa", - "0x654", + "0xaa0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x48127ffe7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -1383,7 +2216,8 @@ "0x0", "0x480a7ffc7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -1391,8 +2225,9 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xf5", + "0x10a", "0x400180007fff8002", + "0x48127ffb7fff8000", "0xa0680017fff8000", "0x12", "0x4825800180008002", @@ -1400,109 +2235,119 @@ "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007ff67fff", + "0x480080007ff37fff", "0x482480017ffe8000", "0xefffffffffffffdeffffffffffffffff", - "0x480080017ff47fff", - "0x400080027ff37ffb", + "0x480080017ff17fff", + "0x400080027ff07ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0xe0", + "0xf2", "0x402780017fff7fff", "0x1", - "0x400180007ff98002", + "0x400180007ff68002", "0x4826800180028000", "0xffffffffffffffff0000000000000000", - "0x400080017ff87fff", - "0x482480017ff88000", + "0x400080017ff57fff", + "0x482480017ff58000", "0x2", - "0x48307ff980007ffa", + "0x48127ffc7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff88000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff58000", "0x1", - "0x48127ff87fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x0", - "0x48127ff57fff8000", + "0x48127ff27fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xb3", + "0xc1", "0x40780017fff7fff", "0x1", + "0x48127ff77fff8000", "0x48127ff97fff8000", - "0x48127fef7fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x17b5", + "0x19d5", "0x20680017fff7ffa", - "0x9e", - "0x20680017fff7ffd", - "0x98", - "0x40137ffe7fff8000", - "0x40137fff7fff8001", - "0x48307ffb80007ffc", + "0xab", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0xa3", + "0x40137ffd7fff8000", + "0x40137ffe7fff8001", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffa8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff78000", "0x1", - "0x48127ffa7fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x0", - "0x48127ff77fff8000", + "0x48127ff47fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x71", + "0x78", "0x40780017fff7fff", "0x1", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x48127fef7fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x178f", + "0x19ab", "0x20680017fff7ffa", - "0x5c", - "0x20680017fff7ffd", - "0x56", - "0x48307ffb80007ffc", + "0x62", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x5a", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1511,35 +2356,36 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x478d", + "0x4ebc", "0x482480017fff8000", - "0x478c", - "0x480080007fff8000", + "0x4ebb", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", + "0x4824800180007ffd", "0x87a", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x26", - "0x4824800180007ff3", + "0x27", + "0x4824800180007ffd", "0x87a", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x400080007fee7fff", + "0x482480017fee8000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", "0x480a80027fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", - "0x188c", + "0x1b4c", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -1553,7 +2399,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -1565,9 +2412,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1575,20 +2422,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff07fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1603,20 +2453,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x1464", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1784", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff07fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -1631,20 +2484,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff38000", + "0x482480017ff08000", "0x3", + "0x482480017ff78000", + "0x2148", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x7", - "0x48127ff37fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x2724", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fee7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1659,7 +2514,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2134", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1673,17 +2529,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xf4", + "0x109", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xb7c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -1691,7 +2550,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -1699,88 +2559,95 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc9", + "0xda", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xb7", + "0xc5", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff58000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff28000", "0x1", - "0x48127ff57fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x0", - "0x480080007ff28000", + "0x480080007fef8000", "0x10780017fff7fff", - "0x8", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x87", + "0x92", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0x75", + "0x7d", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fe47fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1789,44 +2656,48 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4677", + "0x4d90", "0x482480017fff8000", - "0x4676", - "0x480080007fff8000", + "0x4d8f", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fe2", - "0x1e50", + "0x4824800180007ffd", + "0x2db4", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x3b", - "0x4824800180007fe2", - "0x1e50", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x40", + "0x4824800180007ffd", + "0x2db4", + "0x400080007ff67fff", + "0x48127fff7fff8000", + "0x482480017ff58000", "0x1", "0x480680017fff8000", "0x476574436c617373486173684174", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400280027ffb7fe5", + "0x400280027ffb7fde", "0x480280047ffb8000", "0x20680017fff7fff", - "0x1f", - "0x480280057ffb8000", - "0x48307fee80007fff", + "0x21", "0x480280037ffb8000", + "0x480280057ffb8000", + "0x48307fe980007fff", "0x482680017ffb8000", "0x6", + "0x48127ffc7fff8000", "0x20680017fff7ffd", - "0xc", + "0xd", "0x40780017fff7fff", "0x1", - "0x48127ff87fff8000", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", + "0x48127ff77fff8000", + "0x482480017ffd8000", + "0x2bc", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", @@ -1837,21 +2708,23 @@ "0x480680017fff8000", "0x57524f4e475f434c4153535f48415348", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x482480017ffb8000", "0x1", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", "0x6", "0x480280037ffb8000", + "0x482480017fff8000", + "0x2e4", "0x482680017ffb8000", "0x7", "0x480280057ffb8000", "0x480280067ffb8000", - "0x48127ff37fff8000", + "0x48127ff27fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", @@ -1864,9 +2737,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127fdd7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1874,20 +2747,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x42e", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x94c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fe47fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1895,20 +2770,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0xc6c", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x118a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1923,7 +2800,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -1937,17 +2815,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x9e", + "0xac", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x14c8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -1955,7 +2836,8 @@ "0x0", "0x480a7ffc7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -1963,44 +2845,47 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x73", + "0x7d", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x12", - "0x4824800180007ffe", + "0x4824800180007ffd", "0x10000000000000000", "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007ff57fff", + "0x480080007ff27fff", "0x482480017ffe8000", "0xefffffffffffffdeffffffffffffffff", - "0x480080017ff37fff", - "0x400080027ff27ffb", + "0x480080017ff07fff", + "0x400080027fef7ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0x5e", + "0x65", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ffe8000", + "0x400080007ff57ffd", + "0x482480017ffd8000", "0xffffffffffffffff0000000000000000", - "0x400080017ff77fff", - "0x482480017ff78000", + "0x400080017ff47fff", + "0x482480017ff48000", "0x2", - "0x48307ff880007ff9", + "0x48127ffc7fff8000", + "0x48307ff680007ff7", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ff17fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2009,38 +2894,41 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x459b", + "0x4ca2", "0x482480017fff8000", - "0x459a", - "0x480080007fff8000", + "0x4ca1", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fef", - "0x1248", + "0x4824800180007ffd", + "0x29cc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x26", - "0x4824800180007fef", - "0x1248", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x2a", + "0x4824800180007ffd", + "0x29cc", + "0x400080007ff67fff", + "0x48127fff7fff8000", + "0x482480017ff58000", "0x1", "0x480680017fff8000", "0x476574426c6f636b48617368", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400280027ffb7ff3", + "0x400280027ffb7fef", "0x480280047ffb8000", "0x20680017fff7fff", - "0x10", + "0x11", + "0x480280037ffb8000", "0x40780017fff7fff", "0x1", "0x480280057ffb8000", "0x400080007ffe7fff", - "0x48127ffb7fff8000", - "0x480280037ffb8000", + "0x48127ffa7fff8000", + "0x48127ffc7fff8000", "0x482680017ffb8000", "0x6", "0x480680017fff8000", @@ -2049,8 +2937,10 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280037ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x12c", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -2063,9 +2953,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127fea7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2073,20 +2963,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff28000", + "0x482480017fef8000", "0x3", + "0x482480017ff78000", + "0x258", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x8", - "0x48127ff27fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x83e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fed7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2101,7 +2993,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2114,73 +3007,80 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xffffffffffffffffffffffffffff7d38", + "0xffffffffffffffffffffffffffff6f8c", "0x400280007ff97fff", "0x10780017fff7fff", - "0xe7", + "0xf6", "0x4825800180007ffa", - "0x82c8", + "0x9074", "0x400280007ff97fff", "0x482680017ff98000", "0x1", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", - "0x16ab", - "0x20680017fff7ffc", - "0xce", - "0x48127ff97fff8000", - "0x48127fd57fff8000", - "0x48127ff87fff8000", + "0x1943", + "0x48127fd67fff8000", + "0x20680017fff7ffb", + "0xdb", "0x48127ff87fff8000", - "0x40137ff97fff8000", - "0x40137ffa7fff8001", - "0x40137ffb7fff8002", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x40137ff87fff8000", + "0x40137ff97fff8001", + "0x40137ffa7fff8002", "0x1104800180018000", - "0x176d", + "0x1a04", "0x20680017fff7feb", - "0xbb", - "0x20680017fff7fee", - "0xab", - "0x48307fec80007fed", + "0xc7", + "0x48127fea7fff8000", + "0x20680017fff7fed", + "0xb5", + "0x48127fff7fff8000", + "0x48307fea80007feb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x98", - "0x482480017feb8000", + "0xa0", + "0x482480017fe98000", "0x1", - "0x48127feb7fff8000", - "0x480080007fe98000", - "0x48307ffd80007ffe", + "0x48127fe97fff8000", + "0x48127ffc7fff8000", + "0x480080007fe68000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x81", - "0x482480017ffc8000", + "0x87", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6a", - "0x482480017ffc8000", + "0x6e", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127fda7fff8000", - "0x48127fda7fff8000", + "0x48127fd57fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2189,51 +3089,52 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x44e7", + "0x4bdf", "0x482480017fff8000", - "0x44e6", - "0x480080007fff8000", + "0x4bde", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fd8", - "0x8070", + "0x4824800180007ffd", + "0x896c", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fd57fff", + "0x400080007fcf7fff", "0x10780017fff7fff", - "0x36", - "0x4824800180007fd8", - "0x8070", - "0x400080007fd67fff", - "0x482480017fd68000", + "0x37", + "0x4824800180007ffd", + "0x896c", + "0x400080007fd07fff", + "0x482480017fd08000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", - "0x480a80007fff8000", - "0x480a80017fff8000", - "0x480a80027fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", - "0x48127fd67fff8000", + "0x480a80007fff8000", + "0x480a80017fff8000", + "0x480a80027fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", + "0x48127fd07fff8000", "0x48127fd67fff8000", - "0x48127fd97fff8000", - "0x48127fdc7fff8000", - "0x48127fdf7fff8000", + "0x48127fda7fff8000", + "0x48127fde7fff8000", "0x1104800180018000", - "0x1b88", + "0x1e57", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -2247,7 +3148,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -2259,9 +3161,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fd38000", + "0x482480017fcd8000", "0x1", - "0x48127fd37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2274,8 +3176,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202335", "0x400080007ffe7fff", - "0x48127fde7fff8000", - "0x48127fde7fff8000", + "0x48127fda7fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2288,8 +3191,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127fe27fff8000", - "0x48127fe27fff8000", + "0x48127fdf7fff8000", + "0x482480017ffa8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2302,8 +3206,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127fe67fff8000", - "0x48127fe67fff8000", + "0x48127fe47fff8000", + "0x482480017ffb8000", + "0xb36", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2316,8 +3221,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127fe77fff8000", - "0x48127fe77fff8000", + "0x48127fe67fff8000", + "0x482480017ffc8000", + "0xcc6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2326,7 +3232,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127fe97fff8000", - "0x48127fe97fff8000", + "0x482480017fe98000", + "0xeba", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2338,8 +3245,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ff77fff8000", - "0x48127fd37fff8000", + "0x48127ff67fff8000", + "0x482480017ffc8000", + "0x98b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2354,7 +3262,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2134", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2370,17 +3279,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xf3", + "0x109", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -2388,7 +3300,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -2396,89 +3309,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc8", - "0x40137fff7fff8000", + "0xda", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xb5", + "0xc4", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x98", - "0x400180007ff58001", - "0x482480017ff58000", + "0xa5", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6f", + "0x78", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x13bf", + "0x158f", "0x20680017fff7ffa", + "0x62", + "0x48127ff97fff8000", + "0x20680017fff7ffc", "0x5a", - "0x20680017fff7ffd", - "0x54", - "0x48307ffb80007ffc", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2487,37 +3408,40 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x43bd", + "0x4aa0", "0x482480017fff8000", - "0x43bc", - "0x480080007fff8000", + "0x4a9f", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x2404", + "0x4824800180007ffd", + "0x29cc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x24", - "0x4824800180007ff3", - "0x2404", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x27", + "0x4824800180007ffd", + "0x29cc", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x4c69627261727943616c6c", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400380027ffb8000", - "0x400380037ffb8001", - "0x400280047ffb7ff5", - "0x400280057ffb7ff6", + "0x400380027ffb8001", + "0x400380037ffb8000", + "0x400280047ffb7ff1", + "0x400280057ffb7ff2", "0x480280077ffb8000", "0x20680017fff7fff", - "0xb", - "0x48127ffd7fff8000", + "0xc", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -2525,8 +3449,9 @@ "0x480280087ffb8000", "0x480280097ffb8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -2539,9 +3464,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2549,20 +3474,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -2582,8 +3510,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2591,20 +3520,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2619,7 +3550,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2633,17 +3565,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xe9", + "0xfb", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xa5a", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -2651,7 +3586,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -2659,79 +3595,86 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xbe", + "0xcc", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xac", + "0xb7", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8f", - "0x482480017ff58000", + "0x98", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x480080007ff38000", - "0x48307ffd80007ffe", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x480080007ff08000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x78", - "0x482480017ffc8000", + "0x7f", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x61", - "0x482480017ffc8000", + "0x66", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x4a", - "0x482480017ffc8000", + "0x4d", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127fec7fff8000", - "0x48127fdf7fff8000", + "0x48127fe77fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2740,32 +3683,33 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x42c0", + "0x498d", "0x482480017fff8000", - "0x42bf", - "0x480080007fff8000", + "0x498c", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fdd", - "0x5172", + "0x4824800180007ffd", + "0x6018", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fe77fff", + "0x400080007fe17fff", "0x10780017fff7fff", "0x16", - "0x4824800180007fdd", - "0x5172", - "0x400080007fe87fff", + "0x4824800180007ffd", + "0x6018", + "0x400080007fe27fff", "0x48127fff7fff8000", "0x480a7ffb7fff8000", - "0x48127fe07fff8000", + "0x48127fd97fff8000", + "0x48127fe57fff8000", "0x48127fe97fff8000", - "0x48127fec7fff8000", - "0x48127fef7fff8000", - "0x48127ff27fff8000", + "0x48127fed7fff8000", + "0x48127ff17fff8000", "0x1104800180018000", - "0x1ae5", - "0x482480017fcc8000", + "0x1dbb", + "0x482480017fc48000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", @@ -2778,9 +3722,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fe58000", + "0x482480017fdf8000", "0x1", - "0x48127fd87fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2793,8 +3737,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202335", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127fe37fff8000", + "0x48127fec7fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2807,8 +3752,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127fe77fff8000", + "0x48127ff17fff8000", + "0x482480017ffa8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2821,8 +3767,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127feb7fff8000", + "0x48127ff67fff8000", + "0x482480017ffa8000", + "0xb36", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2835,8 +3782,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0xd8e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2844,20 +3792,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0xd8e", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x12ac", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2872,7 +3822,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2886,17 +3837,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x9a", + "0xa8", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x13ba", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -2904,7 +3858,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -2912,43 +3867,46 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6f", + "0x79", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0x5d", + "0x64", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -2957,36 +3915,39 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x41e7", + "0x48a5", "0x482480017fff8000", - "0x41e6", - "0x480080007fff8000", + "0x48a4", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fed", - "0x128e", + "0x4824800180007ffd", + "0x2904", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x23", - "0x4824800180007fed", - "0x128e", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x27", + "0x4824800180007ffd", + "0x2904", + "0x400080007ff67fff", + "0x48127fff7fff8000", + "0x482480017ff58000", "0x1", "0x480680017fff8000", "0x5265706c616365436c617373", "0x400280007ffb7fff", "0x400280017ffb7ffd", - "0x400280027ffb7ff0", + "0x400280027ffb7fec", "0x480280047ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280037ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280037ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x5", "0x480680017fff8000", @@ -2994,8 +3955,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280037ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -3008,9 +3971,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127fe87fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3018,20 +3981,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x42e", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x94c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3046,7 +4011,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3062,69 +4028,77 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xb1", + "0xc2", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xa1e", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x99", + "0xa7", "0x400380007ffc8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x70", + "0x7a", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x1139", + "0x12d4", "0x20680017fff7ffa", - "0x5b", - "0x20680017fff7ffd", - "0x55", - "0x48307ffb80007ffc", + "0x64", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x5c", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3133,38 +4107,41 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4137", + "0x47e5", "0x482480017fff8000", - "0x4136", - "0x480080007fff8000", + "0x47e4", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x1c8e", + "0x4824800180007ffd", + "0x29cc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x25", - "0x4824800180007ff3", - "0x1c8e", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x29", + "0x4824800180007ffd", + "0x29cc", + "0x400080007fee7fff", + "0x48127fff7fff8000", + "0x482480017fed8000", "0x1", "0x480680017fff8000", "0x53656e644d657373616765546f4c31", "0x400280007ffb7fff", "0x400280017ffb7ffd", "0x400380027ffb8000", - "0x400280037ffb7ff5", - "0x400280047ffb7ff6", + "0x400280037ffb7ff1", + "0x400280047ffb7ff2", "0x480280067ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280057ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280057ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -3172,8 +4149,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0x9", "0x480680017fff8000", @@ -3186,9 +4165,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3196,20 +4175,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127ff57fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -3229,8 +4211,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3245,7 +4228,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2148", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3259,25 +4243,28 @@ "0x100000000000000000000000000000000", "0x400280007ff87fff", "0x10780017fff7fff", - "0x5a", + "0x5e", "0x4825800180007ffa", "0x0", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x482480017ffe8000", + "0x1b94", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3286,22 +4273,23 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x409e", + "0x473f", "0x482480017fff8000", - "0x409d", - "0x480080007fff8000", + "0x473e", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x41a", + "0x4824800180007ffd", + "0x2076", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", "0x23", - "0x4824800180007ff8", - "0x41a", - "0x400080007ff87fff", + "0x4824800180007ffd", + "0x2076", + "0x400080007ff67fff", "0x48027ffd7ff98000", "0x48027ffe7ff98000", "0x48027fff7ff98000", @@ -3313,14 +4301,14 @@ "0x484480017ffd8000", "0x3", "0x48307fff7ffb8000", - "0x482480017ff28000", + "0x482480017ff08000", "0x1", "0x482680017ff98000", "0x3", "0x48127ff77fff8000", "0x480080007ffc8000", "0x1104800180018000", - "0x1901", + "0x1bb0", "0x40780017fff7fff", "0x1", "0x48127ffa7fff8000", @@ -3337,10 +4325,10 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", "0x480a7ff97fff8000", - "0x48127ff27fff8000", + "0x48127ff77fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3356,7 +4344,8 @@ "0x482680017ff88000", "0x1", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3369,20 +4358,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0x100000000000000000000000000000000", + "0xfffffffffffffffffffffffffffffd94", "0x400280007ff97fff", "0x10780017fff7fff", - "0x118", + "0x133", "0x4825800180007ffa", - "0x0", + "0x26c", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x48127ffe7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -3390,7 +4381,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -3398,106 +4390,118 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xed", - "0x40137fff7fff8000", + "0x105", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xda", + "0xef", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xbd", - "0x400180007ff58001", - "0x482480017ff58000", + "0xd0", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x94", + "0xa3", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0xfd5", + "0x1156", "0x20680017fff7ffa", - "0x7f", - "0x20680017fff7ffd", - "0x79", - "0x48307ffb80007ffc", + "0x8d", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x85", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x66", - "0x480080007ffa8000", - "0x482480017ff98000", + "0x70", + "0x480080007ff88000", + "0x482480017ff78000", "0x1", - "0x48127ff97fff8000", - "0x20680017fff7ffd", - "0x6", + "0x48127ff77fff8000", + "0x48127ffb7fff8000", + "0x20680017fff7ffc", + "0x7", + "0x48127fff7fff8000", "0x480680017fff8000", "0x1", "0x10780017fff7fff", - "0x4", + "0x6", + "0x482480017fff8000", + "0x64", "0x480680017fff8000", "0x0", - "0x48307ffd80007ffe", + "0x48307ffb80007ffc", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127ff07fff8000", + "0x48127fec7fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3506,43 +4510,46 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3fc2", + "0x4652", "0x482480017fff8000", - "0x3fc1", - "0x480080007fff8000", + "0x4651", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fee", - "0x28b4", + "0x4824800180007ffd", + "0x2b5c", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007feb7fff", + "0x400080007fe67fff", "0x10780017fff7fff", - "0x2a", - "0x4824800180007fee", - "0x28b4", - "0x400080007fec7fff", + "0x2e", + "0x4824800180007ffd", + "0x2b5c", + "0x400080007fe77fff", "0x480680017fff8000", "0x1", - "0x48307ff780007fff", - "0x482480017fea8000", + "0x48127ffe7fff8000", + "0x48307ff580007ffe", + "0x482480017fe48000", "0x1", "0x480680017fff8000", "0x4465706c6f79", "0x400280007ffb7fff", - "0x400280017ffb7ffb", - "0x400380027ffb8000", - "0x400380037ffb8001", - "0x400280047ffb7fee", - "0x400280057ffb7fef", + "0x400280017ffb7ffc", + "0x400380027ffb8001", + "0x400380037ffb8000", + "0x400280047ffb7fe8", + "0x400280057ffb7fe9", "0x400280067ffb7ffd", "0x480280087ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280077ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280077ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0xc", "0x480680017fff8000", @@ -3550,8 +4557,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280077ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0xb", "0x480680017fff8000", @@ -3564,9 +4573,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fe98000", + "0x482480017fe48000", "0x1", - "0x48127fe97fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3579,8 +4588,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x816", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3588,20 +4598,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x87a", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0xb9a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x1414", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -3621,8 +4634,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1982", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3630,20 +4644,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x1982", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1efa", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3658,7 +4674,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3672,17 +4689,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x9a", + "0xa5", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x15d6", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -3690,7 +4710,8 @@ "0x0", "0x480a7ffc7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -3698,15 +4719,16 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6f", + "0x76", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff88003", - "0x480080017ff78003", + "0x480080007ff58003", + "0x480080017ff48003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -3717,26 +4739,28 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027ff37ffd", + "0x400080027ff07ffd", "0x20680017fff7ffe", - "0x56", + "0x5a", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ff88000", + "0x400080007ff57ffd", + "0x482480017ff58000", "0x1", - "0x48307ff980007ffa", + "0x48127ffd7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ff27fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3745,28 +4769,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3ed3", + "0x454f", "0x482480017fff8000", - "0x3ed2", - "0x480080007fff8000", + "0x454e", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff0", - "0x0", + "0x4824800180007ffd", + "0x690", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x21", - "0x4824800180007ff0", - "0x0", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x22", + "0x4824800180007ffd", + "0x690", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", "0x48127ffe7fff8000", - "0x48127ff47fff8000", + "0x48127ff17fff8000", "0x1104800180018000", - "0x1801", + "0x1a8b", "0x20680017fff7ffd", "0xe", "0x40780017fff7fff", @@ -3782,7 +4807,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3794,9 +4820,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127feb7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3804,20 +4830,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff38000", + "0x482480017ff08000", "0x3", + "0x482480017ff88000", + "0xe6", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x7", - "0x48127ff37fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x730", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fee7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3832,7 +4860,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3846,24 +4875,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x54", + "0x59", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3872,28 +4904,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3e54", + "0x44c8", "0x482480017fff8000", - "0x3e53", - "0x480080007fff8000", + "0x44c7", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x7364", + "0x4824800180007ffd", + "0x96c8", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x1f", - "0x4824800180007ff8", - "0x7364", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x20", + "0x4824800180007ffd", + "0x96c8", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x1840", + "0x1acc", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -3907,7 +4940,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -3919,9 +4953,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3936,7 +4970,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3950,24 +4985,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x54", + "0x59", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -3976,28 +5014,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3dec", + "0x445a", "0x482480017fff8000", - "0x3deb", - "0x480080007fff8000", + "0x4459", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x3b92", + "0x4824800180007ffd", + "0x58b6", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x1f", - "0x4824800180007ff8", - "0x3b92", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x20", + "0x4824800180007ffd", + "0x58b6", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x18a0", + "0x1b36", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -4011,7 +5050,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -4023,9 +5063,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4040,7 +5080,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4054,25 +5095,28 @@ "0x100000000000000000000000000000000", "0x400280007ff87fff", "0x10780017fff7fff", - "0x5c", + "0x61", "0x4825800180007ffa", "0x0", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x482480017ffe8000", + "0x1a68", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ffa8000", + "0x5be", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4081,32 +5125,33 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3d83", + "0x43eb", "0x482480017fff8000", - "0x3d82", - "0x480080007fff8000", + "0x43ea", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x480080017fff8000", "0x484480017fff8000", "0x8", "0x482480017fff8000", - "0x3f71e", + "0x425d6", "0xa0680017fff8000", "0x8", - "0x48307ffe80007ff5", + "0x48307ffe80007ffa", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff47fff", + "0x400080007ff27fff", "0x10780017fff7fff", - "0x21", - "0x48307ffe80007ff5", - "0x400080007ff57fff", - "0x482480017ff58000", + "0x22", + "0x48307ffe80007ffa", + "0x400080007ff37fff", + "0x482480017ff38000", "0x1", "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x1886", + "0x1b1a", "0x20680017fff7ffd", "0xd", "0x40780017fff7fff", @@ -4122,7 +5167,8 @@ "0x208b7fff7fff7ffe", "0x48127ff97fff8000", "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x64", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -4134,10 +5180,10 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff28000", + "0x482480017ff08000", "0x1", "0x480a7ff97fff8000", - "0x48127fef7fff8000", + "0x48127ff47fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4153,7 +5199,8 @@ "0x482680017ff88000", "0x1", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4167,24 +5214,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x54", + "0x59", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4193,28 +5243,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3d13", + "0x4375", "0x482480017fff8000", - "0x3d12", - "0x480080007fff8000", + "0x4374", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x366fa", + "0x4824800180007ffd", + "0x3909e", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x1f", - "0x4824800180007ff8", - "0x366fa", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x20", + "0x4824800180007ffd", + "0x3909e", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x195a", + "0x1c78", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -4228,7 +5279,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -4240,9 +5292,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4257,7 +5309,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4271,42 +5324,47 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x89", + "0x92", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1748", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x71", + "0x77", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5a", - "0x482480017ffc8000", + "0x5e", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff27fff8000", + "0x48127ff17fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4315,34 +5373,36 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3c99", + "0x42f3", "0x482480017fff8000", - "0x3c98", - "0x480080007fff8000", + "0x42f2", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff0", - "0x0", + "0x4824800180007ffd", + "0xc8", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fef7fff", + "0x400080007feb7fff", "0x10780017fff7fff", - "0x26", - "0x4824800180007ff0", - "0x0", - "0x400080007ff07fff", - "0x48307ff880007ff4", - "0x482480017fef8000", + "0x27", + "0x4824800180007ffd", + "0xc8", + "0x400080007fec7fff", + "0x48307ff780007ff2", + "0x482480017feb8000", "0x1", - "0x20680017fff7ffe", + "0x48127ffd7fff8000", + "0x20680017fff7ffd", "0x10", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x73756363657373", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -4355,8 +5415,8 @@ "0x480680017fff8000", "0x7820213d2079", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127ffa7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4369,9 +5429,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fed8000", + "0x482480017fe98000", "0x1", - "0x48127feb7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4384,8 +5444,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4398,8 +5459,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4414,7 +5476,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4428,17 +5491,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x98", + "0xa4", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xcda", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -4446,7 +5512,8 @@ "0x0", "0x480a7ffc7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -4454,34 +5521,37 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6e", + "0x75", "0x40780017fff7fff", "0x1", - "0x48127ff97fff8000", "0x48127ff77fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0xbec", + "0xd27", "0x20680017fff7ffa", - "0x59", - "0x20680017fff7ffd", - "0x53", - "0x48307ffb80007ffc", + "0x5f", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x57", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4490,30 +5560,31 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3bea", + "0x4238", "0x482480017fff8000", - "0x3be9", - "0x480080007fff8000", + "0x4237", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0x0", + "0x4824800180007ffd", + "0x74e", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x23", - "0x4824800180007ff3", - "0x0", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x24", + "0x4824800180007ffd", + "0x74e", + "0x400080007fee7fff", + "0x482480017fee8000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", "0x1104800180018000", - "0x1995", + "0x1cc3", "0x20680017fff7ffd", "0xe", "0x40780017fff7fff", @@ -4529,7 +5600,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0xc8", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -4541,9 +5613,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4551,20 +5623,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -4586,7 +5661,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4600,24 +5676,27 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x49", + "0x4e", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1bf8", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4626,30 +5705,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3b62", + "0x41a7", "0x482480017fff8000", - "0x3b61", - "0x480080007fff8000", + "0x41a6", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x14", - "0x4824800180007ff8", + "0x15", + "0x4824800180007ffd", "0x0", - "0x400080007ff87fff", + "0x400080007ff67fff", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x6661696c", "0x400080007ffe7fff", - "0x482480017ff68000", + "0x482480017ff48000", "0x1", - "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0xc8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4662,9 +5743,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4679,7 +5760,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4693,33 +5775,37 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x6b", + "0x72", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x19a0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x53", + "0x57", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4728,28 +5814,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3afc", + "0x413a", "0x482480017fff8000", - "0x3afb", - "0x480080007fff8000", + "0x4139", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff4", - "0x0", + "0x4824800180007ffd", + "0x5be", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x1f", - "0x4824800180007ff4", - "0x0", - "0x400080007ff47fff", - "0x482480017ff48000", + "0x20", + "0x4824800180007ffd", + "0x5be", + "0x400080007ff17fff", + "0x482480017ff18000", "0x1", "0x48127ffe7fff8000", - "0x48127ff67fff8000", + "0x48127ff57fff8000", "0x1104800180018000", - "0x19d4", + "0x1d0e", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -4763,7 +5850,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x64", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4775,9 +5863,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fef7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4790,8 +5878,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4806,7 +5895,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4820,33 +5910,37 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x6b", + "0x72", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x19a0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x53", + "0x57", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4855,28 +5949,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3a7d", + "0x40b3", "0x482480017fff8000", - "0x3a7c", - "0x480080007fff8000", + "0x40b2", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff4", - "0x0", + "0x4824800180007ffd", + "0x5be", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x1f", - "0x4824800180007ff4", - "0x0", - "0x400080007ff47fff", - "0x482480017ff48000", + "0x20", + "0x4824800180007ffd", + "0x5be", + "0x400080007ff17fff", + "0x482480017ff18000", "0x1", "0x48127ffe7fff8000", - "0x48127ff67fff8000", + "0x48127ff57fff8000", "0x1104800180018000", - "0x1985", + "0x1cb9", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -4890,7 +5985,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x64", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4902,9 +5998,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fef7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4917,8 +6013,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4933,7 +6030,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -4947,17 +6045,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xdf", + "0xf3", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xf0a", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -4965,7 +6066,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -4973,61 +6075,66 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xb4", + "0xc4", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xa2", + "0xaf", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x85", - "0x482480017ff58000", + "0x90", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x480080007ff38000", - "0x48307ffd80007ffe", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x480080007ff08000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6e", - "0x482480017ffc8000", + "0x77", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127fe77fff8000", + "0x48127ff17fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5036,59 +6143,64 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x39c8", + "0x3ff1", "0x482480017fff8000", - "0x39c7", - "0x480080007fff8000", + "0x3ff0", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fe5", - "0x1b8a", + "0x4824800180007ffd", + "0x2e7c", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fef7fff", + "0x400080007feb7fff", "0x10780017fff7fff", - "0x3a", - "0x4824800180007fe5", - "0x1b8a", - "0x400080007ff07fff", - "0x482480017ff08000", + "0x40", + "0x4824800180007ffd", + "0x2e7c", + "0x400080007fec7fff", + "0x482480017fec8000", "0x1", - "0x20680017fff7ff7", - "0x8", + "0x48127ffe7fff8000", + "0x20680017fff7ff5", + "0x9", "0x40780017fff7fff", - "0x6", - "0x48127ff87fff8000", + "0x8", + "0x482480017ff78000", + "0x2d00", "0x480a7ffb7fff8000", "0x10780017fff7fff", - "0x1a", + "0x1c", "0x40780017fff7fff", "0x1", - "0x400080007fff7fe8", - "0x400080017fff7ff2", - "0x4824800180007ff6", + "0x400080007fff7fe2", + "0x400080017fff7fef", + "0x4824800180007ff4", "0x1", "0x400080027ffe7fff", - "0x48127ffe7fff8000", - "0x482480017ffd8000", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffc8000", "0x3", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ffb7fff", - "0x400280017ffb7ff9", - "0x400280027ffb7fe4", - "0x400280037ffb7fee", + "0x400280017ffb7ffc", + "0x400280027ffb7fdd", + "0x400280037ffb7fea", "0x400280047ffb7ffd", "0x400280057ffb7ffe", "0x480280077ffb8000", "0x20680017fff7fff", - "0xf", + "0x10", "0x480280067ffb8000", + "0x48127fff7fff8000", "0x482680017ffb8000", "0xa", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", + "0x48127ff37fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", @@ -5096,8 +6208,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", "0x480280067ffb8000", + "0x48127ff67fff8000", + "0x482480017ffe8000", + "0x12c", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -5110,9 +6224,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fed8000", + "0x482480017fe98000", "0x1", - "0x48127fe07fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5125,8 +6239,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127feb7fff8000", + "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5139,8 +6254,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5148,20 +6264,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x8de", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xdfc", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5176,7 +6294,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5190,52 +6309,58 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xa7", + "0xb2", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1360", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8e", + "0x96", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x76", - "0x482480017ffc8000", + "0x7c", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5e", - "0x482480017ffc8000", + "0x62", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127fef7fff8000", - "0x48127fed7fff8000", + "0x48127feb7fff8000", + "0x482480017ff98000", + "0x5be", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5244,35 +6369,36 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x38f8", + "0x3f0f", "0x482480017fff8000", - "0x38f7", - "0x480080007fff8000", + "0x3f0e", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0x480080007fff8000", "0x484480017fff8000", "0x2", "0x482480017fff8000", - "0xace4", + "0xc3c8", "0xa0680017fff8000", "0x8", - "0x48307ffe80007fe9", + "0x48307ffe80007ffa", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fe87fff", + "0x400080007fe37fff", "0x10780017fff7fff", - "0x24", - "0x48307ffe80007fe9", - "0x400080007fe97fff", - "0x482480017fe98000", + "0x25", + "0x48307ffe80007ffa", + "0x400080007fe47fff", + "0x482480017fe48000", "0x1", "0x48127ffe7fff8000", "0x480a7ff87fff8000", "0x480a7ffb7fff8000", - "0x48127fe97fff8000", - "0x48127fec7fff8000", - "0x48127fef7fff8000", + "0x48127fe67fff8000", + "0x48127fea7fff8000", + "0x48127fee7fff8000", "0x1104800180018000", - "0x1825", + "0x1b3c", "0x20680017fff7ffd", "0xd", "0x40780017fff7fff", @@ -5288,7 +6414,8 @@ "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x64", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -5301,9 +6428,9 @@ "0x4f7574206f6620676173", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x482480017fe58000", + "0x482480017fe08000", "0x1", - "0x48127fe37fff8000", + "0x48127ff47fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5317,8 +6444,9 @@ "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127ff37fff8000", - "0x48127ff17fff8000", + "0x48127ff07fff8000", + "0x482480017ff98000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5332,8 +6460,9 @@ "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127ff77fff8000", "0x48127ff57fff8000", + "0x482480017ff98000", + "0xa0a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5347,8 +6476,9 @@ "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127ffb7fff8000", - "0x48127ff97fff8000", + "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0xc62", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5364,7 +6494,8 @@ "0x480a7ff87fff8000", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5378,50 +6509,56 @@ "0x100000000000000000000000000000000", "0x400280007ff87fff", "0x10780017fff7fff", - "0xf6", + "0x106", "0x4825800180007ffa", "0x0", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x482480017ffe8000", + "0xa3c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xd9", + "0xe7", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffc8000", + "0xb", + "0x48127ffd7fff8000", + "0x482480017ffa8000", "0x1", - "0x48127ffc7fff8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", - "0x48127ff97fff8000", + "0x48127ff77fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", + "0x9", + "0x48127ffd7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xbb", + "0xc6", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff48003", - "0x480080017ff38003", + "0x480080007ff08003", + "0x480080017fef8003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -5432,43 +6569,47 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027fef7ffd", + "0x400080027feb7ffd", "0x20680017fff7ffe", - "0xa0", + "0xaa", "0x402780017fff7fff", "0x1", - "0x400080007ff47ffe", - "0x482480017ff48000", + "0x400080007ff07ffd", + "0x482480017ff08000", "0x1", - "0x48307ff980007ffa", + "0x48127ffd7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff88000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff58000", "0x1", - "0x48127ff87fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x0", - "0x48127ff57fff8000", + "0x48127ff27fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x81", + "0x88", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff88003", - "0x480080017ff78003", + "0x480080007ff58003", + "0x480080017ff48003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -5479,28 +6620,30 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027ff37ffd", + "0x400080027ff07ffd", "0x20680017fff7ffe", - "0x68", + "0x6c", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ff88000", + "0x400080007ff57ffd", + "0x482480017ff58000", "0x1", - "0x48307ff980007ffa", + "0x48127ffd7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x12", + "0x13", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", "0x480a7ff77fff8000", - "0x48127ffb7fff8000", + "0x48127ffa7fff8000", "0x480a7ff97fff8000", - "0x48127fe47fff8000", + "0x482480017ff98000", + "0x6ea", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5509,40 +6652,41 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x37ef", + "0x3df4", "0x482480017fff8000", - "0x37ee", - "0x480080007fff8000", + "0x3df3", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x480080007fff8000", "0x484480017fff8000", "0x2", "0x482480017fff8000", - "0xb9b4", + "0xc9cc", "0x480080017ffc8000", "0x484480017fff8000", "0x2", "0x48307ffd7fff8000", "0xa0680017fff8000", "0x8", - "0x48307ffe80007fde", + "0x48307ffe80007ff7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff17fff", + "0x400080007fef7fff", "0x10780017fff7fff", - "0x27", - "0x48307ffe80007fde", - "0x400080007ff27fff", - "0x482480017ff28000", + "0x28", + "0x48307ffe80007ff7", + "0x400080007ff07fff", + "0x482480017ff08000", "0x1", "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ff77fff8000", "0x480a7ffb7fff8000", - "0x48127fdd7fff8000", - "0x48127fe27fff8000", - "0x48127fe97fff8000", + "0x48127fd67fff8000", + "0x48127fdc7fff8000", + "0x48127fe67fff8000", "0x1104800180018000", - "0x17da", + "0x1af9", "0x20680017fff7ffd", "0xe", "0x40780017fff7fff", @@ -5560,7 +6704,8 @@ "0x48127ffb7fff8000", "0x48127ff77fff8000", "0x48127ff87fff8000", - "0x48127ff67fff8000", + "0x482480017ff68000", + "0x64", "0x48127ff87fff8000", "0x480680017fff8000", "0x1", @@ -5573,10 +6718,10 @@ "0x4f7574206f6620676173", "0x400080007ffe7fff", "0x480a7ff77fff8000", - "0x482480017fee8000", + "0x482480017fec8000", "0x1", "0x480a7ff97fff8000", - "0x48127fd77fff8000", + "0x48127ff07fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5584,38 +6729,40 @@ "0x482480017ff78000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff38000", + "0x482480017ff08000", "0x3", + "0x482480017ff88000", + "0x276", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x7", - "0x48127ff37fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x8c0", "0x10780017fff7fff", "0xb", - "0x40780017fff7fff", - "0x8", - "0x482480017fe78000", + "0x482480017feb8000", "0x3", + "0x482480017ff88000", + "0x8fc", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0xf", - "0x48127fe77fff8000", + "0x48127ff37fff8000", + "0x482480017ffa8000", + "0xf46", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x17", - "0x48127fe77fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x145a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", "0x480a7ff77fff8000", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff97fff8000", - "0x48127fe07fff8000", + "0x48127ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5632,7 +6779,8 @@ "0x482680017ff88000", "0x1", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x20ee", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5646,17 +6794,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x136", + "0x14f", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x51e", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -5664,7 +6815,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -5672,69 +6824,75 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x10b", + "0x120", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xf9", + "0x10b", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xd9", - "0x482480017ff58000", + "0xea", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x480080007ff38000", - "0x48307ffd80007ffe", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x480080007ff08000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffc8000", + "0xb", + "0x48127ffd7fff8000", + "0x482480017ffa8000", "0x1", - "0x48127ffc7fff8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", - "0x48127ff97fff8000", + "0x48127ff77fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", + "0x9", + "0x48127ffd7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xbb", + "0xc9", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff48003", - "0x480080017ff38003", + "0x480080007ff08003", + "0x480080017fef8003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -5745,43 +6903,47 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027fef7ffd", + "0x400080027feb7ffd", "0x20680017fff7ffe", - "0xa0", + "0xad", "0x402780017fff7fff", "0x1", - "0x400080007ff47ffe", - "0x482480017ff48000", + "0x400080007ff07ffd", + "0x482480017ff08000", "0x1", - "0x48307ff980007ffa", + "0x48127ffd7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff88000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff58000", "0x1", - "0x48127ff87fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x0", - "0x48127ff57fff8000", + "0x48127ff27fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x81", + "0x8b", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff88003", - "0x480080017ff78003", + "0x480080007ff58003", + "0x480080017ff48003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -5792,26 +6954,28 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027ff37ffd", + "0x400080027ff07ffd", "0x20680017fff7ffe", - "0x68", + "0x6f", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ff88000", + "0x400080007ff57ffd", + "0x482480017ff58000", "0x1", - "0x48307ff980007ffa", + "0x48127ffd7fff8000", + "0x48307ff780007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fdb7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5820,52 +6984,55 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x36b8", + "0x3ca8", "0x482480017fff8000", - "0x36b7", - "0x480080007fff8000", + "0x3ca7", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fd9", - "0x2382", + "0x4824800180007ffd", + "0x2e18", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x33", - "0x4824800180007fd9", - "0x2382", - "0x400080007ff87fff", + "0x37", + "0x4824800180007ffd", + "0x2e18", + "0x400080007ff67fff", "0x40780017fff7fff", "0x1", - "0x48127fe77fff8000", - "0x48127fec7fff8000", - "0x48127ff37fff8000", + "0x48127fe07fff8000", + "0x48127fe67fff8000", + "0x48127ff07fff8000", "0x400080007ffc7ffd", "0x400080017ffc7ffe", "0x400080027ffc7fff", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb", - "0x48127ffb7fff8000", - "0x482480017ffa8000", + "0x48127ffa7fff8000", + "0x482480017ff98000", "0x3", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ffb7fff", - "0x400280017ffb7ff6", - "0x400280027ffb7fd5", + "0x400280017ffb7ffa", + "0x400280027ffb7fca", "0x400280037ffb7ffb", "0x400280047ffb7ffc", "0x400280057ffb7ffd", "0x480280077ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280067ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280067ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -5873,8 +7040,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -5887,9 +7056,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127fd47fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5897,36 +7066,38 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff38000", + "0x482480017ff08000", "0x3", + "0x482480017ff88000", + "0x1e", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x7", - "0x48127ff37fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x668", "0x10780017fff7fff", "0xb", - "0x40780017fff7fff", - "0x8", - "0x482480017fe78000", + "0x482480017feb8000", "0x3", + "0x482480017ff88000", + "0x6a4", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0xf", - "0x48127fe77fff8000", + "0x48127ff37fff8000", + "0x482480017ffa8000", + "0xcee", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x17", - "0x48127fe77fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x1202", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fd77fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5934,20 +7105,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x12ca", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x17e8", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5962,7 +7135,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -5976,25 +7150,28 @@ "0x100000000000000000000000000000000", "0x400280007ff87fff", "0x10780017fff7fff", - "0x5a", + "0x5f", "0x4825800180007ffa", "0x0", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x482480017ffe8000", + "0x1acc", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ffa8000", + "0x55a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6003,29 +7180,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3601", + "0x3be4", "0x482480017fff8000", - "0x3600", - "0x480080007fff8000", + "0x3be3", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x480080027fff8000", "0x482480017fff8000", - "0x6a68", + "0x89e4", "0xa0680017fff8000", "0x8", - "0x48307ffe80007ff6", + "0x48307ffe80007ffb", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff57fff", + "0x400080007ff37fff", "0x10780017fff7fff", - "0x21", - "0x48307ffe80007ff6", - "0x400080007ff67fff", + "0x22", + "0x48307ffe80007ffb", + "0x400080007ff47fff", "0x480a7ff97fff8000", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", - "0x171a", - "0x482480017f838000", + "0x1a53", + "0x482480017f778000", "0x1", "0x20680017fff7ffc", "0xd", @@ -6042,7 +7220,8 @@ "0x208b7fff7fff7ffe", "0x48127fff7fff8000", "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x64", "0x48127ff87fff8000", "0x480680017fff8000", "0x1", @@ -6054,10 +7233,10 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff38000", + "0x482480017ff18000", "0x1", "0x480a7ff97fff8000", - "0x48127ff07fff8000", + "0x48127ff57fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6073,7 +7252,8 @@ "0x482680017ff88000", "0x1", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6087,34 +7267,38 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x75", + "0x7c", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1810", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5c", + "0x60", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127ff77fff8000", "0x48127ff57fff8000", + "0x482480017ff98000", + "0x5be", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6123,33 +7307,34 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3589", + "0x3b65", "0x482480017fff8000", - "0x3588", - "0x480080007fff8000", + "0x3b64", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0x480080007fff8000", "0x484480017fff8000", "0x2", "0x482480017fff8000", - "0xddfe", + "0xf9f6", "0xa0680017fff8000", "0x8", - "0x48307ffe80007ff1", + "0x48307ffe80007ffa", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x22", - "0x48307ffe80007ff1", - "0x400080007ff17fff", - "0x482480017ff18000", + "0x23", + "0x48307ffe80007ffa", + "0x400080007fee7fff", + "0x482480017fee8000", "0x1", "0x48127ffe7fff8000", "0x480a7ff87fff8000", "0x480a7ffb7fff8000", - "0x48127ff17fff8000", + "0x48127ff07fff8000", "0x1104800180018000", - "0x17ba", + "0x1b1c", "0x20680017fff7ffd", "0xd", "0x40780017fff7fff", @@ -6165,7 +7350,8 @@ "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x64", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -6178,9 +7364,9 @@ "0x4f7574206f6620676173", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x482480017fed8000", + "0x482480017fea8000", "0x1", - "0x48127feb7fff8000", + "0x48127ff47fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6194,8 +7380,9 @@ "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", "0x480a7ff87fff8000", - "0x48127ffb7fff8000", - "0x48127ff97fff8000", + "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6211,7 +7398,8 @@ "0x480a7ff87fff8000", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6225,33 +7413,37 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x7c", + "0x86", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x19a0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x64", + "0x6b", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6260,22 +7452,23 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3500", + "0x3ad4", "0x482480017fff8000", - "0x34ff", - "0x480080007fff8000", + "0x3ad3", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff4", - "0x10f4", + "0x4824800180007ffd", + "0x2c88", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x30", - "0x4824800180007ff4", - "0x10f4", - "0x400080007ff47fff", + "0x34", + "0x4824800180007ffd", + "0x2c88", + "0x400080007ff17fff", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -6284,25 +7477,27 @@ "0x480680017fff8000", "0x22", "0x400080017ffd7fff", - "0x48127ffd7fff8000", - "0x482480017ffc8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x482480017ffb8000", "0x2", - "0x482480017fef8000", + "0x482480017feb8000", "0x1", "0x480680017fff8000", "0x53656e644d657373616765546f4c31", "0x400280007ffb7fff", - "0x400280017ffb7ff8", - "0x400280027ffb7ff1", + "0x400280017ffb7ffb", + "0x400280027ffb7fef", "0x400280037ffb7ffc", "0x400280047ffb7ffd", "0x480280067ffb8000", "0x20680017fff7fff", - "0xd", + "0xe", + "0x480280057ffb8000", "0x40780017fff7fff", "0x1", - "0x48127ffc7fff8000", - "0x480280057ffb8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -6310,8 +7505,10 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0x9", "0x480680017fff8000", @@ -6324,9 +7521,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fef7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6339,8 +7536,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6355,7 +7553,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6369,27 +7568,30 @@ "0x100000000000000000000000000000000", "0x400280007ff67fff", "0x10780017fff7fff", - "0x69", + "0x6e", "0x4825800180007ffa", "0x0", "0x400280007ff67fff", "0x482680017ff68000", "0x1", + "0x482480017ffe8000", + "0x1874", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x13", + "0x14", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", - "0x48127ff77fff8000", + "0x482480017ff88000", + "0x6ea", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6398,37 +7600,38 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3476", + "0x3a40", "0x482480017fff8000", - "0x3475", - "0x480080007fff8000", + "0x3a3f", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x480080047fff8000", "0x484480017fff8000", "0x2", "0x482480017fff8000", - "0x13e40", + "0x15c2c", "0x480080057ffc8000", "0x484480017fff8000", "0x4", "0x48307ffd7fff8000", "0xa0680017fff8000", "0x8", - "0x48307ffe80007ff2", + "0x48307ffe80007ff7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff17fff", + "0x400080007fef7fff", "0x10780017fff7fff", - "0x26", - "0x48307ffe80007ff2", - "0x400080007ff27fff", - "0x482480017ff28000", + "0x27", + "0x48307ffe80007ff7", + "0x400080007ff07fff", + "0x482480017ff08000", "0x1", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ff77fff8000", "0x48127ffb7fff8000", "0x1104800180018000", - "0x17c7", + "0x1b4f", "0x20680017fff7ffd", "0xf", "0x40780017fff7fff", @@ -6448,7 +7651,8 @@ "0x48127ffa7fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x64", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6460,12 +7664,12 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fef8000", + "0x482480017fed8000", "0x1", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", - "0x48127fea7fff8000", + "0x48127fef7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6483,7 +7687,8 @@ "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x208a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6497,25 +7702,28 @@ "0x100000000000000000000000000000000", "0x400280007ff87fff", "0x10780017fff7fff", - "0x66", + "0x70", "0x4825800180007ffa", "0x0", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x482480017ffe8000", + "0x1b94", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", "0x480a7ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6524,58 +7732,65 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x33f8", + "0x39bc", "0x482480017fff8000", - "0x33f7", - "0x480080007fff8000", + "0x39bb", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff8", - "0x0", + "0x4824800180007ffd", + "0x1864", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", - "0x2f", - "0x4824800180007ff8", - "0x0", - "0x400080007ff87fff", + "0x35", + "0x4824800180007ffd", + "0x1864", + "0x400080007ff67fff", "0x480a7ff97fff8000", "0x1104800180018000", - "0x1912", - "0x482480017fe88000", + "0x1ce0", + "0x482480017fe68000", "0x1", - "0x20680017fff7ffc", - "0x17", - "0x48127ffb7fff8000", + "0x48127fee7fff8000", + "0x20680017fff7ffb", + "0x1a", + "0x48127ffa7fff8000", "0x1104800180018000", - "0x190b", - "0x20680017fff7ffd", - "0xd", + "0x1cd8", + "0x48127fef7fff8000", + "0x20680017fff7ffc", + "0xe", "0x40780017fff7fff", "0x1", - "0x48127fee7fff8000", - "0x48127ffa7fff8000", - "0x48127fdb7fff8000", + "0x48127fec7fff8000", + "0x48127ff97fff8000", + "0x482480017ffc8000", + "0x190", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", "0x48127ffa7fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", - "0x48127ffc7fff8000", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x7", + "0x9", "0x40780017fff7fff", - "0x10", - "0x48127feb7fff8000", - "0x48127fec7fff8000", - "0x48127fec7fff8000", - "0x48127fec7fff8000", - "0x48127ffc7fff8000", - "0x48127fd97fff8000", + "0x11", + "0x48127fe97fff8000", + "0x482480017fed8000", + "0xb56", + "0x48127fe97fff8000", + "0x48127fe97fff8000", + "0x48127fe97fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6587,10 +7802,10 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", "0x480a7ff97fff8000", - "0x48127ff27fff8000", + "0x48127ff77fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6606,7 +7821,8 @@ "0x482680017ff88000", "0x1", "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x2152", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6622,17 +7838,20 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xf2", + "0x106", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17c", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -6640,7 +7859,8 @@ "0x0", "0x480280007ffc8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -6648,89 +7868,97 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xc7", - "0x40137fff7fff8000", + "0xd7", + "0x40137fff7fff8001", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4825800180048000", + "0x4825800180048001", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xb4", + "0xc1", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48317fff80008000", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48317fff80008001", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x97", - "0x400180007ff58001", - "0x482480017ff58000", + "0xa2", + "0x400180007ff38000", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x48307ffe80007fff", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x6e", + "0x75", "0x40780017fff7fff", "0x1", - "0x48127ff67fff8000", - "0x48127fe97fff8000", + "0x48127ff37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x323", + "0x3c0", "0x20680017fff7ffa", - "0x59", - "0x20680017fff7ffd", - "0x53", - "0x48307ffb80007ffc", + "0x5f", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x57", + "0x48127fff7fff8000", + "0x48307ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffb8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6739,31 +7967,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3321", + "0x38d1", "0x482480017fff8000", - "0x3320", - "0x480080007fff8000", + "0x38d0", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff3", - "0xb48c", + "0x4824800180007ffd", + "0x118dc", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fed7fff", "0x10780017fff7fff", - "0x23", - "0x4824800180007ff3", - "0xb48c", - "0x400080007ff17fff", + "0x24", + "0x4824800180007ffd", + "0x118dc", + "0x400080007fee7fff", "0x48127fff7fff8000", "0x480a7ffb7fff8000", - "0x480a80007fff8000", "0x480a80017fff8000", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x480a80007fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", "0x1104800180018000", - "0x1857", - "0x482480017fc18000", + "0x1c11", + "0x482480017f9f8000", "0x1", "0x20680017fff7ffc", "0xc", @@ -6778,7 +8007,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127fff7fff8000", - "0x48127ff97fff8000", + "0x482480017ff98000", + "0x64", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -6790,9 +8020,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017feb8000", "0x1", - "0x48127fee7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6800,20 +8030,23 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x492", "0x10780017fff7fff", - "0xc", - "0x48127ff87fff8000", + "0xe", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x7b2", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x48127ff77fff8000", - "0x48127fea7fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0x102c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -6833,8 +8066,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fef7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x159a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6842,20 +8076,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x159a", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x1b12", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fef7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6870,7 +8106,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x213e", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6884,33 +8121,37 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x5e", + "0x65", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x19a0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x46", + "0x4a", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6919,28 +8160,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x326d", + "0x3810", "0x482480017fff8000", - "0x326c", - "0x480080007fff8000", + "0x380f", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff4", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x12", - "0x4824800180007ff4", + "0x13", + "0x4824800180007ffd", "0x0", - "0x400080007ff47fff", + "0x400080007ff17fff", "0x40780017fff7fff", "0x1", - "0x400080007fff7ff7", - "0x482480017ff38000", + "0x400080007fff7ff6", + "0x482480017ff08000", "0x1", - "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x12c", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -6953,9 +8196,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fef7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6968,8 +8211,104 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482680017ff98000", + "0x1", + "0x482680017ffa8000", + "0x21b6", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0xa0680017fff8000", + "0x7", + "0x482680017ffa8000", + "0x100000000000000000000000000000000", + "0x400280007ff97fff", + "0x10780017fff7fff", + "0x4a", + "0x4825800180007ffa", + "0x0", + "0x400280007ff97fff", + "0x482680017ff98000", + "0x1", + "0x482480017ffe8000", + "0x1bf8", + "0x48297ffc80007ffd", + "0x20680017fff7fff", + "0x4", + "0x10780017fff7fff", + "0x11", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", + "0x400080007ffe7fff", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x492", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffa7fff8000", + "0x482480017ff98000", + "0x1", + "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x37a0", + "0x482480017fff8000", + "0x379f", + "0x48127ffb7fff8000", + "0x480080007ffe8000", + "0xa0680017fff8000", + "0x9", + "0x4824800180007ffd", + "0x0", + "0x482480017fff8000", + "0x100000000000000000000000000000000", + "0x400080007ff57fff", + "0x10780017fff7fff", + "0x11", + "0x4824800180007ffd", + "0x0", + "0x400080007ff67fff", + "0x40780017fff7fff", + "0x1", + "0x482480017ff58000", + "0x1", + "0x482480017ffd8000", + "0x190", + "0x480a7ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffb7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x4f7574206f6620676173", + "0x400080007ffe7fff", + "0x482480017ff38000", + "0x1", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6984,7 +8323,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -6998,41 +8338,46 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x74", + "0x7d", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x17ac", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5c", + "0x62", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x46", - "0x482480017ffd8000", + "0x4a", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x480080007ffb8000", - "0x48307ffd80007ffe", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480080007ff98000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff37fff8000", + "0x48127ff27fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7041,28 +8386,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x31f3", + "0x372e", "0x482480017fff8000", - "0x31f2", - "0x480080007fff8000", + "0x372d", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff1", + "0x4824800180007ffd", "0x0", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff07fff", + "0x400080007fec7fff", "0x10780017fff7fff", - "0x12", - "0x4824800180007ff1", + "0x13", + "0x4824800180007ffd", "0x0", - "0x400080007ff17fff", + "0x400080007fed7fff", "0x40780017fff7fff", "0x1", - "0x400080007fff7ff7", - "0x482480017ff08000", + "0x400080007fff7ff6", + "0x482480017fec8000", "0x1", - "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x12c", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -7075,9 +8422,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fee8000", + "0x482480017fea8000", "0x1", - "0x48127fec7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7090,8 +8437,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff97fff8000", "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7104,8 +8452,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x87a", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7120,7 +8469,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7134,86 +8484,95 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0xcd", + "0xdf", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0xf6e", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xb5", + "0xc4", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x480080007ffa8000", + "0x480080007ff88000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x8c", + "0x98", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff37ffc", - "0x480080017ff27ffc", + "0x480080007fef7ffc", + "0x480080017fee7ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff17ffd", + "0x400080027fed7ffd", "0x10780017fff7fff", - "0x7a", + "0x83", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff47ffd", - "0x480080017ff37ffd", + "0x48307fff80007ffc", + "0x480080007ff07ffd", + "0x480080017fef7ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff27ffe", - "0x482480017ff28000", + "0x400080027fee7ffe", + "0x482480017fee8000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5d", - "0x482480017ff58000", + "0x64", + "0x482480017ff38000", "0x1", - "0x48127ff57fff8000", - "0x480080007ff38000", - "0x48307ffd80007ffe", + "0x48127ff37fff8000", + "0x48127ffc7fff8000", + "0x480080007ff08000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127fe87fff8000", + "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7222,41 +8581,44 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x313e", + "0x366b", "0x482480017fff8000", - "0x313d", - "0x480080007fff8000", + "0x366a", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007fe6", - "0x17a2", + "0x4824800180007ffd", + "0x2a94", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff37fff", + "0x400080007ff07fff", "0x10780017fff7fff", - "0x29", - "0x4824800180007fe6", - "0x17a2", - "0x400080007ff47fff", + "0x2d", + "0x4824800180007ffd", + "0x2a94", + "0x400080007ff17fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff38000", + "0x482480017fef8000", "0x1", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", "0x400280017ffb7ffc", "0x400280027ffb7ffd", - "0x400280037ffb7feb", - "0x400280047ffb7ff5", + "0x400280037ffb7fe6", + "0x400280047ffb7ff3", "0x480280067ffb8000", "0x20680017fff7fff", - "0xf", + "0x10", + "0x480280057ffb8000", "0x40780017fff7fff", "0x1", - "0x400080007fff7ff3", - "0x48127ffc7fff8000", - "0x480280057ffb8000", + "0x400080007fff7ff0", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -7265,8 +8627,10 @@ "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0xc8", "0x482680017ffb8000", "0x9", "0x480680017fff8000", @@ -7279,9 +8643,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017ff18000", + "0x482480017fee8000", "0x1", - "0x48127fe17fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7294,8 +8658,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127fec7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7303,20 +8668,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff18000", + "0x482480017fed8000", "0x3", + "0x482480017ff88000", + "0x686", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff17fff8000", + "0x48127ff47fff8000", + "0x482480017ffa8000", + "0xba4", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fec7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7329,8 +8696,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x10b8", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7345,7 +8713,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7359,42 +8728,47 @@ "0x100000000000000000000000000000000", "0x400280007ff97fff", "0x10780017fff7fff", - "0x8f", + "0x9b", "0x4825800180007ffa", "0x0", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x482480017ffe8000", + "0x1748", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x77", + "0x80", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x60", - "0x482480017ffc8000", + "0x67", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff27fff8000", + "0x48127ff17fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7403,28 +8777,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x3089", + "0x35a7", "0x482480017fff8000", - "0x3088", - "0x480080007fff8000", + "0x35a6", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007ff0", - "0x11bc", + "0x4824800180007ffd", + "0x2b5c", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fef7fff", + "0x400080007feb7fff", "0x10780017fff7fff", - "0x2c", - "0x4824800180007ff0", - "0x11bc", - "0x400080007ff07fff", + "0x30", + "0x4824800180007ffd", + "0x2b5c", + "0x400080007fec7fff", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", - "0x48307ff67ff28000", - "0x482480017fed8000", + "0x48307ff47fef8000", + "0x482480017fe88000", "0x1", "0x480680017fff8000", "0x53746f726167655772697465", @@ -7435,12 +8811,13 @@ "0x400280047ffb7ffd", "0x480280067ffb8000", "0x20680017fff7fff", - "0xf", + "0x10", + "0x480280057ffb8000", "0x40780017fff7fff", "0x1", - "0x400080007fff7fed", - "0x48127ffc7fff8000", - "0x480280057ffb8000", + "0x400080007fff7fe9", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x482680017ffb8000", "0x7", "0x480680017fff8000", @@ -7449,8 +8826,10 @@ "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffd7fff8000", "0x480280057ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0xc8", "0x482680017ffb8000", "0x9", "0x480680017fff8000", @@ -7463,9 +8842,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fed8000", + "0x482480017fe98000", "0x1", - "0x48127feb7fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7478,8 +8857,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ff87fff8000", "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7492,8 +8872,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7508,7 +8889,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -7519,19 +8901,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ff88000", - "0xfffffffffffffffffffffffffffff6be", + "0xfffffffffffffffffffffffffffff592", "0x400280007ff77fff", "0x10780017fff7fff", - "0x43", + "0x49", "0x4825800180007ff8", - "0x942", + "0xa6e", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xd", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xe", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0xad2", "0x480680017fff8000", "0x0", "0x480a7ff97fff8000", @@ -7541,11 +8925,13 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x48297ff980007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ff98000", "0x1", "0x480a7ffa7fff8000", @@ -7553,7 +8939,8 @@ "0x0", "0x480280007ff98000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", @@ -7563,8 +8950,8 @@ "0x20680017fff7ffe", "0xf", "0x400280007ffc7fff", + "0x48127ff77fff8000", "0x48127ffa7fff8000", - "0x48127ff87fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x480a7ffb7fff8000", @@ -7573,10 +8960,11 @@ "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc9", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc4", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -7611,15 +8999,16 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff97a", + "0xfffffffffffffffffffffffffffff916", "0x400280007ff87fff", "0x10780017fff7fff", - "0x20", + "0x22", "0x4825800180007ff9", - "0x686", + "0x6ea", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", @@ -7627,8 +9016,8 @@ "0xf", "0x480280007ffc8000", "0x400280007ffb7fff", - "0x48127ffd7fff8000", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x482680017ffb8000", "0x1", @@ -7636,10 +9025,11 @@ "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", "0x208b7fff7fff7ffe", - "0x48127ffe7fff8000", - "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x686", "0x480680017fff8000", "0x0", "0x480a7ffa7fff8000", @@ -7662,15 +9052,16 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff97a", + "0xfffffffffffffffffffffffffffff916", "0x400280007ff87fff", "0x10780017fff7fff", - "0x20", + "0x22", "0x4825800180007ff9", - "0x686", + "0x6ea", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", @@ -7678,8 +9069,8 @@ "0xf", "0x480280007ffa8000", "0x400280007ffd7fff", - "0x48127ffd7fff8000", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x482680017ffa8000", "0x1", "0x480a7ffb7fff8000", @@ -7687,10 +9078,11 @@ "0x482680017ffd8000", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", "0x208b7fff7fff7ffe", - "0x48127ffe7fff8000", - "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x686", "0x480680017fff8000", "0x0", "0x480a7ffc7fff8000", @@ -7720,38 +9112,41 @@ "0x1", "0x480680017fff8000", "0x456d69744576656e74", - "0x400280007ffc7fff", - "0x400380017ffc7ffb", - "0x400280027ffc7ffd", - "0x400280037ffc7ffe", - "0x400280047ffc7ffd", - "0x400280057ffc7ffe", - "0x480280077ffc8000", + "0x400280007ffb7fff", + "0x400380017ffb7ffa", + "0x400280027ffb7ffd", + "0x400280037ffb7ffe", + "0x400280047ffb7ffd", + "0x400280057ffb7ffe", + "0x480280077ffb8000", "0x20680017fff7fff", - "0x55", - "0x480280067ffc8000", + "0x6f", + "0x480280067ffb8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x5265706c616365436c617373", - "0x400280087ffc7fff", - "0x400280097ffc7ffe", - "0x4003800a7ffc7ffd", - "0x4802800c7ffc8000", + "0x400280087ffb7fff", + "0x400280097ffb7ffe", + "0x4003800a7ffb7ffc", + "0x4802800c7ffb8000", "0x20680017fff7fff", - "0x42", - "0x4802800b7ffc8000", + "0x59", + "0x4802800b7ffb8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x11", "0x480680017fff8000", "0x53656e644d657373616765546f4c31", - "0x4002800d7ffc7fff", - "0x4002800e7ffc7ffd", - "0x4002800f7ffc7ffe", - "0x400280107ffc7ff6", - "0x400280117ffc7ff7", - "0x480280137ffc8000", + "0x4002800d7ffb7fff", + "0x4002800e7ffb7ffd", + "0x4002800f7ffb7ffe", + "0x400280107ffb7ff4", + "0x400280117ffb7ff5", + "0x480280137ffb8000", "0x20680017fff7fff", - "0x2b", - "0x480280127ffc8000", + "0x3f", + "0x480280127ffb8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -7760,22 +9155,39 @@ "0x11", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400280147ffc7fff", - "0x400280157ffc7ffb", - "0x400280167ffc7ffc", - "0x400280177ffc7ffd", - "0x400280187ffc7ffe", - "0x4802801a7ffc8000", + "0x400280147ffb7fff", + "0x400280157ffb7ffb", + "0x400280167ffb7ffc", + "0x400280177ffb7ffd", + "0x400280187ffb7ffe", + "0x4802801a7ffb8000", "0x20680017fff7fff", - "0x10", + "0x21", + "0x480280197ffb8000", + "0x482680017ffb8000", + "0x1b", + "0x48127ffe7fff8000", + "0x20780017fff7ffd", + "0xe", + "0x40780017fff7fff", + "0x2", + "0x482480017ffd8000", + "0xb4", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x746573745f7265766572745f68656c706572", "0x400080007ffe7fff", - "0x480280197ffc8000", - "0x482680017ffc8000", - "0x1b", + "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -7783,94 +9195,235 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2", - "0x480280197ffc8000", - "0x482680017ffc8000", + "0x4", + "0x480280197ffb8000", + "0x482480017fff8000", + "0x1cc", + "0x482680017ffb8000", "0x1d", "0x480680017fff8000", "0x1", - "0x4802801b7ffc8000", - "0x4802801c7ffc8000", + "0x4802801b7ffb8000", + "0x4802801c7ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x8", - "0x480280127ffc8000", - "0x482680017ffc8000", + "0xb", + "0x480280127ffb8000", + "0x482480017fff8000", + "0x2daa", + "0x482680017ffb8000", "0x16", "0x480680017fff8000", "0x1", - "0x480280147ffc8000", - "0x480280157ffc8000", + "0x480280147ffb8000", + "0x480280157ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xc", - "0x4802800b7ffc8000", - "0x482680017ffc8000", + "0x10", + "0x4802800b7ffb8000", + "0x482480017fff8000", + "0x58d4", + "0x482680017ffb8000", "0xf", "0x480680017fff8000", "0x1", - "0x4802800d7ffc8000", - "0x4802800e7ffc8000", + "0x4802800d7ffb8000", + "0x4802800e7ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xf", - "0x480280067ffc8000", - "0x482680017ffc8000", + "0x14", + "0x480280067ffb8000", + "0x482480017fff8000", + "0x82dc", + "0x482680017ffb8000", "0xa", "0x480680017fff8000", "0x1", - "0x480280087ffc8000", - "0x480280097ffc8000", + "0x480280087ffb8000", + "0x480280097ffb8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x25ff849c52d40a7f29c9849fbe0064575d61c84ddc0ef562bf05bc599abe0ae", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x400280007ffb7fff", + "0x400380017ffb7ffa", + "0x400380027ffb7ffc", + "0x400280037ffb7ffe", + "0x400280047ffb7ffd", + "0x400280057ffb7ffd", + "0x480280077ffb8000", + "0x20680017fff7fff", + "0x69", + "0x480280067ffb8000", + "0x40780017fff7fff", + "0x1", + "0x400180007fff7ffd", + "0x480680017fff8000", + "0x1", + "0x400080017ffe7fff", + "0x48127ffd7fff8000", + "0x480680017fff8000", + "0x1e4089d1f1349077b1970f9937c904e27c4582b49a60b6078946dba95bc3c08", + "0x48127ffc7fff8000", + "0x482480017ffb8000", + "0x2", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x4002800a7ffb7fff", + "0x4002800b7ffb7ffb", + "0x4003800c7ffb7ffc", + "0x4002800d7ffb7ffc", + "0x4002800e7ffb7ffd", + "0x4002800f7ffb7ffe", + "0x480280117ffb8000", + "0x20680017fff7fff", + "0x14", + "0x40780017fff7fff", + "0xa", + "0x480280107ffb8000", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x73686f756c645f70616e6963", + "0x400080007ffe7fff", + "0x482480017ffd8000", + "0x2c88", + "0x482680017ffb8000", + "0x14", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x480280107ffb8000", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400280147ffb7fff", + "0x400280157ffb7ffc", + "0x400280167ffb7ffd", + "0x400280177ffb7ffe", + "0x480280197ffb8000", + "0x20680017fff7fff", + "0x24", + "0x480280187ffb8000", + "0x4802801a7ffb8000", + "0x4824800180007fff", + "0xa", + "0x482680017ffb8000", + "0x1b", + "0x48127ffc7fff8000", + "0x20680017fff7ffd", + "0xe", + "0x40780017fff7fff", + "0x2", + "0x482480017ffd8000", + "0xb4", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x57726f6e675f73746f726167655f76616c75652e", + "0x400080007ffe7fff", + "0x48127ffd7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x6", + "0x480280187ffb8000", + "0x482480017fff8000", + "0x280", + "0x482680017ffb8000", + "0x1c", + "0x480680017fff8000", + "0x1", + "0x4802801a7ffb8000", + "0x4802801b7ffb8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x15", + "0x480280067ffb8000", + "0x482480017fff8000", + "0x5b5e", + "0x482680017ffb8000", + "0xa", + "0x480680017fff8000", + "0x1", + "0x480280087ffb8000", + "0x480280097ffb8000", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0x7", "0x482680017ff68000", - "0xffffffffffffffffffffffffffffcb80", + "0xffffffffffffffffffffffffffffca54", "0x400280007ff57fff", "0x10780017fff7fff", - "0x56", + "0x5d", "0x4825800180007ff6", - "0x3480", + "0x35ac", "0x400280007ff57fff", "0x482680017ff58000", "0x1", + "0x48127ffe7fff8000", "0x48297ffb80007ff8", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x43", + "0x48", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x456d69744576656e74", "0x400280007ff77fff", - "0x400280017ff77ffc", + "0x400280017ff77ffe", "0x400380027ff77ffc", "0x400380037ff77ffd", "0x400380047ff77ff9", "0x400380057ff77ffa", "0x480280077ff78000", "0x20680017fff7fff", - "0x2f", + "0x31", + "0x480280067ff78000", "0x480680017fff8000", "0x1", - "0x480280067ff78000", "0x482680017ff78000", "0x8", + "0x48127ffd7fff8000", "0xa0680017fff8000", "0x8", "0x48327ffc7ff88000", "0x4824800180007fff", "0x10000000000000000", - "0x400080007ff67fff", + "0x400080007ff37fff", "0x10780017fff7fff", "0x13", "0x48327ffc7ff88001", "0x4824800180007fff", "0xffffffffffffffff0000000000000000", - "0x400080007ff67ffe", - "0x482480017ff68000", + "0x400080007ff37ffe", + "0x482480017ff38000", "0x1", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ff97fff8000", "0x48127ffc7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", @@ -7878,25 +9431,28 @@ "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffca", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x7536345f616464204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ff48000", + "0x482480017ff18000", "0x1", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff98000", + "0x5be", + "0x48127ff77fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffc7fff8000", "0x480280067ff78000", + "0x48127ff97fff8000", + "0x482480017ffe8000", + "0xa50", "0x482680017ff78000", "0xa", "0x480680017fff8000", @@ -7904,8 +9460,9 @@ "0x480280087ff78000", "0x480280097ff78000", "0x208b7fff7fff7ffe", - "0x48127ffe7fff8000", - "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x3548", "0x480a7ff77fff8000", "0x480680017fff8000", "0x0", @@ -8139,33 +9696,37 @@ "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x44b", - "0x400380007ffc8003", + "0x489", + "0x400380007ffc8001", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x48307ffe80007fff", + "0x480a7ffb7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x480080007ffa8000", + "0x480080007ff88000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x405", + "0x43f", "0x40137fff7fff8002", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", "0x4825800180048002", @@ -8179,7 +9740,7 @@ "0xffffffffffffffeeffffffffffffffff", "0x400280027ffa7ffd", "0x10780017fff7fff", - "0x3f2", + "0x429", "0x484480017fff8001", "0x8000000000000000000000000000000", "0x48317fff80008002", @@ -8190,32 +9751,36 @@ "0x400280027ffa7ffe", "0x482680017ffa8000", "0x3", - "0x48307ff680007ff7", + "0x48127ff97fff8000", + "0x48307ff480007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff58000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff28000", "0x1", - "0x48127ff57fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x0", - "0x48127ff27fff8000", + "0x48127fef7fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x3a6", + "0x3d9", "0x400180007fff8000", + "0x48127ffb7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff98003", - "0x480080017ff88003", + "0x480080007ff68003", + "0x480080017ff58003", "0x4844800180017ffe", "0x100000000000000000000000000000000", "0x483180017ffd8000", @@ -8229,97 +9794,109 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x20680017fff7ffe", - "0x38d", + "0x3bd", "0x402780017fff7fff", "0x1", - "0x400180007ff98000", - "0x482480017ff98000", + "0x400180007ff68000", + "0x482480017ff68000", "0x1", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x1104800180018000", - "0x1399", - "0x20680017fff7ffa", - "0x357", - "0x20680017fff7ffd", - "0x32a", - "0x40137ffe7fff8005", - "0x40137fff7fff8006", - "0x48307ffb80007ffc", + "0x16a7", + "0x48127fd97fff8000", + "0x20680017fff7ff9", + "0x385", + "0x48127fff7fff8000", + "0x20680017fff7ffb", + "0x356", + "0x40137ffc7fff8005", + "0x40137ffd7fff8006", + "0x48127fff7fff8000", + "0x48307ff880007ff9", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x2f8", - "0x482480017ffa8000", + "0x322", + "0x482480017ff78000", "0x1", - "0x48127ffa7fff8000", - "0x400180007ff88007", - "0x48307ffe80007fff", + "0x48127ff77fff8000", + "0x48127ffc7fff8000", + "0x400180007ff48004", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x2c4", - "0x482480017ffd8000", + "0x2ec", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x400180007ffb8004", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x400180007ff98003", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x290", - "0x400180007ffd8001", - "0x482480017ffd8000", + "0x2b6", + "0x400180007ffc8007", + "0x482480017ffc8000", "0x1", - "0x48127ffd7fff8000", - "0x48307ffe80007fff", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48307ffd80007ffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffd8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ffb8000", "0x1", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x248", + "0x26a", "0x40780017fff7fff", "0x1", - "0x48127fea7fff8000", - "0x480a7ffb7fff8000", + "0x48127fe37fff8000", + "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x480080007ff88000", "0x1104800180018000", - "0x1411", + "0x1717", "0x20680017fff7ffa", - "0x210", - "0x20680017fff7ffd", - "0xa", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x231", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0xb", + "0x48127fff7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x0", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x10780017fff7fff", - "0xa", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0xc", + "0x482480017fff8000", + "0x64", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8327,36 +9904,40 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffd", - "0x1f6", - "0x48307ffb80007ffc", + "0x212", + "0x48127ffa7fff8000", + "0x48307ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffa8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff88000", "0x1", - "0x48127ffa7fff8000", + "0x48127ff87fff8000", "0x480680017fff8000", "0x0", - "0x48127ff77fff8000", + "0x48127ff57fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x1b4", + "0x1cc", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007fec8003", - "0x480080017feb8003", + "0x480080007fe78003", + "0x480080017fe68003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffb", + "0x483080017ffd7ffa", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -8367,154 +9948,166 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027fe77ffd", + "0x400080027fe27ffd", "0x20680017fff7ffe", - "0x19b", + "0x1b0", "0x402780017fff7fff", "0x1", - "0x400080007fec7ffe", - "0x482480017fec8000", + "0x400080007fe77ffd", + "0x482480017fe78000", "0x1", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", "0x1104800180018000", - "0x130f", - "0x20680017fff7ffa", - "0x165", - "0x20680017fff7ffd", - "0x138", - "0x48307ffb80007ffc", + "0x160d", + "0x48127fd97fff8000", + "0x20680017fff7ff9", + "0x178", + "0x48127fff7fff8000", + "0x20680017fff7ffb", + "0x149", + "0x48127fff7fff8000", + "0x48307ff880007ff9", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ffa8000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff68000", "0x1", - "0x48127ffa7fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x0", - "0x48127ff77fff8000", + "0x48127ff37fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xf6", + "0x103", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x12", - "0x4824800180007ffe", + "0x4824800180007ffd", "0x100000000", "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007fef7fff", + "0x480080007fea7fff", "0x482480017ffe8000", "0xefffffffffffffde00000000ffffffff", - "0x480080017fed7fff", - "0x400080027fec7ffb", + "0x480080017fe87fff", + "0x400080027fe77ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0xe1", + "0xeb", "0x402780017fff7fff", "0x1", - "0x400080007ff27ffe", - "0x482480017ffe8000", + "0x400080007fed7ffd", + "0x482480017ffd8000", "0xffffffffffffffffffffffff00000000", - "0x400080017ff17fff", - "0x482480017ff18000", + "0x400080017fec7fff", + "0x482480017fec8000", "0x2", - "0x48307ff880007ff9", + "0x48127ffc7fff8000", + "0x48307ff680007ff7", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff78000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff48000", "0x1", - "0x48127ff77fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", - "0x48127ff47fff8000", + "0x48127ff17fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x97", + "0x9d", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x12", - "0x4824800180007ffe", + "0x4824800180007ffd", "0x100000000", "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007ff57fff", + "0x480080007ff27fff", "0x482480017ffe8000", "0xefffffffffffffde00000000ffffffff", - "0x480080017ff37fff", - "0x400080027ff27ffb", + "0x480080017ff07fff", + "0x400080027fef7ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0x82", + "0x85", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ffe8000", + "0x400080007ff57ffd", + "0x482480017ffd8000", "0xffffffffffffffffffffffff00000000", - "0x400080017ff77fff", - "0x482480017ff78000", + "0x400080017ff47fff", + "0x482480017ff48000", "0x2", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x1104800180018000", - "0x12ab", - "0x20680017fff7ffa", - "0x49", - "0x20680017fff7ffd", + "0x159f", + "0x48127fd87fff8000", + "0x20680017fff7ff9", + "0x4a", + "0x48127fff7fff8000", + "0x20680017fff7ffb", "0x1c", - "0x48127ff97fff8000", - "0x48127f917fff8000", + "0x48127ff77fff8000", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x0", - "0x480a80037fff8000", + "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80007fff8000", "0x480a80057fff8000", "0x480a80067fff8000", - "0x480a80077fff8000", "0x480a80047fff8000", - "0x480a80017fff8000", - "0x48127f8e7fff8000", - "0x48127f8e7fff8000", - "0x48127f937fff8000", - "0x48127fb77fff8000", - "0x48127fb77fff8000", - "0x48127fbc7fff8000", - "0x48127fc47fff8000", - "0x48127fe97fff8000", - "0x48127fe97fff8000", + "0x480a80037fff8000", + "0x480a80077fff8000", + "0x48127f817fff8000", + "0x48127f817fff8000", + "0x48127f887fff8000", + "0x48127fad7fff8000", + "0x48127fad7fff8000", + "0x48127fb67fff8000", + "0x48127fc17fff8000", + "0x48127fe77fff8000", + "0x48127fe77fff8000", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x48127f917fff8000", + "0x48127ff77fff8000", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8552,8 +10145,9 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x48127f917fff8000", + "0x48127ff87fff8000", + "0x482480017ffe8000", + "0xc8", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8592,21 +10186,24 @@ "0x0", "0x480680017fff8000", "0x0", - "0x48127fe97fff8000", - "0x48127fe97fff8000", + "0x48127fe87fff8000", + "0x48127fe87fff8000", "0x208b7fff7fff7ffe", - "0x482480017ff28000", + "0x482480017fef8000", "0x3", + "0x482480017ff78000", + "0x1248", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", - "0x8", - "0x48127ff27fff8000", - "0x48127fb17fff8000", + "0x9", + "0x48127fef7fff8000", + "0x482480017ff18000", + "0x1770", "0x480680017fff8000", "0x0", - "0x48127ff17fff8000", - "0x48127ff17fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8644,18 +10241,21 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x482480017fec8000", + "0x482480017fe78000", "0x3", + "0x482480017ff78000", + "0x1978", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", - "0x8", - "0x48127fec7fff8000", - "0x48127fba7fff8000", + "0x9", + "0x48127fe77fff8000", + "0x482480017ff18000", + "0x1ea0", "0x480680017fff8000", "0x0", - "0x48127ff17fff8000", - "0x48127ff17fff8000", + "0x48127ff07fff8000", + "0x48127ff07fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8693,12 +10293,13 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x48127fc77fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x2346", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8736,8 +10337,9 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x48127fc77fff8000", + "0x48127ff87fff8000", + "0x482480017ffe8000", + "0x240e", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8776,21 +10378,24 @@ "0x0", "0x480680017fff8000", "0x0", - "0x48127fe97fff8000", - "0x48127fe97fff8000", + "0x48127fe87fff8000", + "0x48127fe87fff8000", "0x208b7fff7fff7ffe", - "0x482480017fe78000", + "0x482480017fe28000", "0x3", + "0x482480017ff88000", + "0x341c", "0x10780017fff7fff", - "0x5", - "0x40780017fff7fff", "0x7", - "0x48127fe77fff8000", - "0x48127fe77fff8000", + "0x40780017fff7fff", + "0x8", + "0x48127fe27fff8000", + "0x482480017ff28000", + "0x39b2", "0x480680017fff8000", "0x0", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8828,14 +10433,16 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff17fff8000", + "0x482480017ff98000", + "0x3c5a", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x10780017fff7fff", - "0x31", - "0x48127ff87fff8000", + "0x33", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x4236", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8877,8 +10484,9 @@ "0x48127fe97fff8000", "0x48127fe97fff8000", "0x208b7fff7fff7ffe", - "0x48127feb7fff8000", - "0x480a7ffb7fff8000", + "0x48127fe47fff8000", + "0x482480017ffa8000", + "0x4b14", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffc7fff8000", @@ -8924,12 +10532,13 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff27fff8000", - "0x480a7ffb7fff8000", + "0x48127fed7fff8000", + "0x482480017ffd8000", + "0x514a", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -8967,12 +10576,13 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff57fff8000", - "0x480a7ffb7fff8000", + "0x48127ff17fff8000", + "0x482480017ffd8000", + "0x5398", "0x480680017fff8000", "0x0", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9010,12 +10620,13 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x480a7ffb7fff8000", + "0x48127ff57fff8000", + "0x482480017ffd8000", + "0x55e6", "0x480680017fff8000", "0x0", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9053,12 +10664,13 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x480a7ffb7fff8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x582a", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9096,8 +10708,9 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x480a7ffb7fff8000", + "0x48127ff87fff8000", + "0x482480017ffe8000", + "0x58f2", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9136,21 +10749,24 @@ "0x0", "0x480680017fff8000", "0x0", - "0x48127fe97fff8000", - "0x48127fe97fff8000", + "0x48127fe87fff8000", + "0x48127fe87fff8000", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x6900", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", - "0x480a7ffb7fff8000", + "0x7", + "0x48127ff17fff8000", + "0x482480017ff38000", + "0x6e96", "0x480680017fff8000", "0x0", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9190,16 +10806,19 @@ "0x208b7fff7fff7ffe", "0x482680017ffa8000", "0x3", + "0x482480017ff88000", + "0x7260", "0x10780017fff7fff", - "0x5", + "0x7", "0x40780017fff7fff", - "0x6", + "0x7", "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", + "0x482480017ff38000", + "0x772e", "0x480680017fff8000", "0x0", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -9238,7 +10857,8 @@ "0x0", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", + "0x482680017ffb8000", + "0x7c7e", "0x480680017fff8000", "0x0", "0x480a7ffc7fff8000", @@ -9288,15 +10908,16 @@ "0x400380017fe67fe5", "0x480280037fe68000", "0x20680017fff7fff", - "0x160", + "0x190", + "0x480280027fe68000", "0x480280047fe68000", "0x480080007fff8000", "0x480080007fff8000", "0x480080017ffe8000", "0x480080027ffd8000", - "0x480280027fe68000", "0x402780017fe68001", "0x5", + "0x48127ffa7fff8000", "0x480080017ffa8000", "0x400180027ff98000", "0x400180037ff98003", @@ -9306,211 +10927,247 @@ "0x4", "0x10780017fff7fff", "0x6", - "0x40780017fff7fff", - "0x2", + "0x482480017ffd8000", + "0x4b6e", "0x10780017fff7fff", - "0x9", - "0x48287fe880007ffb", + "0xa", + "0x48127ffd7fff8000", + "0x48287fe880007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", "0x6", - "0x40780017fff7fff", - "0x1", + "0x482480017ffe8000", + "0x4a42", "0x10780017fff7fff", - "0x134", - "0x48287fe980007ffb", - "0x20680017fff7fff", - "0x131", - "0x400180007ffc8004", - "0x400180017ffc8005", - "0x400180027ffc8006", - "0x400180037ffc8007", - "0x400180047ffc8008", - "0x400180057ffc8009", - "0x400180067ffc800a", - "0x400180077ffc800b", - "0x400180087ffc800c", - "0x400180097ffc800d", - "0x4001800a7ffc800e", - "0x4001800b7ffc800f", - "0x4001800c7ffc8010", - "0x4001800d7ffc8011", - "0x4001800e7ffc8012", - "0x4001800f7ffc8013", - "0x400180107ffc8014", + "0x162", + "0x48287fe980007ffa", + "0x48127ffd7fff8000", + "0x20680017fff7ffe", + "0x15c", + "0x400180007ffa8004", + "0x400180017ffa8005", + "0x400180027ffa8006", + "0x400180037ffa8007", + "0x400180047ffa8008", + "0x400180057ffa8009", + "0x400180067ffa800a", + "0x400180077ffa800b", + "0x400180087ffa800c", + "0x400180097ffa800d", + "0x4001800a7ffa800e", + "0x4001800b7ffa800f", + "0x4001800c7ffa8010", + "0x4001800d7ffa8011", + "0x4001800e7ffa8012", + "0x4001800f7ffa8013", + "0x400180107ffa8014", "0x48297fea80008004", - "0x20680017fff7fff", - "0x10b", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x135", "0x48297feb80008005", - "0x20680017fff7fff", - "0x104", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x12d", + "0x48127fff7fff8000", "0x48297fec80008006", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x4", + "0x6", + "0x482480017ffe8000", + "0x3e6c", "0x10780017fff7fff", - "0x103", + "0x129", "0x4829800780008008", "0x48297fed80007fee", - "0x48307fff80007ffe", + "0x48127ffc7fff8000", + "0x48307ffe80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x7", "0x480a7fe47fff8000", - "0x48127ff47fff8000", + "0x482480017ffd8000", + "0x3c14", "0x10780017fff7fff", - "0x10", + "0x12", "0x480a7fe47fff8000", - "0x48127ff47fff8000", + "0x48127ffd7fff8000", "0x480a80077fff8000", "0x480a80087fff8000", "0x480a7fed7fff8000", "0x480a7fee7fff8000", "0x1104800180018000", - "0x1038", + "0x1309", "0x20680017fff7ffa", - "0xdc", - "0x20680017fff7fff", - "0x6", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0xff", + "0x48127ff97fff8000", + "0x20680017fff7ffe", + "0x7", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x31a6", "0x10780017fff7fff", - "0xea", + "0x10c", "0x48297fef80008009", - "0x20680017fff7fff", - "0xcf", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xee", "0x48297ff08000800a", - "0x20680017fff7fff", - "0xc8", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xe5", "0x48297ff18000800b", - "0x20680017fff7fff", - "0xc1", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xdc", "0x4829800c8000800d", "0x48297ff280007ff3", "0x4844800180007ffe", "0x3", "0x4844800180007ffe", "0x3", - "0x48307fff80007ffe", + "0x48127ffb7fff8000", + "0x48307ffe80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff07fff8000", - "0x48127ff07fff8000", + "0x7", + "0x48127feb7fff8000", + "0x482480017ffd8000", + "0x2b02", "0x10780017fff7fff", - "0x10", - "0x48127ff07fff8000", - "0x48127ff07fff8000", + "0x12", + "0x48127feb7fff8000", + "0x48127ffd7fff8000", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x480a7ff27fff8000", "0x480a7ff37fff8000", "0x1104800180018000", - "0x1084", + "0x1356", "0x20680017fff7ffa", - "0xa2", - "0x20680017fff7fff", - "0x6", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0xba", + "0x48127ff97fff8000", + "0x20680017fff7ffe", + "0x7", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x2094", "0x10780017fff7fff", - "0xc2", + "0xdd", + "0x48127fff7fff8000", "0x48297ff48000800e", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x7", + "0x48127ff57fff8000", + "0x482480017ffd8000", + "0x1f68", "0x10780017fff7fff", - "0xb9", + "0xd2", "0x4829800f80008010", "0x48297ff580007ff6", - "0x48307fff80007ffe", + "0x48127ffc7fff8000", + "0x48307ffe80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x7", + "0x48127ff17fff8000", + "0x482480017ffd8000", + "0x1cac", "0x10780017fff7fff", - "0x10", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x12", + "0x48127ff17fff8000", + "0x48127ffd7fff8000", "0x480a800f7fff8000", "0x480a80107fff8000", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x1104800180018000", - "0xfec", + "0x12b0", "0x20680017fff7ffa", - "0x78", - "0x20680017fff7fff", - "0x6", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x89", + "0x48127ff97fff8000", + "0x20680017fff7ffe", + "0x7", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x123e", "0x10780017fff7fff", - "0x9e", + "0xb3", + "0x48127fff7fff8000", "0x48297ff780008011", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x7", + "0x48127ff57fff8000", + "0x482480017ffd8000", + "0x1112", "0x10780017fff7fff", - "0x95", + "0xa8", + "0x48127ffe7fff8000", "0x48297ff880008012", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff67fff8000", - "0x48127ff67fff8000", + "0x7", + "0x48127ff37fff8000", + "0x482480017ffd8000", + "0xf82", "0x10780017fff7fff", - "0x8c", + "0x9d", "0x4829801380008014", "0x48297ff980007ffa", - "0x48307fff80007ffe", + "0x48127ffc7fff8000", + "0x48307ffe80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x7", + "0x48127fef7fff8000", + "0x482480017ffd8000", + "0xd2a", "0x10780017fff7fff", - "0x81", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x90", + "0x48127fef7fff8000", + "0x48127ffd7fff8000", "0x480a80137fff8000", "0x480a80147fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", - "0xfbf", + "0x127b", "0x20680017fff7ffa", - "0x45", - "0x20680017fff7fff", - "0x6", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x4d", + "0x48127ff97fff8000", + "0x20680017fff7ffe", + "0x7", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x258", "0x10780017fff7fff", - "0x71", + "0x7e", "0x48297ffb80008000", - "0x20680017fff7fff", - "0x2e", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x32", "0x48297ffc80008003", - "0x20680017fff7fff", - "0x1d", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x1f", "0x48297ffd80008002", - "0x20680017fff7fff", - "0xc", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xd", + "0x48127ff17fff8000", + "0x482480017ffe8000", + "0x12c", "0x480a80017fff8000", "0x480680017fff8000", "0x0", @@ -9524,8 +11181,8 @@ "0x480680017fff8000", "0x53454c4543544f525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127fef7fff8000", + "0x48127ffc7fff8000", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -9538,8 +11195,9 @@ "0x480680017fff8000", "0x434f4e54524143545f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x48127ff17fff8000", + "0x482480017ffc8000", + "0x12c", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -9552,8 +11210,9 @@ "0x480680017fff8000", "0x43414c4c45525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffc8000", + "0x258", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -9562,37 +11221,44 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x384", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x10780017fff7fff", - "0x1e", - "0x48127ff87fff8000", + "0x24", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x136a", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x10780017fff7fff", - "0x18", - "0x48127ff87fff8000", + "0x1d", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x21c0", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x10780017fff7fff", - "0x12", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x16", + "0x48127ff17fff8000", + "0x482480017ffe8000", + "0x2e22", "0x10780017fff7fff", - "0x1e", - "0x48127ff67fff8000", - "0x48127ff67fff8000", + "0x21", + "0x48127ff37fff8000", + "0x482480017ffe8000", + "0x2f4e", "0x10780017fff7fff", - "0x1a", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x1c", + "0x48127ff57fff8000", + "0x482480017ffe8000", + "0x307a", "0x10780017fff7fff", - "0x16", - "0x48127ff87fff8000", + "0x17", "0x48127ff87fff8000", + "0x482480017ff88000", + "0x3336", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", @@ -9603,14 +11269,14 @@ "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x1", + "0x482480017fff8000", + "0x3f98", "0x10780017fff7fff", "0x4", - "0x40780017fff7fff", - "0x2", + "0x482480017fff8000", + "0x4128", "0x480a7fe47fff8000", - "0x48127ff77fff8000", + "0x48127ffe7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -9625,13 +11291,15 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", + "0x482480017fff8000", + "0x4916", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x424c4f434b5f494e464f5f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fe47fff8000", - "0x48127ff87fff8000", + "0x48127ffc7fff8000", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -9639,8 +11307,10 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x480a7fe47fff8000", "0x480280027fe68000", + "0x480a7fe47fff8000", + "0x482480017ffe8000", + "0x52b2", "0x482680017fe68000", "0x6", "0x480680017fff8000", @@ -9674,12 +11344,13 @@ "0x400280057ff87ffe", "0x480280077ff88000", "0x20680017fff7fff", - "0x25", + "0x28", + "0x480280067ff88000", "0x40780017fff7fff", "0x1", "0x400180007fff7ffc", "0x400180017fff7ffd", - "0x480280067ff88000", + "0x48127ffe7fff8000", "0x48127ffe7fff8000", "0x482480017ffd8000", "0x2", @@ -9693,8 +11364,9 @@ "0x4002800f7ff87ffe", "0x480280117ff88000", "0x20680017fff7fff", - "0xa", + "0xb", "0x480280107ff88000", + "0x48127fff7fff8000", "0x482680017ff88000", "0x14", "0x480680017fff8000", @@ -9703,6 +11375,7 @@ "0x480280137ff88000", "0x208b7fff7fff7ffe", "0x480280107ff88000", + "0x48127fff7fff8000", "0x482680017ff88000", "0x14", "0x480680017fff8000", @@ -9711,8 +11384,10 @@ "0x480280137ff88000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x6", + "0x7", "0x480280067ff88000", + "0x482480017fff8000", + "0x2ca6", "0x482680017ff88000", "0xa", "0x480680017fff8000", @@ -9915,52 +11590,54 @@ "0xa0680017fff8000", "0x7", "0x482680017ffc8000", - "0xffffffffffffffffffffffffffffddaa", + "0xffffffffffffffffffffffffffffdc1a", "0x400280007ffb7fff", "0x10780017fff7fff", - "0xa9", + "0xb3", "0x4825800180007ffc", - "0x2256", + "0x23e6", "0x400280007ffb7fff", "0x480680017fff8000", "0x1", - "0x48317fff80017ffd", + "0x48127ffe7fff8000", + "0x48317ffe80017ffd", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", "0x400280017ffb7fff", "0x10780017fff7fff", - "0x8e", + "0x96", "0x400280017ffb7fff", "0x482680017ffb8000", "0x2", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", "0x20680017fff7ffd", - "0x7e", + "0x85", "0x480680017fff8000", "0x2", "0x40137ffe7fff8000", - "0x48317fff80017ffd", + "0x48127ffb7fff8000", + "0x48317ffe80017ffd", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff67fff", "0x10780017fff7fff", - "0x65", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x6a", + "0x400080007ff77fff", + "0x482480017ff78000", "0x1", - "0x48127ff87fff8000", + "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd2", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd0", "0x20680017fff7ffd", - "0x55", + "0x59", "0x480680017fff8000", "0x2", "0x40780017fff7fff", @@ -9995,22 +11672,25 @@ "0x100000000000000000000000000000000", "0x40307ff07ffe7fff", "0x40307ffc7ff77fef", - "0x482480017fe98000", + "0x48127fea7fff8000", + "0x482480017fe88000", "0x9", - "0x20680017fff7fee", - "0x22", - "0x48327fef80008001", + "0x20680017fff7fed", + "0x24", + "0x48127ffe7fff8000", + "0x48327fed80008001", "0xa0680017fff7fff", "0x7", "0x4824800180007fff", "0x100000000000000000000000000000000", - "0x400080007ffc7fff", + "0x400080007ffb7fff", "0x10780017fff7fff", - "0xc", - "0x400080007ffd7fff", - "0x482480017ffd8000", + "0xd", + "0x400080007ffc7fff", + "0x482480017ffc8000", "0x1", - "0x48127fe67fff8000", + "0x482480017ffc8000", + "0x1f4", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -10022,9 +11702,9 @@ "0x480680017fff8000", "0x753132385f616464204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ffa8000", + "0x482480017ff98000", "0x1", - "0x48127fe37fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10037,7 +11717,8 @@ "0x753132385f6d756c204f766572666c6f77", "0x400080007ffe7fff", "0x48127ffd7fff8000", - "0x48127fe67fff8000", + "0x482480017ffb8000", + "0x29e", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10045,7 +11726,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1130", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10056,9 +11738,10 @@ "0x480680017fff8000", "0x753132385f737562204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff48000", "0x1", - "0x48127ff57fff8000", + "0x482480017ff98000", + "0x16f8", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10066,7 +11749,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x1b80", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10079,7 +11763,8 @@ "0x400080007ffe7fff", "0x482680017ffb8000", "0x2", - "0x48127ff87fff8000", + "0x482480017ff98000", + "0x2148", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -10118,9 +11803,9 @@ "0x48127ffb7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", - "0xe4a", + "0x10fb", "0x20680017fff7ffb", - "0xa8", + "0xb7", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ffc7fff8000", @@ -10130,57 +11815,62 @@ "0x480680017fff8000", "0x0", "0x1104800180018000", - "0xe97", + "0x114e", "0x20680017fff7ffd", - "0x95", + "0xa3", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x4b656363616b", "0x400280007ffd7fff", - "0x400280017ffd7ffb", - "0x400280027ffd7ffd", - "0x400280037ffd7ffe", + "0x400280017ffd7ffe", + "0x400280027ffd7ffc", + "0x400280037ffd7ffd", "0x480280057ffd8000", "0x20680017fff7fff", - "0x84", - "0x480280067ffd8000", + "0x8f", "0x480280047ffd8000", + "0x480280067ffd8000", "0x482680017ffd8000", "0x8", + "0x48127ffd7fff8000", "0x480280077ffd8000", "0x4824800180007ffc", "0x587f7cc3722e9654ea3963d5fe8c0748", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x57726f6e6720686173682076616c7565", "0x400080007ffe7fff", - "0x48127ff27fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x48127ff07fff8000", + "0x482480017ffa8000", + "0x3264", + "0x48127ff87fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffe", + "0x48127ffd7fff8000", + "0x4824800180007ffd", "0xa5963aa610cb75ba273817bce5f8c48f", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x57726f6e6720686173682076616c7565", "0x400080007ffe7fff", - "0x48127ff17fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127fee7fff8000", + "0x482480017ffb8000", + "0x30d4", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -10192,26 +11882,29 @@ "0x480680017fff8000", "0x1", "0x400080007ffe7fff", - "0x48127ffe7fff8000", - "0x482480017ffd8000", + "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffc8000", "0x1", "0x480680017fff8000", "0x4b656363616b", - "0x400080007ff77fff", - "0x400080017ff77ff6", - "0x400080027ff77ffd", - "0x400080037ff77ffe", - "0x480080057ff78000", + "0x400080007ff47fff", + "0x400080017ff47ffc", + "0x400080027ff47ffd", + "0x400080037ff47ffe", + "0x480080057ff48000", "0x20680017fff7fff", - "0x11", + "0x13", + "0x480080047ff38000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x53686f756c64206661696c", "0x400080007ffe7fff", - "0x48127feb7fff8000", - "0x480080047ff38000", - "0x482480017ff28000", + "0x48127fe67fff8000", + "0x482480017ffc8000", + "0x3e8", + "0x482480017fee8000", "0x8", "0x480680017fff8000", "0x1", @@ -10219,24 +11912,27 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x480080067ff68000", - "0x480080077ff58000", - "0x480080047ff48000", - "0x482480017ff38000", + "0x480080047ff38000", + "0x480080067ff28000", + "0x480080077ff18000", + "0x482480017ff08000", "0x8", + "0x48127ffc7fff8000", "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x1f", + "0x21", "0x480080007ffb8000", "0x4824800180007fff", "0x496e76616c696420696e707574206c656e677468", - "0x20680017fff7fff", - "0xc", - "0x48127fe67fff8000", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ffe", + "0xd", + "0x48127fe07fff8000", + "0x482480017ffe8000", + "0x12c", + "0x48127ff87fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -10249,9 +11945,9 @@ "0x480680017fff8000", "0x57726f6e67206572726f72206d7367", "0x400080007ffe7fff", - "0x48127fe47fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127fde7fff8000", + "0x48127ffc7fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -10263,32 +11959,37 @@ "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", - "0x48127fe67fff8000", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127fe17fff8000", + "0x482480017ffb8000", + "0x12c", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", "0x480280047ffd8000", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x3390", "0x482680017ffd8000", "0x8", "0x480280067ffd8000", "0x480280077ffd8000", "0x10780017fff7fff", - "0xe", - "0x48127ffb7fff8000", + "0x10", "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x5e24", "0x480a7ffd7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x7", - "0x48127ff97fff8000", + "0x8", "0x48127ff97fff8000", + "0x482480017ff98000", + "0x861a", "0x480a7ffd7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", @@ -10314,13 +12015,13 @@ "0x480680017fff8000", "0x0", "0x1104800180018000", - "0xed8", + "0x119f", "0x20680017fff7ffd", - "0x37", + "0x3a", "0x1104800180018000", - "0x250a", + "0x28e1", "0x482480017fff8000", - "0x2509", + "0x28e0", "0x48127ff97fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", @@ -10328,12 +12029,13 @@ "0x48127ff87fff8000", "0x48127ffa7fff8000", "0x1104800180018000", - "0xfc8", + "0x128f", "0x20680017fff7ffc", - "0x22", + "0x24", "0x48127fff7fff8000", "0x480080007fff8000", - "0x4824800180007fff", + "0x48127ff87fff8000", + "0x4824800180007ffe", "0x61be55a8", "0x20680017fff7fff", "0x4", @@ -10344,18 +12046,19 @@ "0x480680017fff8000", "0x57726f6e6720686173682076616c7565", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x48127ffb7fff8000", + "0x48127ff37fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff67fff8000", - "0x48127ff67fff8000", - "0x48127ff67fff8000", + "0x48127ff57fff8000", + "0x482480017ffd8000", + "0xc8", + "0x48127ff57fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -10364,14 +12067,16 @@ "0x0", "0x208b7fff7fff7ffe", "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ff98000", + "0xc8", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x7", + "0x8", "0x48127ffc7fff8000", - "0x480a7ffc7fff8000", + "0x482680017ffc8000", + "0xb9a", "0x480a7ffd7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", @@ -10401,29 +12106,41 @@ "0x400280057ffd7ffe", "0x480280077ffd8000", "0x20680017fff7fff", - "0x125", + "0x1aa", + "0x480280067ffd8000", "0x480280087ffd8000", "0x480280097ffd8000", - "0x480280067ffd8000", "0x482680017ffd8000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x11", + "0x1b", + "0x1104800180018000", + "0x289c", + "0x482480017fff8000", + "0x289b", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3ef8a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x53686f756c64206265206e6f6e65", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x48127ffb7fff8000", + "0x48307ffc7ff58000", "0x480a7ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x480680017fff8000", "0xfffffffffffffffffffffffefffffc2f", "0x480680017fff8000", @@ -10434,24 +12151,35 @@ "0x0", "0x480680017fff8000", "0x536563703235366b314e6577", - "0x400080007ffa7fff", - "0x400080017ffa7ff9", - "0x400080027ffa7ffb", - "0x400080037ffa7ffc", - "0x400080047ffa7ffd", - "0x400080057ffa7ffe", - "0x480080077ffa8000", + "0x400080007ff87fff", + "0x400080017ff87ffa", + "0x400080027ff87ffb", + "0x400080037ff87ffc", + "0x400080047ff87ffd", + "0x400080057ff87ffe", + "0x480080077ff88000", "0x20680017fff7fff", - "0x12", + "0x1d", + "0x480080067ff78000", + "0x1104800180018000", + "0x286e", + "0x482480017fff8000", + "0x286d", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3c29e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x53686f756c64206661696c", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x480080067ff68000", + "0x48307ffc7ff58000", "0x480a7ffc7fff8000", - "0x482480017ff48000", + "0x482480017fea8000", "0xa", "0x480680017fff8000", "0x1", @@ -10459,21 +12187,24 @@ "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", - "0x480080087ff98000", - "0x480080097ff88000", "0x480080067ff78000", - "0x482480017ff68000", + "0x480080087ff68000", + "0x480080097ff58000", + "0x482480017ff48000", "0xa", + "0x48127ffc7fff8000", "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xd3", + "0x136", "0x480080007ffb8000", "0x4824800180007fff", "0x496e76616c696420617267756d656e74", - "0x20680017fff7fff", - "0xbf", + "0x48127ffc7fff8000", + "0x20680017fff7ffe", + "0x117", + "0x48127fff7fff8000", "0x480680017fff8000", "0xe3e70682c2094cac629f6fbed82c07cd", "0x480680017fff8000", @@ -10484,82 +12215,132 @@ "0x8e182ca967f38e1bd6a49583f43f1876", "0x480680017fff8000", "0x536563703235366b314e6577", - "0x400080007ff77fff", - "0x400080017ff77ff6", - "0x400080027ff77ffb", - "0x400080037ff77ffc", - "0x400080047ff77ffd", - "0x400080057ff77ffe", - "0x480080077ff78000", + "0x400080007ff47fff", + "0x400080017ff47ffa", + "0x400080027ff47ffb", + "0x400080037ff47ffc", + "0x400080047ff47ffd", + "0x400080057ff47ffe", + "0x480080077ff48000", "0x20680017fff7fff", - "0xa2", - "0x480080087ff68000", - "0x480080097ff58000", - "0x480080067ff48000", - "0x482480017ff38000", + "0xee", + "0x480080067ff38000", + "0x480080087ff28000", + "0x480080097ff18000", + "0x482480017ff08000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x8c", + "0xcd", + "0x48127fff7fff8000", "0x480680017fff8000", "0x536563703235366b314765745879", - "0x400080007ffe7fff", - "0x400080017ffe7ffd", - "0x400080027ffe7ffc", - "0x480080047ffe8000", + "0x400080007ffc7fff", + "0x400080017ffc7ffe", + "0x400080027ffc7ffb", + "0x480080047ffc8000", "0x20680017fff7fff", - "0x7a", - "0x480080057ffd8000", - "0x480080067ffc8000", + "0xaf", "0x480080037ffb8000", - "0x482480017ffa8000", + "0x480080057ffa8000", + "0x480080067ff98000", + "0x482480017ff88000", "0x9", - "0x480080077ff98000", - "0x480080087ff88000", + "0x480080077ff78000", + "0x480080087ff68000", + "0x48127ffa7fff8000", "0x4824800180007ffa", "0xe3e70682c2094cac629f6fbed82c07cd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x11", "0x40780017fff7fff", - "0x3", + "0x6", + "0x1104800180018000", + "0x280e", + "0x482480017fff8000", + "0x280d", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x360ba", + "0x48307fff7ff18000", "0x10780017fff7fff", - "0xa", - "0x4824800180007ffa", + "0x16", + "0x48127ffe7fff8000", + "0x4824800180007ff9", "0xf728b4fa42485e3a0a5d2f346baa9455", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x11", "0x40780017fff7fff", - "0x2", + "0x4", + "0x1104800180018000", + "0x27f8", + "0x482480017fff8000", + "0x27f7", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x35fa2", + "0x48307fff7ff38000", "0x10780017fff7fff", - "0x12", - "0x4824800180007ffc", + "0x2a", + "0x48127ffe7fff8000", + "0x4824800180007ff9", "0x8e031ab54fc0c4a8f0dc94fad0d0611", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x11", "0x40780017fff7fff", - "0x1", - "0x10780017fff7fff", + "0x2", + "0x1104800180018000", + "0x27e2", + "0x482480017fff8000", + "0x27e1", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", "0x8", - "0x4824800180007ffc", + "0x482480017fff8000", + "0x35e26", + "0x48307fff7ff58000", + "0x10780017fff7fff", + "0x14", + "0x48127ffe7fff8000", + "0x4824800180007ff8", "0x8e182ca967f38e1bd6a49583f43f1876", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x11", + "0x1c", + "0x1104800180018000", + "0x27ce", + "0x482480017fff8000", + "0x27cd", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x35d72", + "0x48307fff7ff78000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x556e657870656374656420636f6f7264696e61746573", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x48127ff57fff8000", + "0x48127ffc7fff8000", "0x480a7ffc7fff8000", - "0x48127ff47fff8000", + "0x48127fe87fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", @@ -10571,9 +12352,9 @@ "0x484480017fff8000", "0x100000000000000000000000000000000", "0x480a7ffa7fff8000", - "0x48127ff57fff8000", + "0x48127ffb7fff8000", "0x480a7ffc7fff8000", - "0x48127ff47fff8000", + "0x48127ff07fff8000", "0x480680017fff8000", "0x788f195a6f509ca3e934f78d7a71dd85", "0x480680017fff8000", @@ -10591,15 +12372,17 @@ "0x482480017ff48000", "0xbb448978bd42b984d7de5970bcaf5c43", "0x1104800180018000", - "0xf22", + "0x11a1", "0x20680017fff7ffd", - "0x17", - "0x20680017fff7ffe", - "0xd", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x1a", + "0x48127ffa7fff8000", + "0x20680017fff7ffd", + "0xe", + "0x48127ff87fff8000", + "0x482480017ffe8000", + "0x258", + "0x48127ff87fff8000", + "0x48127ff87fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -10609,92 +12392,158 @@ "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", - "0x400080007fff7ffe", - "0x48127fff7fff8000", - "0x482480017ffe8000", + "0x400080007fff7ffd", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", + "0x482480017ffd8000", "0x1", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x1", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", - "0x48127ff67fff8000", - "0x48127ff67fff8000", - "0x48127ff67fff8000", - "0x48127ff67fff8000", + "0x2", + "0x482480017ff88000", + "0x17c", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ffc7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", + "0x480080037ffb8000", + "0x1104800180018000", + "0x2770", + "0x482480017fff8000", + "0x276f", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x366d2", "0x480a7ffa7fff8000", - "0x480080037ffc8000", + "0x48307ffe7ff78000", "0x480a7ffc7fff8000", - "0x482480017ffa8000", + "0x482480017ff08000", "0x7", "0x480680017fff8000", "0x1", - "0x480080057ff88000", - "0x480080067ff78000", + "0x480080057fee8000", + "0x480080067fed8000", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x275c", + "0x482480017fff8000", + "0x275b", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x38fd6", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x48127ffb7fff8000", + "0x48307ffc7ff58000", "0x480a7ffc7fff8000", - "0x48127ffa7fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", + "0x480080067ff38000", + "0x1104800180018000", + "0x2742", + "0x482480017fff8000", + "0x2741", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x392f6", "0x480a7ffa7fff8000", - "0x480080067ff58000", + "0x48307ffe7ff78000", "0x480a7ffc7fff8000", - "0x482480017ff38000", + "0x482480017fe88000", "0xa", "0x480680017fff8000", "0x1", - "0x480080087ff18000", - "0x480080097ff08000", + "0x480080087fe68000", + "0x480080097fe58000", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x272e", + "0x482480017fff8000", + "0x272d", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3beb6", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x57726f6e67206572726f72206d7367", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x48127ff87fff8000", + "0x48307ffc7ff58000", "0x480a7ffc7fff8000", - "0x48127ff77fff8000", + "0x48127fee7fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x2715", + "0x482480017fff8000", + "0x2714", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3bfe2", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", "0x480a7ffa7fff8000", - "0x48127ffa7fff8000", + "0x48307ffc7ff48000", "0x480a7ffc7fff8000", - "0x48127ff97fff8000", + "0x48127ff17fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", "0x480280067ffd8000", + "0x1104800180018000", + "0x26fb", + "0x482480017fff8000", + "0x26fa", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3f2aa", + "0x480a7ffa7fff8000", + "0x48307ffe7ff78000", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0xa", @@ -10721,30 +12570,33 @@ "0x400280057ffd7ffe", "0x480280077ffd8000", "0x20680017fff7fff", - "0x14a", + "0x16c", + "0x480280067ffd8000", "0x480280087ffd8000", "0x480280097ffd8000", - "0x480280067ffd8000", "0x482680017ffd8000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x12", + "0x13", "0x40780017fff7fff", - "0x2f8", + "0x318", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x53686f756c64206265206e6f6e65", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d037fff8000", - "0x48127d037fff8000", + "0x482480017ce48000", + "0x33e82", + "0x48127ce27fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", + "0x48127fff7fff8000", "0x480680017fff8000", "0xffffffffffffffffffffffff", "0x480680017fff8000", @@ -10755,25 +12607,27 @@ "0x0", "0x480680017fff8000", "0x5365637032353672314e6577", - "0x400080007ffa7fff", - "0x400080017ffa7ff9", - "0x400080027ffa7ffb", - "0x400080037ffa7ffc", - "0x400080047ffa7ffd", - "0x400080057ffa7ffe", - "0x480080077ffa8000", + "0x400080007ff87fff", + "0x400080017ff87ffa", + "0x400080027ff87ffb", + "0x400080037ff87ffc", + "0x400080047ff87ffd", + "0x400080057ff87ffe", + "0x480080077ff88000", "0x20680017fff7fff", - "0x13", + "0x15", "0x40780017fff7fff", - "0x2f2", + "0x310", + "0x480080067ce78000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x53686f756c64206661696c", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x480080067d048000", - "0x482480017d038000", + "0x482480017ffc8000", + "0x311e6", + "0x482480017ce28000", "0xa", "0x480680017fff8000", "0x1", @@ -10781,21 +12635,24 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x480080087ff98000", - "0x480080097ff88000", "0x480080067ff78000", - "0x482480017ff68000", + "0x480080087ff68000", + "0x480080097ff58000", + "0x482480017ff48000", "0xa", + "0x48127ffc7fff8000", "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xf5", + "0x110", "0x480080007ffb8000", "0x4824800180007fff", "0x496e76616c696420617267756d656e74", - "0x20680017fff7fff", - "0xe0", + "0x48127ffc7fff8000", + "0x20680017fff7ffe", + "0xf9", + "0x48127fff7fff8000", "0x480680017fff8000", "0x2d483fe223b12b91047d83258a958b0f", "0x480680017fff8000", @@ -10806,89 +12663,104 @@ "0xdb0a2e6710c71ba80afeb3abdf69d306", "0x480680017fff8000", "0x5365637032353672314e6577", - "0x400080007ff77fff", - "0x400080017ff77ff6", - "0x400080027ff77ffb", - "0x400080037ff77ffc", - "0x400080047ff77ffd", - "0x400080057ff77ffe", - "0x480080077ff78000", + "0x400080007ff47fff", + "0x400080017ff47ffa", + "0x400080027ff47ffb", + "0x400080037ff47ffc", + "0x400080047ff47ffd", + "0x400080057ff47ffe", + "0x480080077ff48000", "0x20680017fff7fff", - "0xc2", - "0x480080087ff68000", - "0x480080097ff58000", - "0x480080067ff48000", - "0x482480017ff38000", + "0xd8", + "0x480080067ff38000", + "0x480080087ff28000", + "0x480080097ff18000", + "0x482480017ff08000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0xab", + "0xbf", + "0x48127fff7fff8000", "0x480680017fff8000", "0x5365637032353672314765745879", - "0x400080007ffe7fff", - "0x400080017ffe7ffd", - "0x400080027ffe7ffc", - "0x480080047ffe8000", + "0x400080007ffc7fff", + "0x400080017ffc7ffe", + "0x400080027ffc7ffb", + "0x480080047ffc8000", "0x20680017fff7fff", - "0x98", - "0x480080057ffd8000", - "0x480080067ffc8000", + "0xa9", "0x480080037ffb8000", - "0x482480017ffa8000", + "0x480080057ffa8000", + "0x480080067ff98000", + "0x482480017ff88000", "0x9", - "0x480080077ff98000", - "0x480080087ff88000", + "0x480080077ff78000", + "0x480080087ff68000", + "0x48127ffa7fff8000", "0x4824800180007ffa", "0x2d483fe223b12b91047d83258a958b0f", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x2d8", + "0x2f0", + "0x482480017d0e8000", + "0x2b1e2", "0x10780017fff7fff", - "0xa", - "0x4824800180007ffa", + "0xd", + "0x48127ffe7fff8000", + "0x4824800180007ff9", "0x502a43ce77c6f5c736a82f847fa95f8c", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x2d7", + "0x2ee", + "0x482480017d108000", + "0x2b0ca", "0x10780017fff7fff", - "0x14", - "0x4824800180007ffc", + "0x1a", + "0x48127ffe7fff8000", + "0x4824800180007ff9", "0xce729c7704f4ddf2eaaf0b76209fe1b0", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x2d6", + "0x2ec", + "0x482480017d128000", + "0x2af4e", "0x10780017fff7fff", - "0xa", - "0x4824800180007ffc", + "0xd", + "0x48127ffe7fff8000", + "0x4824800180007ff8", "0xdb0a2e6710c71ba80afeb3abdf69d306", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x12", + "0x14", "0x40780017fff7fff", - "0x2d5", + "0x2ea", + "0x482480017d148000", + "0x2ae36", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x556e657870656374656420636f6f7264696e61746573", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d207fff8000", - "0x48127d207fff8000", + "0x48127ffc7fff8000", + "0x48127d067fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x32e41495a944d0045b522eba7240fad5", "0x480680017fff8000", @@ -10899,25 +12771,26 @@ "0x87d9315798aaa3a5ba01775787ced05e", "0x480680017fff8000", "0x5365637032353672314e6577", - "0x400080007ff47fff", - "0x400080017ff47ff3", - "0x400080027ff47ffb", - "0x400080037ff47ffc", - "0x400080047ff47ffd", - "0x400080057ff47ffe", - "0x480080077ff48000", - "0x20680017fff7fff", - "0x3f", - "0x480080087ff38000", - "0x480080097ff28000", - "0x480080067ff18000", - "0x482480017ff08000", + "0x400080007fef7fff", + "0x400080017fef7ffa", + "0x400080027fef7ffb", + "0x400080037fef7ffc", + "0x400080047fef7ffd", + "0x400080057fef7ffe", + "0x480080077fef8000", + "0x20680017fff7fff", + "0x41", + "0x480080067fee8000", + "0x480080087fed8000", + "0x480080097fec8000", + "0x482480017feb8000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", "0x28", "0x480a7ffb7fff8000", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x27ae41e4649b934ca495991b7852b855", "0x480680017fff8000", @@ -10932,7 +12805,7 @@ "0x177e60492c5a8242f76f07bfe3661bd", "0x48127ff47fff8000", "0x1104800180018000", - "0xe97", + "0x1124", "0x20680017fff7ffd", "0xc", "0x48127ffa7fff8000", @@ -10954,15 +12827,16 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2cb", + "0x2df", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d307fff8000", - "0x48127d307fff8000", + "0x482480017d1d8000", + "0x27fc4", + "0x48127d1b7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -10970,37 +12844,42 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2d1", + "0x2e5", + "0x480080067d098000", "0x480a7ffb7fff8000", - "0x480080067d218000", - "0x482480017d208000", + "0x482480017ffe8000", + "0x282a8", + "0x482480017d068000", "0xa", "0x480680017fff8000", "0x1", - "0x480080087d1e8000", - "0x480080097d1d8000", + "0x480080087d048000", + "0x480080097d038000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2e1", + "0x2fa", + "0x480080037d018000", "0x480a7ffb7fff8000", - "0x480080037d1b8000", - "0x482480017d1a8000", + "0x482480017ffe8000", + "0x2b6f6", + "0x482480017cfe8000", "0x7", "0x480680017fff8000", "0x1", - "0x480080057d188000", - "0x480080067d178000", + "0x480080057cfc8000", + "0x480080067cfb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2e1", + "0x2fc", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d1a7fff8000", - "0x48127d1a7fff8000", + "0x482480017d008000", + "0x2dfe6", + "0x48127cfe7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -11008,26 +12887,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2e7", + "0x302", + "0x480080067cf18000", "0x480a7ffb7fff8000", - "0x480080067d0e8000", - "0x482480017d0d8000", + "0x482480017ffe8000", + "0x2e2ca", + "0x482480017cee8000", "0xa", "0x480680017fff8000", "0x1", - "0x480080087d0b8000", - "0x480080097d0a8000", + "0x480080087cec8000", + "0x480080097ceb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2eb", + "0x308", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x57726f6e67206572726f72206d7367", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d0d7fff8000", - "0x48127d0d7fff8000", + "0x482480017cf48000", + "0x30e4e", + "0x48127cee7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -11035,15 +12917,16 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2ed", + "0x30b", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x48127d0d7fff8000", - "0x48127d0d7fff8000", + "0x482480017cf08000", + "0x30f5c", + "0x48127cee7fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -11051,9 +12934,11 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2fe", - "0x480a7ffb7fff8000", + "0x31e", "0x480280067ffd8000", + "0x480a7ffb7fff8000", + "0x482480017ffe8000", + "0x34166", "0x482680017ffd8000", "0xa", "0x480680017fff8000", @@ -11064,99 +12949,110 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xffffffffffffffffffffffffffffc900", + "0xffffffffffffffffffffffffffffc57c", "0x400280007ff97fff", "0x10780017fff7fff", - "0x117", + "0x133", "0x4825800180007ffa", - "0x3700", + "0x3a84", "0x400280007ff97fff", "0x48297ffc80007ffd", "0x480680017fff8000", "0x3", - "0x48307fff80017ffe", + "0x48127ffd7fff8000", + "0x48307ffe80017ffd", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", "0x400280017ff97fff", "0x10780017fff7fff", - "0xfa", + "0x114", "0x400280017ff97fff", "0x482680017ff98000", "0x2", + "0x48127ffc7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xe4", + "0xfc", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", + "0x48127ffc7fff8000", "0x480280007ffc8000", - "0x48307ffd80007ffe", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xcd", - "0x482480017ffc8000", + "0xe3", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xb6", - "0x480080007ffc8000", - "0x482480017ffb8000", + "0xca", + "0x480080007ffb8000", + "0x482480017ffa8000", "0x1", - "0x48127ffb7fff8000", - "0x20680017fff7ffd", - "0x43", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x20680017fff7ffc", + "0x4a", + "0x482480017fff8000", + "0x12c", "0xa0680017fff8004", "0xe", - "0x4824800180047ff6", + "0x4824800180047ff3", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007fef7ffc", - "0x480080017fee7ffc", + "0x480080007fea7ffc", + "0x480080017fe97ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027fed7ffd", + "0x400080027fe87ffd", "0x10780017fff7fff", - "0x26", + "0x2a", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ff5", - "0x480080007ff07ffd", - "0x480080017fef7ffd", + "0x48307fff80007ff2", + "0x480080007feb7ffd", + "0x480080017fea7ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027fee7ffe", - "0x482480017fee8000", + "0x400080027fe97ffe", + "0x48127ffa7fff8000", + "0x482480017fe88000", "0x3", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ffb7fff", - "0x400280017ffb7fe7", - "0x400280027ffb7ff0", - "0x400280037ffb7ff4", - "0x400280047ffb7ff7", - "0x400280057ffb7ff8", + "0x400280017ffb7ffd", + "0x400280027ffb7fec", + "0x400280037ffb7ff1", + "0x400280047ffb7ff4", + "0x400280057ffb7ff5", "0x480280077ffb8000", "0x20680017fff7fff", - "0x8", - "0x48127ffd7fff8000", + "0x9", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x10780017fff7fff", - "0x80", - "0x48127ffd7fff8000", + "0x8f", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -11169,9 +13065,10 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017feb8000", + "0x482480017fe68000", "0x3", - "0x48127fe57fff8000", + "0x482480017ff68000", + "0x2a30", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11179,53 +13076,59 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffd", + "0x4824800180007ffc", "0x1", - "0x20680017fff7fff", - "0x43", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x49", + "0x48127fff7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ff5", + "0x4824800180047ff1", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007fee7ffc", - "0x480080017fed7ffc", + "0x480080007fe87ffc", + "0x480080017fe77ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027fec7ffd", + "0x400080027fe67ffd", "0x10780017fff7fff", - "0x26", + "0x2a", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ff4", - "0x480080007fef7ffd", - "0x480080017fee7ffd", + "0x48307fff80007ff0", + "0x480080007fe97ffd", + "0x480080017fe87ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027fed7ffe", - "0x482480017fed8000", + "0x400080027fe77ffe", + "0x48127ffa7fff8000", + "0x482480017fe68000", "0x3", "0x480680017fff8000", "0x4c69627261727943616c6c", "0x400280007ffb7fff", - "0x400280017ffb7fe6", - "0x400280027ffb7fef", - "0x400280037ffb7ff3", - "0x400280047ffb7ff6", - "0x400280057ffb7ff7", + "0x400280017ffb7ffd", + "0x400280027ffb7fea", + "0x400280037ffb7fef", + "0x400280047ffb7ff2", + "0x400280057ffb7ff3", "0x480280077ffb8000", "0x20680017fff7fff", - "0x8", - "0x48127ffd7fff8000", + "0x9", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x48127ffe7fff8000", "0x482680017ffb8000", "0xa", "0x10780017fff7fff", - "0x3b", - "0x48127ffd7fff8000", + "0x43", "0x480280067ffb8000", + "0x48127ffc7fff8000", + "0x482480017ffe8000", + "0x64", "0x482680017ffb8000", "0xa", "0x480680017fff8000", @@ -11238,9 +13141,10 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017fea8000", + "0x482480017fe48000", "0x3", - "0x48127fe47fff8000", + "0x482480017ff68000", + "0x2a30", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11248,29 +13152,33 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007ffa", + "0x4824800180007ff8", "0x62c83572d28cb834a3de3c1e94977a4191469a4a8c26d1d7bc55305e640ed5", - "0x20680017fff7fff", + "0x482480017ffe8000", + "0x292c", + "0x20680017fff7ffe", "0xa", - "0x48127ff17fff8000", "0x48127feb7fff8000", + "0x48127ffe7fff8000", "0x480a7ffb7fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3d", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff28", "0x208b7fff7fff7ffe", - "0x4824800180007ff9", + "0x4824800180007ff6", "0x32564d7e0fe091d49b4c20f4632191e4ed6986bf993849879abfef9465def25", - "0x20680017fff7fff", + "0x482480017ffe8000", + "0x366", + "0x20680017fff7ffe", "0x10", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x6661696c", "0x400080007ffe7fff", - "0x48127fee7fff8000", - "0x48127fe87fff8000", + "0x48127fe77fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11278,8 +13186,9 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff07fff8000", - "0x48127fea7fff8000", + "0x48127fe97fff8000", + "0x482480017ffe8000", + "0x12c", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x0", @@ -11293,8 +13202,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127fee7fff8000", + "0x48127ff17fff8000", + "0x482480017ffa8000", + "0x31a6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11307,8 +13217,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127ff27fff8000", + "0x48127ff67fff8000", + "0x482480017ffa8000", + "0x33fe", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11321,8 +13232,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ffc7fff8000", - "0x48127ff67fff8000", + "0x48127ffb7fff8000", + "0x482480017ffb8000", + "0x3656", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11337,7 +13249,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x2", - "0x48127ff77fff8000", + "0x482480017ff98000", + "0x3782", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -11363,36 +13276,38 @@ "0xa0680017fff8000", "0x7", "0x482680017ffc8000", - "0xfffffffffffffffffffffffffffffbd2", + "0xfffffffffffffffffffffffffffffb6e", "0x400280007ffb7fff", "0x10780017fff7fff", - "0x1d", + "0x1f", "0x4825800180007ffc", - "0x42e", + "0x492", "0x400280007ffb7fff", "0x482680017ffb8000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xf", + "0x10", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x7265637572736976655f6661696c", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0x3ca", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", @@ -11411,19 +13326,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ffc8000", - "0xfffffffffffffffffffffffffffffbd2", + "0xfffffffffffffffffffffffffffffb6e", "0x400280007ffb7fff", "0x10780017fff7fff", - "0x19", + "0x1b", "0x4825800180007ffc", - "0x42e", + "0x492", "0x400280007ffb7fff", "0x482680017ffb8000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xb", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xc", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0x4f6", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -11431,12 +13348,12 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0x48127ffe7fff8000", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", @@ -11500,11 +13417,12 @@ "0x400280037ffa7ffb", "0x480280057ffa8000", "0x20680017fff7fff", - "0x84", + "0x95", "0x480280047ffa8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff88000", + "0x482480017ff78000", "0x1", "0x480280067ffa8000", "0x480680017fff8000", @@ -11515,12 +13433,13 @@ "0x4002800a7ffa7ffd", "0x4802800c7ffa8000", "0x20680017fff7fff", - "0x6c", + "0x73", + "0x4802800b7ffa8000", "0x480680017fff8000", "0x2691cb735b18f3f656c3b82bd97a32b65d15019b64117513f8604d1e06fe58b", - "0x400080007ff57fff", - "0x400180017ff57ffb", - "0x480080027ff58000", + "0x400080007ff37fff", + "0x400180017ff37ffb", + "0x480080027ff38000", "0xa0680017fff8005", "0xe", "0x4824800180057ffe", @@ -11528,36 +13447,36 @@ "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8003", - "0x480080007ff17ffc", - "0x480080017ff07ffc", + "0x480080007fef7ffc", + "0x480080017fee7ffc", "0x482480017ffb7ffd", "0xffffffffffffffeefffffffffffffeff", - "0x400080027fee7ffc", + "0x400080027fec7ffc", "0x10780017fff7fff", "0x11", "0x48127ffe7fff8005", "0x484480017ffe8000", "0x8000000000000000000000000000000", "0x48307ffe7fff8003", - "0x480080007ff17ffd", + "0x480080007fef7ffd", "0x482480017ffc7ffe", "0xf0000000000000000000000000000100", - "0x480080017fef7ffd", - "0x400080027fee7ff9", + "0x480080017fed7ffd", + "0x400080027fec7ff9", "0x402480017ffd7ff9", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7ffd", "0x4", "0x402780017fff7fff", "0x1", - "0x4802800b7ffa8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x0", - "0x48287ffc7ff28000", + "0x48287ffc7ff18000", "0x4802800d7ffa8000", - "0x482480017fe98000", + "0x482480017fe78000", "0x3", - "0x482480017fe98000", + "0x482480017fe78000", "0x3", "0x480680017fff8000", "0x53746f726167655772697465", @@ -11568,13 +13487,14 @@ "0x400280127ffa7ffb", "0x480280147ffa8000", "0x20680017fff7fff", - "0x27", + "0x2b", "0x480280137ffa8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff58000", + "0x482480017ff48000", "0x1", - "0x48287ffd7ff88000", + "0x48287ffd7ff78000", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280157ffa7fff", @@ -11584,12 +13504,14 @@ "0x400280197ffa7ffe", "0x4802801b7ffa8000", "0x20680017fff7fff", - "0x10", + "0x12", "0x40780017fff7fff", "0x4", - "0x48127ff37fff8000", "0x4802801a7ffa8000", - "0x48127ff07fff8000", + "0x48127ff17fff8000", + "0x482480017ffe8000", + "0x168", + "0x48127fee7fff8000", "0x482680017ffa8000", "0x1c", "0x480680017fff8000", @@ -11600,22 +13522,25 @@ "0x0", "0x208b7fff7fff7ffe", "0x4802801a7ffa8000", + "0x48127fff7fff8000", "0x482680017ffa8000", "0x1e", "0x4802801c7ffa8000", "0x4802801d7ffa8000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x6", + "0x7", "0x480280137ffa8000", + "0x482480017fff8000", + "0x2bde", "0x482680017ffa8000", "0x17", "0x480280157ffa8000", "0x480280167ffa8000", - "0x48127ff37fff8000", + "0x48127ff17fff8000", "0x48127ffb7fff8000", - "0x48127ff07fff8000", + "0x48127fee7fff8000", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -11623,24 +13548,42 @@ "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x17", + "0x13", "0x4802800b7ffa8000", + "0x1104800180018000", + "0x2301", + "0x482480017fff8000", + "0x2300", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5be0", + "0x48307fff7ff98000", "0x482680017ffa8000", "0xf", "0x4802800d7ffa8000", "0x4802800e7ffa8000", "0x10780017fff7fff", - "0x9", + "0x12", "0x40780017fff7fff", - "0x1d", + "0x1a", "0x480280047ffa8000", + "0x1104800180018000", + "0x22ef", + "0x482480017fff8000", + "0x22ee", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x87be", + "0x48307fff7ff98000", "0x482680017ffa8000", "0x8", "0x480280067ffa8000", "0x480280077ffa8000", - "0x48127fdc7fff8000", + "0x48127fd87fff8000", "0x48127ffb7fff8000", - "0x48127fd97fff8000", + "0x48127fd57fff8000", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -11695,11 +13638,12 @@ "0x400280037ffa7ffb", "0x480280057ffa8000", "0x20680017fff7fff", - "0xe2", + "0x111", "0x480280047ffa8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff88000", + "0x482480017ff78000", "0x1", "0x480280067ffa8000", "0x480680017fff8000", @@ -11710,18 +13654,19 @@ "0x4002800a7ffa7ffd", "0x4802800c7ffa8000", "0x20680017fff7fff", - "0xca", + "0xeb", "0x4802800b7ffa8000", "0x482680017ffa8000", "0xe", "0x4802800d7ffa8000", + "0x48127ffd7fff8000", "0xa0680017fff8000", "0x16", - "0x480080007ff38003", - "0x480080017ff28003", + "0x480080007ff18003", + "0x480080017ff08003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ff6", + "0x483080017ffd7ff5", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -11732,19 +13677,20 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080027fee7ffd", + "0x400080027fec7ffd", "0x20680017fff7ffe", - "0x9f", + "0xb3", "0x402780017fff7fff", "0x1", - "0x400080007ff37ff9", + "0x400080007ff17ff8", + "0x48127ffe7fff8000", "0xa0680017fff8000", "0x16", - "0x480080017ff28003", - "0x480080027ff18003", + "0x480080017fef8003", + "0x480080027fee8003", "0x4844800180017ffe", "0x100000000000000000000000000000000", - "0x483080017ffd7ffa", + "0x483080017ffd7ff8", "0x482480017fff7ffd", "0x800000000000010fffffffffffffffff7ffffffffffffef0000000000000001", "0x20680017fff7ffc", @@ -11755,21 +13701,21 @@ "0x4", "0x402480017ffe7ffd", "0xf7ffffffffffffef0000000000000000", - "0x400080037fed7ffd", + "0x400080037fea7ffd", "0x20680017fff7ffe", - "0x75", + "0x7c", "0x402780017fff7fff", "0x1", - "0x400080017ff27ffd", - "0x400280007ff87ff8", + "0x400080017fef7ffb", + "0x400280007ff87ff6", "0x400380017ff87ffc", - "0x400280057ff87ffd", + "0x400280057ff87ffb", "0x400380067ff87ffd", "0x480680017fff8000", "0x2691cb735b18f3f656c3b82bd97a32b65d15019b64117513f8604d1e06fe58b", - "0x400080007ff07fff", - "0x400180017ff07ffb", - "0x480080027ff08000", + "0x400080007fed7fff", + "0x400180017fed7ffb", + "0x480080027fed8000", "0xa0680017fff8005", "0xe", "0x4824800180057ffe", @@ -11777,70 +13723,74 @@ "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8003", - "0x480080027fec7ffc", - "0x480080037feb7ffc", + "0x480080027fe97ffc", + "0x480080037fe87ffc", "0x482480017ffb7ffd", "0xffffffffffffffeefffffffffffffeff", - "0x400080047fe97ffc", + "0x400080047fe67ffc", "0x10780017fff7fff", "0x11", "0x48127ffe7fff8005", "0x484480017ffe8000", "0x8000000000000000000000000000000", "0x48307ffe7fff8003", - "0x480080027fec7ffd", + "0x480080027fe97ffd", "0x482480017ffc7ffe", "0xf0000000000000000000000000000100", - "0x480080037fea7ffd", - "0x400080047fe97ff9", + "0x480080037fe77ffd", + "0x400080047fe67ff9", "0x402480017ffd7ff9", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7ffd", "0x4", "0x402780017fff7fff", "0x1", + "0x48127ff57fff8000", "0x480680017fff8000", "0x0", "0x480280037ff88000", "0x482680017ff88000", "0xa", "0x480280087ff88000", - "0x482480017fe48000", + "0x482480017fe08000", "0x3", - "0x482480017fe48000", + "0x482480017fe08000", "0x5", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080007fec7fff", - "0x400080017fec7feb", - "0x400080027fec7ff9", - "0x400080037fec7ff8", - "0x400080047fec7ffa", - "0x480080067fec8000", + "0x400080007fe97fff", + "0x400080017fe97ff8", + "0x400080027fe97ff9", + "0x400080037fe97ff7", + "0x400080047fe97ffa", + "0x480080067fe98000", "0x20680017fff7fff", - "0x27", - "0x480080057feb8000", + "0x2b", + "0x480080057fe88000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080077fe77fff", - "0x400080087fe77ffc", - "0x400080097fe77ffd", - "0x4000800a7fe77ffe", - "0x4000800b7fe77ff7", - "0x4800800d7fe78000", + "0x400080077fe37fff", + "0x400080087fe37ffc", + "0x400080097fe37ffd", + "0x4000800a7fe37ffe", + "0x4000800b7fe37ff6", + "0x4800800d7fe38000", "0x20680017fff7fff", - "0x11", + "0x13", "0x40780017fff7fff", "0x4", - "0x48127ff47fff8000", - "0x4800800c7fe18000", - "0x48127fef7fff8000", - "0x48127ff07fff8000", - "0x482480017fde8000", + "0x4800800c7fde8000", + "0x48127ff27fff8000", + "0x482480017ffe8000", + "0x168", + "0x48127fed7fff8000", + "0x48127fee7fff8000", + "0x482480017fd98000", "0xe", "0x480680017fff8000", "0x0", @@ -11849,24 +13799,27 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x4800800c7fe68000", - "0x482480017fe58000", + "0x4800800c7fe28000", + "0x48127fff7fff8000", + "0x482480017fe08000", "0x10", - "0x4800800e7fe48000", - "0x4800800f7fe38000", + "0x4800800e7fdf8000", + "0x4800800f7fde8000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x5", - "0x480080057fe68000", - "0x482480017fe58000", + "0x6", + "0x480080057fe28000", + "0x482480017fff8000", + "0x2b84", + "0x482480017fe08000", "0x9", - "0x480080077fe48000", - "0x480080087fe38000", - "0x48127ff47fff8000", + "0x480080077fdf8000", + "0x480080087fde8000", + "0x48127ff27fff8000", "0x48127ffb7fff8000", - "0x48127fef7fff8000", - "0x48127ff07fff8000", + "0x48127fed7fff8000", + "0x48127fee7fff8000", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -11874,18 +13827,30 @@ "0x48127ff87fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x13", + "0xd", + "0x1104800180018000", + "0x21eb", + "0x482480017fff8000", + "0x21ea", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5938", + "0x480080017ffd8000", + "0x484480017fff8000", + "0x2", + "0x48307ffd7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017fd88000", + "0x482480017fd28000", "0x4", - "0x48127fe07fff8000", + "0x48307ffc7fe08000", "0x480a7ff87fff8000", - "0x48127fd47fff8000", - "0x48127fde7fff8000", + "0x48127fce7fff8000", + "0x48127fd97fff8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", @@ -11893,18 +13858,30 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x14", + "0xf", + "0x1104800180018000", + "0x21cc", + "0x482480017fff8000", + "0x21cb", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5a96", + "0x480080017ffd8000", + "0x484480017fff8000", + "0x2", + "0x48307ffd7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017fd88000", + "0x482480017fd28000", "0x3", - "0x48127fe07fff8000", + "0x48307ffc7fde8000", "0x480a7ff87fff8000", - "0x48127fd47fff8000", - "0x48127fde7fff8000", + "0x48127fce7fff8000", + "0x48127fd97fff8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", @@ -11912,25 +13889,51 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1b", + "0x16", "0x4802800b7ffa8000", + "0x1104800180018000", + "0x21ac", + "0x482480017fff8000", + "0x21ab", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5fd2", + "0x480080017ffd8000", + "0x484480017fff8000", + "0x2", + "0x48307ffd7fff8000", + "0x48307fff7ff68000", "0x482680017ffa8000", "0xf", "0x4802800d7ffa8000", "0x4802800e7ffa8000", "0x10780017fff7fff", - "0x9", + "0x16", "0x40780017fff7fff", - "0x21", + "0x1d", "0x480280047ffa8000", + "0x1104800180018000", + "0x2196", + "0x482480017fff8000", + "0x2195", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x8bb0", + "0x480080017ffd8000", + "0x484480017fff8000", + "0x2", + "0x48307ffd7fff8000", + "0x48307fff7ff68000", "0x482680017ffa8000", "0x8", "0x480280067ffa8000", "0x480280077ffa8000", - "0x48127fd87fff8000", + "0x48127fd27fff8000", "0x48127ffb7fff8000", "0x480a7ff87fff8000", - "0x48127fd47fff8000", + "0x48127fce7fff8000", "0x48127ff97fff8000", "0x480680017fff8000", "0x1", @@ -11949,33 +13952,44 @@ "0x483080007fff7ffd", "0x48307ffc80007ffb", "0x20680017fff7fff", - "0x102", + "0x12a", "0x48127ff87fff8000", "0x48127ff87fff8000", "0x480680017fff8000", "0x3dbce56de34e1cfe252ead5a1f14fd261d520d343ff6b7652174e62976ef44d", "0x480680017fff8000", "0x4b5810004d9272776dec83ecc20c19353453b956e594188890b48467cb53c19", - "0x48507fff7fff8000", - "0x48507ffd7ffd8001", - "0x48507ffc80008001", - "0x482480017ffb8001", + "0x480a7ffc7fff8000", + "0x48507ffe7ffe8000", + "0x48507ffc7ffc8001", + "0x48507ffb80008001", + "0x482480017ffa8001", "0x6f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89", "0x483080007fff7ffd", "0x48307ffc80007ffb", "0x20680017fff7fff", - "0xe3", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x20680017fff7fff", - "0x9", + "0x102", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", + "0x20680017fff7ffe", + "0x12", "0x40780017fff7fff", - "0x17", + "0x12", + "0x1104800180018000", + "0x2157", + "0x482480017fff8000", + "0x2156", + "0x480080007fff8000", + "0x480080027fff8000", + "0x482480017fff8000", + "0x848", "0x480a7ffb7fff8000", - "0x48127fe67fff8000", - "0x48127fe67fff8000", + "0x48307ffe7fe68000", + "0x48127fe37fff8000", + "0x48127fe37fff8000", "0x10780017fff7fff", - "0x32", + "0x36", "0x4800800080068004", "0x4800800180058004", "0x4850800380037ffe", @@ -11988,58 +14002,67 @@ "0x6d232c016ef1b12aec4b7f88cc0b3ab662be3b7dd7adbce5209fcfdbd42a504", "0x400280007ffb7ffc", "0x400280017ffb7ffd", - "0x400280027ffb7ff6", - "0x400280037ffb7ff7", + "0x400280027ffb7ff5", + "0x400280037ffb7ff6", "0x400280047ffb7fff", "0x480280057ffb8000", "0x480280067ffb8000", "0x48127ffc7fff8000", + "0x48127ff47fff8000", "0x482680017ffb8000", "0x7", - "0x480080007ffe8000", - "0x480080017ffd8000", - "0x48307ffe80007ffa", + "0x480080007ffd8000", + "0x480080017ffc8000", + "0x48307ffe80007ff9", "0x20680017fff7fff", "0x5", - "0x40127ffe7fff7ffa", + "0x40127ffe7fff7ff9", "0x10780017fff7fff", - "0xf", - "0x48307ffe7ffa8000", + "0x10", + "0x48307ffe7ff98000", "0x48507ffe80007fff", "0x48507fff7fff8000", - "0x48307ffa7ff68000", + "0x48307ffa7ff58000", "0x48307fff80027ffe", - "0x483080017fff7ff4", + "0x483080017fff7ff3", "0x48507ffe7ffb7fff", - "0x48307ff380007ffe", + "0x48307ff280007ffe", "0x48127ff47fff8000", - "0x48127ffd7fff8000", - "0x48127ffd7fff8000", + "0x48127ff27fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", "0x8", "0x48127ff47fff8000", + "0x482480017ff28000", + "0x208", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x20680017fff7fff", - "0x8", + "0xa", "0x40780017fff7fff", - "0x2a", - "0x48127fb07fff8000", - "0x48127fb07fff8000", + "0x2c", + "0x482480017fd18000", + "0x10a4", + "0x48127fa97fff8000", + "0x48127fa97fff8000", "0x10780017fff7fff", - "0x4c", - "0x20680017fff7fdb", - "0x8", + "0x53", + "0x48127ffd7fff8000", + "0x20680017fff7fd6", + "0xa", "0x40780017fff7fff", - "0x2a", - "0x48127fd47fff8000", - "0x48127fd47fff8000", + "0x2b", + "0x482480017fd48000", + "0xfe6", + "0x48127fd17fff8000", + "0x48127fd17fff8000", "0x10780017fff7fff", - "0x44", + "0x48", "0x4800800080068004", "0x4800800180058004", "0x4850800380037ffe", @@ -12048,75 +14071,80 @@ "0x482480017fff7ffe", "0x6f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89", "0x48307ffd7ffc7ffa", - "0x48307ffd80007ff7", + "0x48307ffd80007ff6", "0x20680017fff7fff", "0x4", "0x402780017fff7fff", "0x1", - "0x48307ffd80007ff7", + "0x48307ffd80007ff6", "0x48507ffe80007fff", "0x48507fff7fff8000", - "0x48307ff97ff38000", + "0x48307ff97ff28000", "0x48307fff80027ffe", - "0x483080017fff7ff1", + "0x483080017fff7ff0", "0x48507ffe7ffb7fff", - "0x48307ff080007ffe", + "0x48307fef80007ffe", "0x48127ffe7fff8000", "0x48127ffe7fff8000", "0x48127ff47fff8000", - "0x48307ffd80007fc7", + "0x48307ffd80007fc2", "0x20680017fff7fff", "0x4", "0x402780017fff7fff", "0x1", - "0x48307ffd80007fc7", + "0x48307ffd80007fc2", "0x48507ffe80007fff", "0x48507fff7fff8000", - "0x48307ff97fc38000", + "0x48307ff97fbe8000", "0x48307fff80027ffe", - "0x483080017fff7fc1", + "0x483080017fff7fbc", "0x48507ffe7ffb7fff", - "0x48307fc080007ffe", + "0x48307fbb80007ffe", "0x48127ffe7fff8000", "0x48127ffe7fff8000", "0x48127ff47fff8000", - "0x480080007fff8000", - "0x480080017ffe8000", - "0x48307ffe80007ffb", + "0x48127fe07fff8000", + "0x480080007ffe8000", + "0x480080017ffd8000", + "0x48307ffe80007ffa", "0x20680017fff7fff", "0x5", - "0x40127ffe7fff7ffb", + "0x40127ffe7fff7ffa", "0x10780017fff7fff", - "0xe", - "0x48307ffe7ffb8000", + "0xf", + "0x48307ffe7ffa8000", "0x48507ffe80007fff", "0x48507fff7fff8000", - "0x48307ffa7ff78000", + "0x48307ffa7ff68000", "0x48307fff80027ffe", - "0x483080017fff7ff5", + "0x483080017fff7ff4", "0x48507ffe7ffb7fff", - "0x48307ff480007ffe", - "0x48127ffe7fff8000", - "0x48127ffe7fff8000", + "0x48307ff380007ffe", + "0x48127ff47fff8000", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", "0x10780017fff7fff", - "0x8", + "0xa", "0x40780017fff7fff", "0x8", + "0x482480017ff48000", + "0x208", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x20680017fff7fff", - "0x12", + "0x13", "0x40780017fff7fff", - "0xc", + "0xf", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127fc37fff8000", - "0x480a7ffc7fff8000", + "0x48127fbc7fff8000", + "0x482480017feb8000", + "0x57b2", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1", @@ -12124,6 +14152,7 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", + "0x48127ffd7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -12131,16 +14160,17 @@ "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffd7fff", - "0x400380017ffd7ffc", + "0x400280017ffd7ffc", "0x400280027ffd7ffd", "0x400280037ffd7ffe", - "0x400280047ffd7ffb", + "0x400280047ffd7ffa", "0x480280067ffd8000", "0x20680017fff7fff", - "0x27", + "0x2b", + "0x480280057ffd8000", "0x480680017fff8000", "0x161bc82433cf4a92809836390ccd14921dfc4dc410cf3d2adbfee5e21ecfec8", - "0x480280057ffd8000", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", "0x482480017ffd8000", @@ -12151,14 +14181,16 @@ "0x400280087ffd7ffc", "0x400280097ffd7ffd", "0x4002800a7ffd7ffe", - "0x4002800b7ffd7ff6", + "0x4002800b7ffd7ff4", "0x4802800d7ffd8000", "0x20680017fff7fff", - "0xf", + "0x11", "0x40780017fff7fff", "0x4", - "0x48127fc37fff8000", "0x4802800c7ffd8000", + "0x48127fbc7fff8000", + "0x482480017ffe8000", + "0x168", "0x482680017ffd8000", "0xe", "0x480680017fff8000", @@ -12169,20 +14201,23 @@ "0x0", "0x208b7fff7fff7ffe", "0x4802800c7ffd8000", + "0x48127fff7fff8000", "0x482680017ffd8000", "0x10", "0x4802800e7ffd8000", "0x4802800f7ffd8000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x6", + "0x7", "0x480280057ffd8000", + "0x482480017fff8000", + "0x2bde", "0x482680017ffd8000", "0x9", "0x480280077ffd8000", "0x480280087ffd8000", - "0x48127fc37fff8000", + "0x48127fbc7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", @@ -12191,14 +14226,22 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x54", + "0x57", + "0x1104800180018000", + "0x205c", + "0x482480017fff8000", + "0x205b", + "0x480080007fff8000", + "0x480080027fff8000", + "0x482480017fff8000", + "0x76de", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", + "0x48307ffc7f998000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1", @@ -12207,14 +14250,22 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x5e", + "0x62", + "0x1104800180018000", + "0x2044", + "0x482480017fff8000", + "0x2043", + "0x480080007fff8000", + "0x480080027fff8000", + "0x482480017fff8000", + "0x7b20", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", + "0x48327ffc7ffc8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1", @@ -12228,7 +14279,8 @@ "0x400380017ffc7ffa", "0x480280037ffc8000", "0x20680017fff7fff", - "0x113", + "0x140", + "0x480280027ffc8000", "0x480280047ffc8000", "0x480080017fff8000", "0x480680017fff8000", @@ -12265,7 +14317,7 @@ "0x4", "0x402780017fff7fff", "0x1", - "0x480280027ffc8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", "0x480080007ff48000", @@ -12297,11 +14349,12 @@ "0x400280087ffc7fe9", "0x4802800a7ffc8000", "0x20680017fff7fff", - "0xbe", + "0xe1", "0x480280097ffc8000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017fe68000", + "0x482480017fe58000", "0x1", "0x4802800b7ffc8000", "0x480680017fff8000", @@ -12312,36 +14365,38 @@ "0x4002800f7ffc7ffd", "0x480280117ffc8000", "0x20680017fff7fff", - "0xa6", + "0xbf", "0x480280107ffc8000", "0x482680017ffc8000", "0x13", "0x480280127ffc8000", - "0x48307fe580007fe6", + "0x48127ffd7fff8000", + "0x48307fe380007fe4", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8c", + "0x9c", "0x480680017fff8000", "0x1", - "0x480080007fe38000", - "0x48307fe280007fe3", + "0x48127ffd7fff8000", + "0x480080007fe08000", + "0x48307fdf80007fe0", "0xa0680017fff8000", "0x6", - "0x48307ffe80007ffc", - "0x400080007fee7fff", + "0x48307ffe80007ffb", + "0x400080007feb7fff", "0x10780017fff7fff", - "0x70", - "0x482480017ffc8000", + "0x77", + "0x482480017ffb8000", "0x1", "0x48307fff80007ffd", - "0x400080007fed7fff", - "0x48307ffa7fde8000", + "0x400080007fea7fff", + "0x48307ff97fdb8000", "0x480680017fff8000", "0x2691cb735b18f3f656c3b82bd97a32b65d15019b64117513f8604d1e06fe58b", - "0x400080007fea7fff", - "0x400180017fea7ffd", - "0x480080027fea8000", + "0x400080007fe77fff", + "0x400180017fe77ffd", + "0x480080027fe78000", "0xa0680017fff8005", "0xe", "0x4824800180057ffe", @@ -12349,68 +14404,72 @@ "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8003", - "0x480080017fe67ffc", - "0x480080027fe57ffc", + "0x480080017fe37ffc", + "0x480080027fe27ffc", "0x482480017ffb7ffd", "0xffffffffffffffeefffffffffffffeff", - "0x400080037fe37ffc", + "0x400080037fe07ffc", "0x10780017fff7fff", "0x11", "0x48127ffe7fff8005", "0x484480017ffe8000", "0x8000000000000000000000000000000", "0x48307ffe7fff8003", - "0x480080017fe67ffd", + "0x480080017fe37ffd", "0x482480017ffc7ffe", "0xf0000000000000000000000000000100", - "0x480080027fe47ffd", - "0x400080037fe37ff9", + "0x480080027fe17ffd", + "0x400080037fe07ff9", "0x402480017ffd7ff9", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7ffd", "0x4", "0x402780017fff7fff", "0x1", + "0x48127ff07fff8000", "0x480680017fff8000", "0x0", - "0x48307ff07fe88000", - "0x480080007ff48000", - "0x482480017fdf8000", + "0x48307fef7fe58000", + "0x480080007ff38000", + "0x482480017fdb8000", "0x3", - "0x482480017fdf8000", + "0x482480017fdb8000", "0x4", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080007fe77fff", - "0x400080017fe77fe6", - "0x400080027fe77ffa", - "0x400080037fe77ff9", - "0x400080047fe77ffb", - "0x480080067fe78000", + "0x400080007fe47fff", + "0x400080017fe47ff9", + "0x400080027fe47ffa", + "0x400080037fe47ff8", + "0x400080047fe47ffb", + "0x480080067fe48000", "0x20680017fff7fff", - "0x27", - "0x480080057fe68000", + "0x2b", + "0x480080057fe38000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", - "0x482480017ff68000", + "0x482480017ff48000", "0x1", - "0x48307ff87fe48000", + "0x48307ff77fe08000", "0x480680017fff8000", "0x53746f726167655772697465", - "0x400080077fe17fff", - "0x400080087fe17ffb", - "0x400080097fe17ffc", - "0x4000800a7fe17ffd", - "0x4000800b7fe17ffe", - "0x4800800d7fe18000", + "0x400080077fdd7fff", + "0x400080087fdd7ffb", + "0x400080097fdd7ffc", + "0x4000800a7fdd7ffd", + "0x4000800b7fdd7ffe", + "0x4800800d7fdd8000", "0x20680017fff7fff", - "0x10", + "0x12", "0x40780017fff7fff", "0x4", - "0x48127ff37fff8000", - "0x4800800c7fdb8000", - "0x48127ff07fff8000", - "0x482480017fd98000", + "0x4800800c7fd88000", + "0x48127ff17fff8000", + "0x482480017ffe8000", + "0x168", + "0x48127fee7fff8000", + "0x482480017fd48000", "0xe", "0x480680017fff8000", "0x0", @@ -12419,23 +14478,26 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x4800800c7fe08000", - "0x482480017fdf8000", + "0x4800800c7fdc8000", + "0x48127fff7fff8000", + "0x482480017fda8000", "0x10", - "0x4800800e7fde8000", - "0x4800800f7fdd8000", + "0x4800800e7fd98000", + "0x4800800f7fd88000", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x6", - "0x480080057fe08000", - "0x482480017fdf8000", + "0x7", + "0x480080057fdc8000", + "0x482480017fff8000", + "0x2bde", + "0x482480017fda8000", "0x9", - "0x480080077fde8000", - "0x480080087fdd8000", - "0x48127ff37fff8000", + "0x480080077fd98000", + "0x480080087fd88000", + "0x48127ff17fff8000", "0x48127ffb7fff8000", - "0x48127ff07fff8000", + "0x48127fee7fff8000", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -12443,17 +14505,25 @@ "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1a", + "0x17", + "0x1104800180018000", + "0x1f45", + "0x482480017fff8000", + "0x1f44", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5ce4", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", - "0x482480017fd28000", + "0x482480017fcc8000", "0x1", - "0x48127fda7fff8000", - "0x48127fcf7fff8000", - "0x48127fd97fff8000", + "0x48307ffc7fdb8000", + "0x48127fc97fff8000", + "0x48127fd47fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", @@ -12461,16 +14531,24 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x1f", + "0x1d", + "0x1104800180018000", + "0x1f2b", + "0x482480017fff8000", + "0x1f2a", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x5faa", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e646578206f7574206f6620626f756e6473", "0x400080007ffe7fff", - "0x48127fd27fff8000", - "0x48127fda7fff8000", - "0x48127fcf7fff8000", - "0x48127fd97fff8000", + "0x48127fcc7fff8000", + "0x48307ffc7fd88000", + "0x48127fc97fff8000", + "0x48127fd47fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", @@ -12478,24 +14556,42 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x21", + "0x1f", "0x480280107ffc8000", + "0x1104800180018000", + "0x1f11", + "0x482480017fff8000", + "0x1f10", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x6126", + "0x48307fff7ff98000", "0x482680017ffc8000", "0x14", "0x480280127ffc8000", "0x480280137ffc8000", "0x10780017fff7fff", - "0x9", + "0x12", "0x40780017fff7fff", - "0x27", + "0x26", "0x480280097ffc8000", + "0x1104800180018000", + "0x1eff", + "0x482480017fff8000", + "0x1efe", + "0x480080007fff8000", + "0x480080007fff8000", + "0x482480017fff8000", + "0x8d04", + "0x48307fff7ff98000", "0x482680017ffc8000", "0xd", "0x4802800b7ffc8000", "0x4802800c7ffc8000", - "0x48127fd27fff8000", + "0x48127fcc7fff8000", "0x48127ffb7fff8000", - "0x48127fcf7fff8000", + "0x48127fc97fff8000", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -12503,9 +14599,20 @@ "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x4d", - "0x480a7ff97fff8000", + "0x4c", "0x480280027ffc8000", + "0x1104800180018000", + "0x1ee6", + "0x482480017fff8000", + "0x1ee5", + "0x480080007fff8000", + "0x480080007fff8000", + "0x484480017fff8000", + "0x2", + "0x482480017fff8000", + "0xc62a", + "0x480a7ff97fff8000", + "0x48307ffe7ff78000", "0x480a7ffb7fff8000", "0x482680017ffc8000", "0x6", @@ -12533,13 +14640,13 @@ "0x20680017fff7ffb", "0x4", "0x10780017fff7fff", - "0x19b", + "0x1d9", "0x402480017fff7ffb", "0x1", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x195", + "0x1d3", "0x482680017ffc8000", "0x4", "0x482680017ffc8000", @@ -12552,17 +14659,32 @@ "0x0", "0x480680017fff8000", "0x0", + "0x480a7ffd7fff8000", "0x482680017ffc8000", "0x24", - "0x400080007ff97ffb", - "0x400080017ff97ffc", - "0x400080027ff97ffd", - "0x400080037ff97ffe", - "0x482480017ff98000", + "0x400080007ff87ffa", + "0x400080017ff87ffb", + "0x400080027ff87ffc", + "0x400080037ff87ffd", + "0x482480017ff88000", "0x4", - "0x48307fff80007ff9", + "0x48307fff80007ff8", "0x20680017fff7fff", - "0x12", + "0x20", + "0x1104800180018000", + "0x1ea0", + "0x482480017fff8000", + "0x1e9f", + "0x480080007fff8000", + "0x480080047fff8000", + "0x484480017fff8000", + "0x2", + "0x482480017fff8000", + "0x1401a", + "0x480080057ffc8000", + "0x484480017fff8000", + "0x4", + "0x48307ffd7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -12571,8 +14693,8 @@ "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", - "0x48127ff87fff8000", - "0x480a7ffd7fff8000", + "0x48127fee7fff8000", + "0x48307ff97fec8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", @@ -12587,19 +14709,20 @@ "0x0", "0x480680017fff8000", "0x0", - "0x400080007ffa7ffc", - "0x400080017ffa7ffd", - "0x400080027ffa7ffe", - "0x400080037ffa7fff", - "0x482480017ffa8000", + "0x48127ff87fff8000", + "0x400080007ff97ffb", + "0x400080017ff97ffc", + "0x400080027ff97ffd", + "0x400080037ff97ffe", + "0x482480017ff98000", "0x4", - "0x48307fff80007ff3", + "0x48307fff80007ff1", "0x20680017fff7fff", - "0x14d", + "0x16d", "0x1104800180018000", - "0x1c2c", + "0x1e5d", "0x482480017fff8000", - "0x1c2b", + "0x1e5c", "0x480680017fff8000", "0x2", "0x482480017ffe8000", @@ -12610,31 +14733,32 @@ "0x0", "0x480680017fff8000", "0x1", - "0x4824800180007fea", + "0x48127ff57fff8000", + "0x4824800180007fe7", "0xc", - "0x400080007fff7ffe", - "0x400080017fff7ffd", - "0x400080027fff7ffd", - "0x400080037fff7ffd", - "0x400280007ffa7fe3", - "0x400280017ffa7fe4", - "0x400280027ffa7fe5", - "0x400280037ffa7fe6", + "0x400080007fff7ffd", + "0x400080017fff7ffc", + "0x400080027fff7ffc", + "0x400080037fff7ffc", + "0x400280007ffa7fe0", + "0x400280017ffa7fe1", + "0x400280027ffa7fe2", + "0x400280037ffa7fe3", "0x400280047ffa7fff", - "0x400280057ffa7ff9", - "0x400280067ffa7ffa", - "0x400280007ffb7fe3", - "0x400280017ffb7fe4", - "0x400280027ffb7fe5", - "0x400280037ffb7fe6", + "0x400280057ffa7ff8", + "0x400280067ffa7ff9", + "0x400280007ffb7fe0", + "0x400280017ffb7fe1", + "0x400280027ffb7fe2", + "0x400280037ffb7fe3", "0x400280047ffb7fff", - "0x400280057ffb7ffb", + "0x400280057ffb7ffa", "0x480280067ffb8000", "0x484480017fff8000", "0x7", - "0x48307ffe80007ffa", + "0x48307ffe80007ff9", "0x20680017fff7fff", - "0xca", + "0xdf", "0x482480017ffc8000", "0x20", "0x480080007fff8000", @@ -12644,34 +14768,43 @@ "0x402780017ffa8000", "0xe", "0x40337ff97ffb8006", - "0x48307fff80007fde", + "0x48127ff67fff8000", + "0x48307ffe80007fda", "0x20680017fff7fff", - "0x13", - "0x48307ffd80007fdc", + "0x19", + "0x48127ffe7fff8000", + "0x48307ffb80007fd7", "0x20680017fff7fff", - "0xb", - "0x48307ffb80007fda", + "0xe", + "0x48127ffe7fff8000", + "0x48307ff880007fd4", "0x20680017fff7fff", - "0x5", - "0x48307ff980007fd8", - "0x10780017fff7fff", - "0xd", - "0x48127fff7fff8000", + "0x6", + "0x48127ffe7fff8000", + "0x48307ff580007fd1", "0x10780017fff7fff", - "0xa", - "0x40780017fff7fff", - "0x1", + "0x12", + "0x48127ffe7fff8000", "0x48127ffe7fff8000", "0x10780017fff7fff", - "0x5", + "0xe", "0x40780017fff7fff", "0x2", - "0x48127ffd7fff8000", - "0x400080007fe27fff", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ffc8000", + "0xb4", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x4", + "0x482480017ffa8000", + "0x230", + "0x48127ffa7fff8000", + "0x400080007fdc7fff", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x6", "0x480680017fff8000", @@ -12681,11 +14814,11 @@ "0x480680017fff8000", "0x0", "0x1104800180018000", - "0xc88", - "0x402580017fd38005", + "0xe4d", + "0x402580017fcd8005", "0x1", "0x20680017fff7fff", - "0x8b", + "0x96", "0x40780017fff7fff", "0x1", "0x480a7ff97fff8000", @@ -12700,134 +14833,146 @@ "0x480680017fff8000", "0x1f", "0x1104800180018000", - "0xc94", - "0x20680017fff7ffb", - "0x70", + "0xe59", + "0x48127f777fff8000", + "0x20680017fff7ffa", + "0x79", + "0x48127ff97fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", "0x48127ffa7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", "0x480680017fff8000", "0x6f7574707574286d756c29203d3d2075333834207b206c696d62303a20362c", "0x480680017fff8000", "0x1f", "0x1104800180018000", - "0xc87", - "0x20680017fff7ffb", - "0x59", + "0xe4b", + "0x48127f887fff8000", + "0x20680017fff7ffa", + "0x60", + "0x48127ff97fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", "0x48127ffa7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", "0x480680017fff8000", "0x206c696d62313a20302c206c696d62323a20302c206c696d62333a2030207d", "0x480680017fff8000", "0x1f", "0x1104800180018000", - "0xc7a", - "0x20680017fff7ffb", - "0x42", + "0xe3d", + "0x48127f887fff8000", + "0x20680017fff7ffa", + "0x47", + "0x48127ff97fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", "0x48127ffa7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", "0x480680017fff8000", "0x602e", "0x480680017fff8000", "0x2", "0x1104800180018000", - "0xc6d", - "0x20680017fff7ffb", - "0x2b", + "0xe2f", + "0x48127f887fff8000", + "0x20680017fff7ffa", + "0x2e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x46a6158a16a947e5916b2a2ca68501a45e93d7110e81aa2d6438b1c57c879a3", "0x400080007ffe7fff", - "0x40137ffa7fff8001", - "0x40137ffb7fff8002", - "0x40137ffc7fff8003", - "0x40137ffd7fff8004", + "0x40137ff97fff8001", + "0x40137ffa7fff8002", + "0x40137ffb7fff8003", + "0x40137ffc7fff8004", "0x4829800180008002", "0x400080017ffd7fff", - "0x48127ff77fff8000", - "0x480a7ffd7fff8000", + "0x48127ff67fff8000", + "0x48127ffb7fff8000", "0x480a80017fff8000", "0x480a80027fff8000", "0x48127ff97fff8000", "0x482480017ff88000", "0x2", "0x1104800180018000", - "0x10a1", + "0x1262", "0x20680017fff7ffd", - "0x9", + "0xa", "0x400180007fff8003", "0x400180017fff8004", - "0x48127ffe7fff8000", - "0x482480017ffe8000", + "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", "0x2", "0x10780017fff7fff", - "0x4", - "0x48127ffe7fff8000", - "0x48127ffe7fff8000", - "0x48127ff97fff8000", + "0x6", + "0x482480017ffc8000", + "0x12c", + "0x48127ffd7fff8000", + "0x48127ffd7fff8000", + "0x48127ff87fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x48127ff67fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", "0x48127ff87fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x480a7ffd7fff8000", + "0x482480017ffb8000", + "0xe2e", "0x480680017fff8000", "0x1", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x480a7ffd7fff8000", + "0x482480017ffb8000", + "0x5398", "0x480680017fff8000", "0x1", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x480a7ffd7fff8000", + "0x482480017ffb8000", + "0x9902", "0x480680017fff8000", "0x1", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x480a7ffd7fff8000", + "0x482480017ffb8000", + "0xde6c", "0x480680017fff8000", "0x1", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a80007fff8000", "0x480a80067fff8000", "0x480a80057fff8000", - "0x480a7ffd7fff8000", + "0x482480017feb8000", + "0x1243a", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -12847,25 +14992,25 @@ "0x1", "0x484480017ff88000", "0x3", - "0x48307fff7ff28000", + "0x48307fff7ff18000", "0x400080027fff7ffc", "0x480080017fff8000", "0x480080007ffe8000", - "0x48307ff380007fe2", - "0x400080007fe17ff9", - "0x400080017fe17ff9", - "0x400080027fe17ff9", - "0x400080037fe17ff9", + "0x48307ff380007fe0", + "0x400080007fdf7ff9", + "0x400080017fdf7ff9", + "0x400080027fdf7ff9", + "0x400080037fdf7ff9", "0x4800800080007ffe", "0x400080017fff7ffc", "0x400080027fff7ffe", - "0x400080047fe07ff2", - "0x48307ff280007fee", - "0x400080057fdf7fff", - "0x400080007ff67fd4", - "0x400080017ff67fd5", - "0x400080027ff67fd6", - "0x400080037ff67fd7", + "0x400080047fde7ff2", + "0x48307ff280007fed", + "0x400080057fdd7fff", + "0x400080007ff67fd1", + "0x400080017ff67fd2", + "0x400080027ff67fd3", + "0x400080037ff67fd4", "0x400080047ff67ff0", "0x400080057ff67ffe", "0x400080067ff67ff8", @@ -12885,48 +15030,72 @@ "0x40127ff27fff7ff3", "0x482680017ffa8000", "0xe", - "0x48127fee7fff8000", - "0x482480017fed8000", + "0x482480017fe98000", + "0x11cfa", + "0x48127fed7fff8000", + "0x482480017fec8000", "0x1", - "0x482480017fd78000", + "0x482480017fd48000", "0x6", - "0x482480017fed8000", + "0x482480017fec8000", "0x7", - "0x48307ffa80007fcd", + "0x48307ff980007fc9", "0x20680017fff7fff", - "0x13", - "0x48307ff880007fcb", + "0x19", + "0x48127ffa7fff8000", + "0x48307ff680007fc6", "0x20680017fff7fff", - "0xb", - "0x48307ff680007fc9", + "0xe", + "0x48127ffe7fff8000", + "0x48307ff380007fc3", "0x20680017fff7fff", - "0x5", - "0x48307ff480007fc7", - "0x10780017fff7fff", - "0xd", - "0x48127fff7fff8000", + "0x6", + "0x48127ffe7fff8000", + "0x48307ff080007fc0", "0x10780017fff7fff", - "0xa", - "0x40780017fff7fff", - "0x1", + "0x12", + "0x48127ffe7fff8000", "0x48127ffe7fff8000", "0x10780017fff7fff", - "0x5", + "0xe", "0x40780017fff7fff", "0x2", - "0x48127ffd7fff8000", - "0x400080007ffa7fff", + "0x482480017ffc8000", + "0xb4", + "0x48127ffc7fff8000", + "0x10780017fff7fff", + "0x7", + "0x40780017fff7fff", + "0x4", + "0x482480017ff68000", + "0x230", + "0x48127ffa7fff8000", + "0x400080007ff77fff", "0x480a7ff97fff8000", + "0x48127ff27fff8000", "0x48127ff67fff8000", - "0x48127ff97fff8000", - "0x482480017ff78000", + "0x482480017ff48000", "0x1", - "0x480a7ffd7fff8000", + "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x48127fef7fff8000", + "0x48127fef7fff8000", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1d05", + "0x482480017fff8000", + "0x1d04", + "0x480080007fff8000", + "0x480080047fff8000", + "0x484480017fff8000", + "0x2", + "0x482480017fff8000", + "0x13b6a", + "0x480080057ffc8000", + "0x484480017fff8000", + "0x4", + "0x48307ffd7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -12935,14 +15104,28 @@ "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", - "0x48127ff27fff8000", - "0x480a7ffd7fff8000", + "0x48127fe77fff8000", + "0x48307ff97fed8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", "0x482480017ff78000", "0x1", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x1ce7", + "0x482480017fff8000", + "0x1ce6", + "0x480080007fff8000", + "0x480080047fff8000", + "0x484480017fff8000", + "0x2", + "0x482480017fff8000", + "0x14d72", + "0x480080057ffc8000", + "0x484480017fff8000", + "0x4", + "0x48307ffd7fff8000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -12952,7 +15135,7 @@ "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", + "0x48327ff97ffd8000", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", @@ -12999,22 +15182,42 @@ "0x400380027ff97ffa", "0x480280047ff98000", "0x20680017fff7fff", - "0xf8", + "0x19a", "0x480280037ff98000", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x995a1546f96051a2b911879c7b314d53d580bd592e7ea51593aaec427e3c9b", + "0x480680017fff8000", + "0x7", "0x480280057ff98000", "0x480680017fff8000", - "0x43616c6c436f6e7472616374", + "0x53746f726167655772697465", "0x400280067ff97fff", - "0x400280077ff97ffd", - "0x400380087ff97ffa", - "0x400380097ff97ffb", - "0x4003800a7ff97ffc", - "0x4003800b7ff97ffd", - "0x4802800d7ff98000", + "0x400280077ff97ffa", + "0x400280087ff97ffb", + "0x400280097ff97ffc", + "0x4002800a7ff97ffd", + "0x4802800c7ff98000", "0x20680017fff7fff", - "0x1b", + "0x17b", + "0x4802800b7ff98000", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x4002800d7ff97fff", + "0x4002800e7ff97ffe", + "0x4003800f7ff97ffa", + "0x400380107ff97ffb", + "0x400380117ff97ffc", + "0x400380127ff97ffd", + "0x480280147ff98000", + "0x20680017fff7fff", + "0x1d", "0x40780017fff7fff", - "0x18", + "0x2e", + "0x480280137ff98000", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -13029,25 +15232,27 @@ "0x480680017fff8000", "0xf", "0x400080037ffb7fff", - "0x4802800c7ff98000", + "0x482480017ffa8000", + "0x8d2c", "0x482680017ff98000", - "0x10", + "0x17", "0x480680017fff8000", "0x1", "0x48127ff87fff8000", "0x482480017ff78000", "0x4", "0x208b7fff7fff7ffe", - "0x4802800e7ff98000", - "0x4802800f7ff98000", - "0x4802800c7ff98000", + "0x480280137ff98000", + "0x480280157ff98000", + "0x480280167ff98000", "0x482680017ff98000", - "0x10", + "0x17", + "0x48127ffc7fff8000", "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xb9", + "0x138", "0x4824800180007ffc", "0x1", "0x480080007fff8000", @@ -13056,80 +15261,155 @@ "0x48127ff87fff8000", "0x4824800180007ff8", "0x1", - "0x20680017fff7ffd", - "0xa0", - "0x48307ffe80007fff", + "0x48127ff97fff8000", + "0x20680017fff7ffc", + "0x11d", + "0x48127fff7fff8000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8c", - "0x4824800180007ffe", + "0x107", + "0x4824800180007ffc", "0x1", "0x4825800180007ffb", "0x1c4e1062ccac759d9786c18a401086aa7ab90fde340fffd5cbd792d11daa7e7", - "0x480080007ffe8000", - "0x20680017fff7ffe", - "0x17", - "0x4824800180007fff", - "0x454e545259504f494e545f4e4f545f464f554e44", - "0x20680017fff7fff", + "0x48127ffc7fff8000", + "0x480080007ffd8000", + "0x20680017fff7ffd", + "0x1d", + "0x40780017fff7fff", "0x4", + "0x4824800180007ffb", + "0x454e545259504f494e545f4e4f545f464f554e44", + "0x482480017ff98000", + "0x168", + "0x20680017fff7ffe", + "0x5", + "0x48127fff7fff8000", "0x10780017fff7fff", - "0x15", + "0x3d", "0x40780017fff7fff", - "0xc", + "0x1a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x556e6578706563746564206572726f72", "0x400080007ffe7fff", - "0x48127fe57fff8000", - "0x48127fe57fff8000", + "0x482480017fe38000", + "0x84f8", + "0x48127fce7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", - "0x4824800180007fff", + "0x4825800180007ffb", + "0x1e4089d1f1349077b1970f9937c904e27c4582b49a60b6078946dba95bc3c08", + "0x48127ffd7fff8000", + "0x20680017fff7ffe", + "0x1d", + "0x40780017fff7fff", + "0x2", + "0x4824800180007ffb", "0x746573745f7265766572745f68656c706572", - "0x20680017fff7fff", - "0x5d", + "0x482480017ffc8000", + "0x50", + "0x20680017fff7ffe", + "0x5", + "0x48127fff7fff8000", + "0x10780017fff7fff", + "0x1d", + "0x40780017fff7fff", + "0x1a", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x556e6578706563746564206572726f72", + "0x400080007ffe7fff", + "0x482480017fe38000", + "0x84f8", + "0x48127fce7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x4825800180007ffb", + "0x311fb2a7f01403971aca6ae0a12b8ad0602e7a5ec48ad48951969942e99d788", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xaf", + "0x4824800180007ffb", + "0x657865637574655f616e645f726576657274", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x9a", + "0x48127fff7fff8000", "0x480680017fff8000", "0x476574436c617373486173684174", - "0x400080007ff37fff", - "0x400080017ff37ff2", - "0x400180027ff37ffa", - "0x480080047ff38000", + "0x400080007fe97fff", + "0x400080017fe97ffe", + "0x400180027fe97ffa", + "0x480080047fe98000", "0x20680017fff7fff", - "0x4b", - "0x480080037ff28000", + "0x85", + "0x480080037fe88000", + "0x48127fff7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", - "0x480080057fef8000", + "0x480080057fe48000", "0x480680017fff8000", "0x53746f7261676552656164", - "0x400080067fed7fff", - "0x400080077fed7ffb", - "0x400080087fed7ffc", - "0x400080097fed7ffd", - "0x4800800b7fed8000", + "0x400080067fe27fff", + "0x400080077fe27ffb", + "0x400080087fe27ffc", + "0x400080097fe27ffd", + "0x4800800b7fe28000", "0x20680017fff7fff", - "0x32", - "0x4800800c7fec8000", - "0x4800800a7feb8000", - "0x482480017fea8000", + "0x69", + "0x4800800a7fe18000", + "0x4800800c7fe08000", + "0x482480017fdf8000", "0xd", + "0x48127ffd7fff8000", "0x20680017fff7ffd", - "0x1d", - "0x48307ffa80007fe3", + "0x52", + "0x48307ff980007fd3", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x3e", + "0x48127fff7fff8000", + "0x480680017fff8000", + "0x0", + "0x480680017fff8000", + "0x995a1546f96051a2b911879c7b314d53d580bd592e7ea51593aaec427e3c9b", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400080007ff87fff", + "0x400080017ff87ffc", + "0x400080027ff87ffd", + "0x400080037ff87ffe", + "0x480080057ff88000", "0x20680017fff7fff", - "0xd", + "0x24", + "0x480080047ff78000", + "0x480080067ff68000", + "0x4824800180007fff", + "0x7", + "0x482480017ff48000", + "0x7", + "0x48127ffc7fff8000", + "0x20680017fff7ffd", + "0xe", "0x40780017fff7fff", "0x2", - "0x48127ffb7fff8000", + "0x482480017ffd8000", + "0xb4", "0x48127ffb7fff8000", "0x480680017fff8000", "0x0", @@ -13141,9 +15421,9 @@ "0x40780017fff7fff", "0x1", "0x480680017fff8000", - "0x636c61737320686173682073686f756c64206e6f74206368616e67652e", + "0x746573745f73746f726167655f7661725f6368616e6765642e", "0x400080007ffe7fff", - "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", @@ -13152,14 +15432,43 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", + "0x6", + "0x480080047ff18000", + "0x482480017fff8000", + "0x280", + "0x482480017fef8000", + "0x8", + "0x480680017fff8000", "0x1", + "0x480080067fed8000", + "0x480080077fec8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xa", "0x40780017fff7fff", "0x1", "0x480680017fff8000", - "0x76616c7565732073686f756c64206e6f74206368616e67652e", + "0x636c61737320686173682073686f756c64206e6f74206368616e67652e", "0x400080007ffe7fff", + "0x482480017ff38000", + "0x2c88", + "0x48127fef7fff8000", + "0x480680017fff8000", + "0x1", "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0xc", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x76616c7565732073686f756c64206e6f74206368616e67652e", + "0x400080007ffe7fff", + "0x482480017ff18000", + "0x2da0", + "0x48127fef7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -13167,34 +15476,39 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x6", - "0x4800800a7fe68000", - "0x482480017fe58000", + "0x11", + "0x4800800a7fd08000", + "0x482480017fff8000", + "0x302a", + "0x482480017fce8000", "0xe", "0x480680017fff8000", "0x1", - "0x4800800c7fe38000", - "0x4800800d7fe28000", + "0x4800800c7fcc8000", + "0x4800800d7fcb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xc", - "0x480080037fe68000", - "0x482480017fe58000", + "0x18", + "0x480080037fd08000", + "0x482480017fff8000", + "0x5ba4", + "0x482480017fce8000", "0x7", "0x480680017fff8000", "0x1", - "0x480080057fe38000", - "0x480080067fe28000", + "0x480080057fcc8000", + "0x480080067fcb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xc", + "0x1a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", - "0x556e6578706563746564206572726f72", + "0x57726f6e675f6572726f72", "0x400080007ffe7fff", - "0x48127fe57fff8000", - "0x48127fe57fff8000", + "0x482480017fe38000", + "0x8494", + "0x48127fce7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -13202,14 +15516,31 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x10", + "0x1c", + "0x40780017fff7fff", + "0x1", + "0x480680017fff8000", + "0x57726f6e6720456e74727920506f696e74", + "0x400080007ffe7fff", + "0x482480017fe18000", + "0x85ac", + "0x48127fce7fff8000", + "0x480680017fff8000", + "0x1", + "0x48127ffb7fff8000", + "0x482480017ffa8000", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x24", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127fe57fff8000", - "0x48127fe57fff8000", + "0x482480017fd88000", + "0x8944", + "0x48127fce7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -13217,14 +15548,15 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x11", + "0x26", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x556e6578706563746564206572726f72", "0x400080007ffe7fff", - "0x48127fe57fff8000", - "0x48127fe57fff8000", + "0x482480017fd78000", + "0x8ac0", + "0x48127fce7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -13232,14 +15564,15 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x16", + "0x2c", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127fe57fff8000", - "0x48127fe57fff8000", + "0x482480017fd08000", + "0x8cdc", + "0x48127fce7fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -13247,8 +15580,22 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x21", + "0x37", + "0x4802800b7ff98000", + "0x482480017fff8000", + "0xbbb2", + "0x482680017ff98000", + "0xf", + "0x480680017fff8000", + "0x1", + "0x4802800d7ff98000", + "0x4802800e7ff98000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x3f", "0x480280037ff98000", + "0x482480017fff8000", + "0xe7ea", "0x482680017ff98000", "0x7", "0x480680017fff8000", @@ -13444,19 +15791,21 @@ "0xa0680017fff8000", "0x7", "0x482680017ff88000", - "0xffffffffffffffffffffffffffffe304", + "0xffffffffffffffffffffffffffffe23c", "0x400280007ff77fff", "0x10780017fff7fff", - "0x37", + "0x3b", "0x4825800180007ff8", - "0x1cfc", + "0x1dc4", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x20780017fff7ffd", - "0xd", - "0x48127fff7fff8000", - "0x48127ffd7fff8000", + "0xe", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0x1e28", "0x480680017fff8000", "0x0", "0x480a7ff97fff8000", @@ -13466,34 +15815,36 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", - "0x48127fff7fff8000", + "0x48127ffe7fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", - "0xe0f", - "0x20680017fff7ffc", + "0xefe", + "0x48127fda7fff8000", + "0x20680017fff7ffb", "0x11", - "0x400280007ffc7ffd", - "0x400280017ffc7ffe", - "0x400280027ffc7fff", - "0x48127ff97fff8000", - "0x48127fd87fff8000", - "0x48127ff87fff8000", + "0x400280007ffc7ffc", + "0x400280017ffc7ffd", + "0x400280027ffc7ffe", "0x48127ff87fff8000", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x480a7ffb7fff8000", "0x482680017ffc8000", "0x3", "0x4825800180007ffd", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd2", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", - "0x48127fd87fff8000", + "0x48127ff87fff8000", + "0x482480017ffe8000", + "0x7b2", "0x480680017fff8000", "0x0", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -13524,20 +15875,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff4ca", + "0xfffffffffffffffffffffffffffff33a", "0x400280007ff87fff", "0x10780017fff7fff", - "0x5b", + "0x63", "0x4825800180007ff9", - "0xb36", + "0xcc6", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x1", "0x480a7ffb7fff8000", @@ -13545,7 +15898,8 @@ "0x0", "0x480a7ffa7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", @@ -13553,35 +15907,38 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x36", - "0x480080007fff8000", + "0x3a", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x1d", + "0x1f", "0x480280007ffc8000", "0x48307fff80007ffd", + "0x48127ffb7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x20680017fff7ffd", + "0x20680017fff7ffc", "0xb", - "0x48127ff47fff8000", + "0x48127ff07fff8000", + "0x48127ffc7fff8000", + "0x48127ff27fff8000", "0x48127ff27fff8000", - "0x48127ff47fff8000", - "0x48127ff47fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcd", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc8", "0x208b7fff7fff7ffe", - "0x48127ff47fff8000", - "0x48127ff27fff8000", + "0x48127ff07fff8000", + "0x482480017ffc8000", + "0x622", "0x480680017fff8000", "0x0", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x480680017fff8000", @@ -13592,8 +15949,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -13606,8 +15964,9 @@ "0x482480017ff78000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xa0a", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -13640,20 +15999,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff0e2", + "0xffffffffffffffffffffffffffffee8a", "0x400280007ff87fff", "0x10780017fff7fff", - "0x71", + "0x80", "0x4825800180007ff9", - "0xf1e", + "0x1176", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x3", "0x480a7ffb7fff8000", @@ -13661,7 +16022,8 @@ "0x0", "0x480a7ffa7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", @@ -13669,59 +16031,69 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x4c", - "0x480080007fff8000", - "0x480080017ffe8000", - "0x480080027ffd8000", + "0x57", + "0x48127ffb7fff8000", + "0x480080007ffe8000", + "0x480080017ffd8000", + "0x480080027ffc8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x31", + "0x3a", "0x480280007ffc8000", "0x480280017ffc8000", "0x480280027ffc8000", "0x48307ffd80007ff9", + "0x48127ff77fff8000", "0x482680017ffc8000", "0x3", "0x480a7ffd7fff8000", - "0x20680017fff7ffd", - "0x1b", - "0x48307ffb80007ff7", + "0x20680017fff7ffc", + "0x21", + "0x48127ffd7fff8000", + "0x48307ff980007ff5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x1", + "0x2", + "0x482480017ffc8000", + "0x6d6", "0x10780017fff7fff", - "0x14", - "0x48307ffb80007ff7", + "0x19", + "0x48127ffe7fff8000", + "0x48307ff880007ff4", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x4", + "0x6", + "0x482480017ffe8000", + "0x5be", "0x10780017fff7fff", - "0xd", - "0x48127fee7fff8000", - "0x48127fec7fff8000", - "0x48127fee7fff8000", - "0x48127fee7fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0xf", + "0x48127fe87fff8000", + "0x48127ffd7fff8000", + "0x48127fea7fff8000", + "0x48127fea7fff8000", + "0x48127ff67fff8000", + "0x48127ff67fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb9", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffae", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2", - "0x48127fee7fff8000", - "0x48127fec7fff8000", + "0x4", + "0x482480017ff98000", + "0x852", + "0x48127fe77fff8000", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", - "0x48127fed7fff8000", - "0x48127fed7fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127fe87fff8000", + "0x48127fe87fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", @@ -13730,8 +16102,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff27fff8000", + "0x48127ff17fff8000", + "0x482480017ff88000", + "0xad2", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -13744,8 +16117,9 @@ "0x482480017ff78000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xeba", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -13778,20 +16152,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xffffffffffffffffffffffffffffdd32", + "0xffffffffffffffffffffffffffffdc06", "0x400280007ff87fff", "0x10780017fff7fff", - "0x42", + "0x48", "0x4825800180007ff9", - "0x22ce", + "0x23fa", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x2", "0x480a7ffb7fff8000", @@ -13799,7 +16175,8 @@ "0x0", "0x480a7ffa7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", @@ -13807,38 +16184,41 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x1f", - "0x48127ffa7fff8000", + "0x21", + "0x48127ff87fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x1104800180018000", - "0xd5b", - "0x20680017fff7ffd", + "0xe2e", + "0x48127fd17fff8000", + "0x20680017fff7ffc", "0xb", - "0x48127ffc7fff8000", - "0x48127fce7fff8000", - "0x48127fd07fff8000", - "0x48127fd07fff8000", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ffb7fff8000", + "0x48127ffe7fff8000", + "0x48127fcf7fff8000", + "0x48127fcf7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd1", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcd", "0x208b7fff7fff7ffe", - "0x48127ffc7fff8000", - "0x48127fce7fff8000", + "0x48127ffb7fff8000", + "0x482480017ffe8000", + "0x622", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x213e", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -13878,183 +16258,211 @@ "0x482680017ff88000", "0x3", "0x20780017fff7ffd", - "0x9", + "0xb", "0x40780017fff7fff", - "0x10", - "0x48127fef7fff8000", + "0x19", + "0x48127fe67fff8000", + "0x482680017ff98000", + "0x1022", "0x480680017fff8000", "0x1", "0x10780017fff7fff", - "0x85", + "0x9d", + "0x480a7ff97fff8000", "0x4825800180007ffd", "0x1", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x55", + "0x67", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x2", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x49", + "0x58", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x3", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x3d", + "0x49", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x4", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x31", + "0x3a", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x5", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x25", + "0x2b", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x6", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x19", + "0x1c", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x7", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xf", + "0x10", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4b656363616b206c61737420696e70757420776f7264203e3762", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x480a7ff97fff8000", + "0x48127fef7fff8000", + "0x482480017ffb8000", + "0x139c", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x100000000000000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x1", + "0x2", + "0x482480017ffc8000", + "0x118", "0x480680017fff8000", "0x1000000000000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x2", + "0x4", + "0x482480017ffa8000", + "0x294", "0x480680017fff8000", "0x10000000000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x3", + "0x6", + "0x482480017ff88000", + "0x410", "0x480680017fff8000", "0x100000000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x4", + "0x8", + "0x482480017ff68000", + "0x58c", "0x480680017fff8000", "0x1000000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x5", + "0xa", + "0x482480017ff48000", + "0x708", "0x480680017fff8000", "0x10000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x6", + "0xc", + "0x482480017ff28000", + "0x884", "0x480680017fff8000", "0x100", "0x20680017fff7fff", - "0xf", + "0x10", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x480a7ff97fff8000", + "0x48127fed7fff8000", + "0x482480017ffb8000", + "0xfb4", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", "0x482480017ffa8000", "0x1", "0x208b7fff7fff7ffe", - "0x480080007ff78004", + "0x480080007fef8004", "0x4824800180037fff", "0x1", "0x48307ffe7fff7ffd", - "0x480080017ff47ffe", - "0x480080027ff37fff", + "0x480080017fec7ffe", + "0x480080027feb7fff", "0x40507ffe7ffa7ffd", "0x40317fff7ffd7ffc", + "0x48127ff97fff8000", "0xa0680017fff8000", "0x8", - "0x48307ffe7ff98000", + "0x48307ffd7ff88000", "0x4824800180007fff", "0x10000000000000000", - "0x400080037fef7fff", + "0x400080037fe67fff", "0x10780017fff7fff", - "0x5b", - "0x48307ffe7ff98001", + "0x61", + "0x48307ffd7ff88001", "0x4824800180007fff", "0xffffffffffffffff0000000000000000", - "0x400080037fef7ffe", - "0x482480017fef8000", + "0x400080037fe67ffe", + "0x482480017fe68000", "0x4", - "0x48127ffe7fff8000", - "0x4824800180007fec", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", + "0x4824800180007fe2", "0x10", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x28", + "0x2a", "0x400280007ffb7ffe", "0x480680017fff8000", "0x10", + "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x482680017ffb8000", "0x1", - "0x48307fe880017ffd", + "0x48307fdd80017ffc", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", "0xc", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", - "0x480a7ff97fff8000", + "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", - "0xd11", + "0xdc6", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x7533325f737562204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x480a7ff97fff8000", + "0x482480017ff78000", + "0x3ca", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -14063,22 +16471,25 @@ "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x8000000000000000", + "0x482480017ffc8000", + "0x492", "0xa0680017fff8000", "0x8", - "0x48307ffc7ffe8000", + "0x48307ffb7ffd8000", "0x4824800180007fff", "0x10000000000000000", - "0x400080007ff97fff", + "0x400080007ff77fff", "0x10780017fff7fff", - "0x10", - "0x48307ffc7ffe8001", + "0x11", + "0x48307ffb7ffd8001", "0x4824800180007fff", "0xffffffffffffffff0000000000000000", - "0x400080007ff97ffe", + "0x400080007ff77ffe", "0x400280007ffb7fff", - "0x482480017ff98000", + "0x482480017ff78000", "0x1", - "0x480a7ff97fff8000", + "0x482480017ffb8000", + "0x12c", "0x480680017fff8000", "0x0", "0x480a7ffa7fff8000", @@ -14090,9 +16501,9 @@ "0x480680017fff8000", "0x7536345f616464204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ff78000", + "0x482480017ff58000", "0x1", - "0x480a7ff97fff8000", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -14104,9 +16515,10 @@ "0x480680017fff8000", "0x7536345f616464204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017fed8000", + "0x482480017fe48000", "0x4", - "0x480a7ff97fff8000", + "0x482480017ff98000", + "0x988", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -14231,7 +16643,7 @@ "0x48127ff27fff8000", "0x48307ffc80007ffd", "0x1104800180018000", - "0xcaa", + "0xd5e", "0x484480017f9c8000", "0x20", "0xa0680017fff8000", @@ -14370,13 +16782,14 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xffffffffffffffffffffffffffffcd10", + "0xffffffffffffffffffffffffffffcb80", "0x400280007ff87fff", "0x10780017fff7fff", - "0x4b", + "0x53", "0x4825800180007ff9", - "0x32f0", + "0x3480", "0x400280007ff87fff", + "0x48127fff7fff8000", "0xa0680017fff8000", "0x8", "0x48297ffc80007ffb", @@ -14384,22 +16797,24 @@ "0xf", "0x400280017ff87fff", "0x10780017fff7fff", - "0xf", + "0x10", "0x482680017ffb8001", "0x10", "0x483180007fff7ffc", "0x400280017ff87ffe", "0x482680017ff88000", "0x2", - "0x48127ffe7fff8000", + "0x48127ffb7fff8000", + "0x48127ffd7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x0", "0x480a7ffb7fff8000", "0x10780017fff7fff", - "0xa", + "0xb", "0x482680017ff88000", "0x2", + "0x48127ffb7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", @@ -14407,28 +16822,32 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x20", + "0x24", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x53686132353650726f63657373426c6f636b", "0x400280007ffa7fff", - "0x400280017ffa7ff6", + "0x400280017ffa7ffe", "0x400380027ffa7ffd", - "0x400280037ffa7ffe", + "0x400280037ffa7ffd", "0x480280057ffa8000", "0x20680017fff7fff", - "0xc", - "0x48127ff97fff8000", + "0xd", "0x480280047ffa8000", + "0x48127ff67fff8000", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x7", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", "0x480280067ffa8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc8", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc3", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", "0x480280047ffa8000", + "0x48127ff67fff8000", + "0x482480017ffe8000", + "0x622", "0x482680017ffa8000", "0x8", "0x480680017fff8000", @@ -14438,8 +16857,9 @@ "0x480280067ffa8000", "0x480280077ffa8000", "0x208b7fff7fff7ffe", - "0x48127ffb7fff8000", - "0x48127ff67fff8000", + "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x30b6", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x0", @@ -14465,14 +16885,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x20780017fff7ff8", - "0x9", + "0x16", + "0x480a7ff37fff8000", "0x20780017fff7ff9", - "0x5", + "0x10", + "0x1104800180018000", + "0x15f6", + "0x482480017fff8000", + "0x15f5", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3508e", "0x480a7ff27fff8000", + "0x48307ffe7ff78000", "0x10780017fff7fff", - "0x27", + "0x42", + "0x48127fff7fff8000", "0x10780017fff7fff", - "0x2", + "0x4", + "0x482680017ff38000", + "0x12c", "0x480680017fff8000", "0xfffffffffffffffffffffffffffffffe", "0x48317fff80017ff9", @@ -14482,33 +16917,56 @@ "0x100000000000000000000000000000000", "0x400280007ff27fff", "0x10780017fff7fff", - "0x29", + "0x41", "0x400280007ff27fff", "0x482680017ff28000", "0x1", + "0x48127ffb7fff8000", "0x4825800180007ff9", "0xfffffffffffffffffffffffffffffffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5", - "0x48127ffe7fff8000", + "0x10", + "0x1104800180018000", + "0x15cf", + "0x482480017fff8000", + "0x15ce", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x34c60", + "0x48127ff67fff8000", + "0x48307ffe7ff68000", "0x10780017fff7fff", - "0xf", + "0x1b", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", - "0x48317fff80017ff8", + "0x48127ffd7fff8000", + "0x48317ffe80017ff8", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffa7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0xf", - "0x400080007ffb7fff", - "0x482480017ffb8000", + "0x19", + "0x400080007ff97fff", + "0x1104800180018000", + "0x15b5", + "0x482480017fff8000", + "0x15b4", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x34a26", + "0x482480017ff28000", "0x1", - "0x480a7ff37fff8000", + "0x48307ffe7ff58000", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480680017fff8000", @@ -14518,21 +16976,41 @@ "0x480680017fff8000", "0x5369676e6174757265206f7574206f662072616e6765", "0x208b7fff7fff7ffe", - "0x482480017ffa8000", + "0x482480017ff88000", "0x1", + "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x4", + "0x6", "0x482680017ff28000", "0x1", + "0x482480017ffa8000", + "0x492", "0x20780017fff7ffa", - "0x9", - "0x20780017fff7ffb", - "0x5", + "0x16", "0x48127fff7fff8000", + "0x20780017fff7ffb", + "0x10", + "0x1104800180018000", + "0x1591", + "0x482480017fff8000", + "0x1590", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x346a2", + "0x48127ff67fff8000", + "0x48307ffe7ff78000", "0x10780017fff7fff", - "0x27", + "0x44", + "0x48127fff7fff8000", "0x10780017fff7fff", - "0x2", + "0x6", + "0x40780017fff7fff", + "0x1", + "0x482480017ffe8000", + "0xbe", "0x480680017fff8000", "0xfffffffffffffffffffffffffffffffe", "0x48317fff80017ffb", @@ -14540,35 +17018,58 @@ "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffb7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0x29", - "0x400080007ffc7fff", - "0x482480017ffc8000", + "0x41", + "0x400080007ff97fff", + "0x482480017ff98000", "0x1", + "0x48127ffb7fff8000", "0x4825800180007ffb", "0xfffffffffffffffffffffffffffffffe", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x5", - "0x48127ffe7fff8000", + "0x10", + "0x1104800180018000", + "0x1568", + "0x482480017fff8000", + "0x1567", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x34274", + "0x48127ff67fff8000", + "0x48307ffe7ff68000", "0x10780017fff7fff", - "0xf", + "0x1b", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", - "0x48317fff80017ffa", + "0x48127ffd7fff8000", + "0x48317ffe80017ffa", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffa7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0xf", - "0x400080007ffb7fff", - "0x482480017ffb8000", + "0x19", + "0x400080007ff97fff", + "0x1104800180018000", + "0x154e", + "0x482480017fff8000", + "0x154d", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3403a", + "0x482480017ff28000", "0x1", - "0x480a7ff37fff8000", + "0x48307ffe7ff58000", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480680017fff8000", @@ -14578,13 +17079,15 @@ "0x480680017fff8000", "0x5369676e6174757265206f7574206f662072616e6765", "0x208b7fff7fff7ffe", - "0x482480017ffa8000", + "0x482480017ff88000", "0x1", + "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x4", - "0x482480017ffb8000", + "0x6", + "0x482480017ff88000", "0x1", - "0x480a7ff37fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", @@ -14594,27 +17097,29 @@ "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", - "0xc2e", + "0xc87", "0x20680017fff7ffd", - "0x3e", - "0x20680017fff7ffe", - "0x2d", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", - "0x480a7ff47fff8000", - "0x48127ff97fff8000", + "0x4b", "0x48127ffb7fff8000", + "0x20680017fff7ffd", + "0x2f", + "0x48127ff97fff8000", + "0x48127ffe7fff8000", + "0x480a7ff47fff8000", + "0x48127ff87fff8000", + "0x48127ffa7fff8000", "0x1104800180018000", - "0x10a2", + "0x111a", "0x20680017fff7ffd", - "0x1b", + "0x1c", "0x48317fff80007ffd", - "0x20680017fff7fff", + "0x48127ff97fff8000", + "0x20680017fff7ffe", "0xd", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -14622,10 +17127,10 @@ "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ffe7fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -14634,7 +17139,8 @@ "0x496e76616c6964207369676e6174757265", "0x208b7fff7fff7ffe", "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x482480017ff98000", + "0x12c", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x480680017fff8000", @@ -14642,41 +17148,69 @@ "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", + "0x1104800180018000", + "0x14f3", + "0x482480017fff8000", + "0x14f2", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0xab68", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff07fff8000", + "0x48307ffc7ff58000", "0x480a7ff47fff8000", - "0x48127ff77fff8000", + "0x48127fef7fff8000", "0x480680017fff8000", "0x1", "0x48127ff97fff8000", "0x482480017ff88000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x1104800180018000", + "0x14da", + "0x482480017fff8000", + "0x14d9", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0xad5c", + "0x48127ff37fff8000", + "0x48307ffe7ff38000", "0x480a7ff47fff8000", - "0x48127ff97fff8000", + "0x48127ff27fff8000", "0x480680017fff8000", "0x1", - "0x48127ff97fff8000", - "0x48127ff97fff8000", + "0x48127ff27fff8000", + "0x48127ff27fff8000", "0x208b7fff7fff7ffe", "0x20780017fff7ff9", - "0xb", + "0xf", + "0x480a7ff57fff8000", "0x20780017fff7ffa", - "0x7", + "0x9", "0x40780017fff7fff", - "0x2bb", + "0x2ce", "0x480a7ff47fff8000", + "0x482480017d308000", + "0x2783a", "0x10780017fff7fff", - "0x2b", + "0x36", + "0x48127fff7fff8000", "0x10780017fff7fff", - "0x2", + "0x6", + "0x40780017fff7fff", + "0x1", + "0x482680017ff58000", + "0xbe", "0x480680017fff8000", "0xffffffff00000000ffffffffffffffff", "0x48317fff80017ffa", @@ -14686,59 +17220,76 @@ "0x100000000000000000000000000000000", "0x400280007ff47fff", "0x10780017fff7fff", - "0x25", + "0x2c", "0x400280007ff47fff", "0x482680017ff48000", "0x1", + "0x48127ffb7fff8000", "0x4825800180007ffa", "0xffffffff00000000ffffffffffffffff", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x7", + "0x9", "0x40780017fff7fff", - "0x2b6", - "0x48127d487fff8000", + "0x2c7", + "0x48127d367fff8000", + "0x482480017d368000", + "0x27452", "0x10780017fff7fff", - "0x11", + "0x14", "0x480680017fff8000", "0xbce6faada7179e84f3b9cac2fc632551", - "0x48317fff80017ff9", + "0x48127ffd7fff8000", + "0x48317ffe80017ff9", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffa7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0x9", - "0x400080007ffb7fff", + "0xb", + "0x400080007ff97fff", "0x40780017fff7fff", - "0x2b3", - "0x482480017d488000", + "0x2c3", + "0x482480017d368000", "0x1", + "0x482480017d398000", + "0x27240", "0x10780017fff7fff", - "0x48b", - "0x482480017ffa8000", + "0x4ba", + "0x482480017ff88000", "0x1", + "0x48127ffb7fff8000", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0x5", + "0x7", "0x482680017ff48000", "0x1", + "0x482480017ff38000", + "0x3e8", "0x20780017fff7ffb", - "0xd", + "0x11", + "0x48127fff7fff8000", "0x20780017fff7ffc", - "0x9", + "0xb", "0x40780017fff7fff", - "0x9", - "0x48127ff67fff8000", + "0xc", + "0x48127ff17fff8000", + "0x482480017ff28000", + "0x6b8", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0x3d", + "0x4b", + "0x48127fff7fff8000", "0x10780017fff7fff", - "0x2", + "0x6", + "0x40780017fff7fff", + "0x1", + "0x482480017ffe8000", + "0xbe", "0x480680017fff8000", "0xffffffff00000000ffffffffffffffff", "0x48317fff80017ffc", @@ -14746,83 +17297,93 @@ "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffb7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0x2b", - "0x400080007ffc7fff", - "0x482480017ffc8000", + "0x32", + "0x400080007ff97fff", + "0x482480017ff98000", "0x1", + "0x48127ffb7fff8000", "0x4825800180007ffc", "0xffffffff00000000ffffffffffffffff", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x4", - "0x48127ffa7fff8000", + "0x5", + "0x48127ff87fff8000", + "0x482480017ff88000", + "0x2d0", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0x21", + "0x27", "0x480680017fff8000", "0xbce6faada7179e84f3b9cac2fc632551", - "0x48317fff80017ffb", + "0x48127ffd7fff8000", + "0x48317ffe80017ffb", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ffa7fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0xb", - "0x400080007ffb7fff", + "0xd", + "0x400080007ff97fff", "0x40780017fff7fff", "0x1", - "0x482480017ffa8000", + "0x482480017ff88000", "0x1", + "0x482480017ffb8000", + "0x5a", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0xe", - "0x482480017ffa8000", + "0x11", + "0x482480017ff88000", "0x1", + "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x10780017fff7fff", - "0x8", + "0xa", "0x40780017fff7fff", - "0x5", - "0x482480017ff68000", + "0x7", + "0x482480017ff18000", "0x1", + "0x482480017ff38000", + "0x3e8", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x1", "0x48307ffe80007fff", "0x20680017fff7fff", - "0x435", + "0x44e", "0x480680017fff8000", "0xbce6faada7179e84f3b9cac2fc632551", "0x480680017fff8000", "0xffffffff00000000ffffffffffffffff", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x37", - "0x480080007ff98001", - "0x480080017ff88001", - "0x480080027ff78001", - "0x480080037ff68001", - "0x48307ffe80017ffa", + "0x480080007ff78001", + "0x480080017ff68001", + "0x480080027ff58001", + "0x480080037ff48001", + "0x48307ffe80017ff9", "0x40780017fff7fff", "0x12", "0x20680017fff7fee", "0x8", - "0x40307fea7fef7fe6", + "0x40307fea7fef7fe5", "0x402480017ff07fef", "0x1", - "0x400080047fe27ff0", + "0x400080047fe07ff0", "0x10780017fff7fff", "0x3", - "0x400080047fe27fee", + "0x400080047fe07fee", "0x482480017ff98001", "0x1", "0x48307ff080018000", @@ -14839,10 +17400,10 @@ "0x100000000000000000000000000000000", "0x4824800180007fff", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffff8001", - "0x400080057fd67fff", + "0x400080057fd47fff", "0x482480017ffe8000", "0xffffffffffffffffffffffffffff8000", - "0x400080067fd57fff", + "0x400080067fd37fff", "0x48307ffd7fef8000", "0x48307ff07fff8000", "0x48307ff07fff8000", @@ -14853,28 +17414,28 @@ "0x100000000000000000000000000000000", "0x4824800180007fff", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffff8001", - "0x400080077fcd7fff", + "0x400080077fcb7fff", "0x482480017ffe8000", "0xffffffffffffffffffffffffffff8000", - "0x400080087fcc7fff", + "0x400080087fca7fff", "0x40307ffd7fea7fe2", "0x10780017fff7fff", "0x31", - "0x480080007ff97fff", - "0x480080017ff87fff", - "0x480080027ff77fff", - "0x480080037ff67fff", - "0x480080047ff57fff", - "0x400080057ff47fff", + "0x480080007ff77fff", + "0x480080017ff67fff", + "0x480080027ff57fff", + "0x480080037ff47fff", + "0x480080047ff37fff", + "0x400080057ff27fff", "0xa0680017fff7ffb", "0xa", "0x402480017fff7ff9", "0x1", "0x20680017fff7fff", "0x6", - "0x400680017fff7ff8", - "0x0", "0x400680017fff7ff7", + "0x0", + "0x400680017fff7ff6", "0x1", "0xa0680017fff7ffa", "0xc", @@ -14902,26 +17463,26 @@ "0x40127ff47fff7ffe", "0x482480017ffe8000", "0xfffffffffffffffe0000000000000000", - "0x400080067fec7fff", + "0x400080067fea7fff", "0x40317ff97ffb7ffc", - "0x40307ffa7ffc7ff1", + "0x40307ffa7ffc7ff0", "0x10780017fff7fff", - "0x37e", + "0x395", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080097fcb8001", - "0x4800800a7fca7ffe", - "0x4000800b7fc97ffe", + "0x480080097fc98001", + "0x4800800a7fc87ffe", + "0x4000800b7fc77ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fcd", + "0x40307ffc7fff7fcc", "0x48507fd37ffc8000", "0x48507fd27ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x4800800c7fc58001", - "0x4800800d7fc47fff", - "0x4000800e7fc37ffd", + "0x4800800c7fc38001", + "0x4800800d7fc27fff", + "0x4000800e7fc17ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -14930,28 +17491,28 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x4800800f7fbf7fff", - "0x480080107fbe7ffd", - "0x400080117fbd7fda", + "0x4800800f7fbd7fff", + "0x480080107fbc7ffd", + "0x400080117fbb7fda", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307fda7ffe7fff", "0x40307ffc7ff77fdb", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080127fbc8001", - "0x480080137fbb7ffe", - "0x400080147fba7ffe", + "0x480080127fba8001", + "0x480080137fb97ffe", + "0x400080147fb87ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fbe", + "0x40307ffc7fff7fbd", "0x48507fc37ffc8000", "0x48507fc27ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080157fb68001", - "0x480080167fb57fff", - "0x400080177fb47ffd", + "0x480080157fb48001", + "0x480080167fb37fff", + "0x400080177fb27ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -14960,28 +17521,28 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x480080187fb07fff", - "0x480080197faf7ffd", - "0x4000801a7fae7fc9", + "0x480080187fae7fff", + "0x480080197fad7ffd", + "0x4000801a7fac7fc9", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307fc97ffe7fff", "0x40307ffc7ff77fca", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x4800801b7fad8001", - "0x4800801c7fac7ffe", - "0x4000801d7fab7ffe", + "0x4800801b7fab8001", + "0x4800801c7faa7ffe", + "0x4000801d7fa97ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fae", + "0x40307ffc7fff7fad", "0x48507fb57ffc8000", "0x48507fb47ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x4800801e7fa78001", - "0x4800801f7fa67fff", - "0x400080207fa57ffd", + "0x4800801e7fa58001", + "0x4800801f7fa47fff", + "0x400080207fa37ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -14990,28 +17551,28 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x480080217fa17fff", - "0x480080227fa07ffd", - "0x400080237f9f7fb8", + "0x480080217f9f7fff", + "0x480080227f9e7ffd", + "0x400080237f9d7fb8", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307fb87ffe7fff", "0x40307ffc7ff77fb9", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080247f9e8001", - "0x480080257f9d7ffe", - "0x400080267f9c7ffe", + "0x480080247f9c8001", + "0x480080257f9b7ffe", + "0x400080267f9a7ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7f9f", + "0x40307ffc7fff7f9e", "0x48507fa57ffc8000", "0x48507fa47ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080277f988001", - "0x480080287f977fff", - "0x400080297f967ffd", + "0x480080277f968001", + "0x480080287f957fff", + "0x400080297f947ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15020,18 +17581,18 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x4800802a7f927fff", - "0x4800802b7f917ffd", - "0x4000802c7f907fa7", + "0x4800802a7f907fff", + "0x4800802b7f8f7ffd", + "0x4000802c7f8e7fa7", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307fa77ffe7fff", "0x40307ffc7ff77fa8", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x4800802d7f8f8001", - "0x4800802e7f8e7ffe", - "0x4000802f7f8d7ffe", + "0x4800802d7f8d8001", + "0x4800802e7f8c7ffe", + "0x4000802f7f8b7ffe", "0x484480017ffe8000", "0x10000000000000000", "0x40307ffc7fff7f95", @@ -15039,9 +17600,9 @@ "0x48487ffc7ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080307f898001", - "0x480080317f887fff", - "0x400080327f877ffd", + "0x480080307f878001", + "0x480080317f867fff", + "0x400080327f857ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15050,18 +17611,18 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x480080337f837fff", - "0x480080347f827ffd", - "0x400080357f817f96", + "0x480080337f817fff", + "0x480080347f807ffd", + "0x400080357f7f7f96", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307f967ffe7fff", "0x40307ffc7ff77f97", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080367f808001", - "0x480080377f7f7ffe", - "0x400080387f7e7ffe", + "0x480080367f7e8001", + "0x480080377f7d7ffe", + "0x400080387f7c7ffe", "0x484480017ffe8000", "0x10000000000000000", "0x40307ffc7fff7f86", @@ -15069,9 +17630,9 @@ "0x48487ffb7ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080397f7a8001", - "0x4800803a7f797fff", - "0x4000803b7f787ffd", + "0x480080397f788001", + "0x4800803a7f777fff", + "0x4000803b7f767ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15080,18 +17641,18 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x4800803c7f747fff", - "0x4800803d7f737ffd", - "0x4000803e7f727f85", + "0x4800803c7f727fff", + "0x4800803d7f717ffd", + "0x4000803e7f707f85", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307f857ffe7fff", "0x40307ffc7ff77f86", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x4800803f7f718001", - "0x480080407f707ffe", - "0x400080417f6f7ffe", + "0x4800803f7f6f8001", + "0x480080407f6e7ffe", + "0x400080417f6d7ffe", "0x484480017ffe8000", "0x10000000000000000", "0x40307ffc7fff7f76", @@ -15099,9 +17660,9 @@ "0x48487ffc7ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080427f6b8001", - "0x480080437f6a7fff", - "0x400080447f697ffd", + "0x480080427f698001", + "0x480080437f687fff", + "0x400080447f677ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15110,18 +17671,18 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x480080457f657fff", - "0x480080467f647ffd", - "0x400080477f637f74", + "0x480080457f637fff", + "0x480080467f627ffd", + "0x400080477f617f74", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307f747ffe7fff", "0x40307ffc7ff77f75", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080487f628001", - "0x480080497f617ffe", - "0x4000804a7f607ffe", + "0x480080487f608001", + "0x480080497f5f7ffe", + "0x4000804a7f5e7ffe", "0x484480017ffe8000", "0x10000000000000000", "0x40307ffc7fff7f67", @@ -15129,9 +17690,9 @@ "0x48487ffb7ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x4800804b7f5c8001", - "0x4800804c7f5b7fff", - "0x4000804d7f5a7ffd", + "0x4800804b7f5a8001", + "0x4800804c7f597fff", + "0x4000804d7f587ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15140,21 +17701,21 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x4800804e7f567fff", - "0x4800804f7f557ffd", - "0x400080507f547f63", + "0x4800804e7f547fff", + "0x4800804f7f537ffd", + "0x400080507f527f63", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40307f637ffe7fff", "0x40307ffc7ff77f64", - "0x482480017f548000", + "0x482480017f528000", "0x51", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x48127f597fff8000", "0x48127f597fff8000", "0x1104800180018000", - "0xf44", + "0xfb0", "0x480680017fff8000", "0xbce6faada7179e84f3b9cac2fc632551", "0x480680017fff8000", @@ -15390,7 +17951,7 @@ "0x48127e6b7fff8000", "0x48127e6b7fff8000", "0x1104800180018000", - "0xe58", + "0xec4", "0x480680017fff8000", "0xbce6faada7179e84f3b9cac2fc632551", "0x480680017fff8000", @@ -15619,6 +18180,7 @@ "0x100000000000000000000000000000000", "0x40307f937ffe7fff", "0x40307ffc7ff77f94", + "0x48127d7d7fff8000", "0x480680017fff8000", "0x77037d812deb33a0f4a13945d898c296", "0x480680017fff8000", @@ -15627,99 +18189,110 @@ "0x2bce33576b315ececbb6406837bf51f5", "0x480680017fff8000", "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16", - "0x482480017f7f8000", + "0x482480017f7e8000", "0x39", "0x480680017fff8000", "0x5365637032353672314e6577", "0x400280007ff67fff", - "0x400380017ff67ff5", + "0x400280017ff67ff9", "0x400280027ff67ffa", "0x400280037ff67ffb", "0x400280047ff67ffc", "0x400280057ff67ffd", "0x480280077ff68000", "0x20680017fff7fff", - "0x92", + "0xa6", + "0x480280067ff68000", "0x480280087ff68000", "0x480280097ff68000", - "0x480280067ff68000", "0x482680017ff68000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x7d", + "0x8f", + "0x48127fff7fff8000", "0x480680017fff8000", "0x5365637032353672314d756c", - "0x400080007ffe7fff", - "0x400080017ffe7ffd", - "0x400080027ffe7ffc", - "0x400080037ffe7e94", - "0x400080047ffe7e95", - "0x480080067ffe8000", + "0x400080007ffc7fff", + "0x400080017ffc7ffe", + "0x400080027ffc7ffb", + "0x400080037ffc7e91", + "0x400080047ffc7e92", + "0x480080067ffc8000", "0x20680017fff7fff", - "0x68", - "0x480080057ffd8000", - "0x480080077ffc8000", + "0x77", + "0x480080057ffb8000", + "0x48127fff7fff8000", + "0x480080077ff98000", "0x480680017fff8000", "0x5365637032353672314d756c", - "0x400080087ffa7fff", - "0x400080097ffa7ffd", - "0x4001800a7ffa7ffd", - "0x4000800b7ffa7f7e", - "0x4000800c7ffa7f7f", - "0x4800800e7ffa8000", + "0x400080087ff77fff", + "0x400080097ff77ffd", + "0x4001800a7ff77ffd", + "0x4000800b7ff77f7a", + "0x4000800c7ff77f7b", + "0x4800800e7ff78000", "0x20680017fff7fff", - "0x51", - "0x4800800d7ff98000", - "0x4800800f7ff88000", + "0x5d", + "0x4800800d7ff68000", + "0x48127fff7fff8000", + "0x4800800f7ff48000", "0x480680017fff8000", "0x536563703235367231416464", - "0x400080107ff67fff", - "0x400080117ff67ffd", - "0x400080127ff67ffa", - "0x400080137ff67ffe", - "0x480080157ff68000", + "0x400080107ff27fff", + "0x400080117ff27ffd", + "0x400080127ff27ff9", + "0x400080137ff27ffe", + "0x480080157ff28000", "0x20680017fff7fff", - "0x3b", - "0x480080147ff58000", - "0x480080167ff48000", + "0x44", + "0x480080147ff18000", + "0x48127fff7fff8000", + "0x480080167fef8000", "0x480680017fff8000", "0x5365637032353672314765745879", - "0x400080177ff27fff", - "0x400080187ff27ffd", - "0x400080197ff27ffe", - "0x4800801b7ff28000", + "0x400080177fed7fff", + "0x400080187fed7ffd", + "0x400080197fed7ffe", + "0x4800801b7fed8000", "0x20680017fff7fff", - "0x26", - "0x4800801c7ff18000", - "0x4800801d7ff08000", - "0x4800801a7fef8000", - "0x482480017fee8000", + "0x2c", + "0x4800801a7fec8000", + "0x4800801c7feb8000", + "0x4800801d7fea8000", + "0x482480017fe98000", "0x20", + "0x48127ffc7fff8000", "0x48287ff980007ffc", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8", + "0xa", "0x40780017fff7fff", - "0x1", + "0x2", + "0x482480017ffc8000", + "0x118", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0xd", - "0x48287ffa80007ffc", + "0x10", + "0x48127ffe7fff8000", + "0x48287ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x7", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0x4", + "0x5", + "0x48127ffe7fff8000", "0x480680017fff8000", "0x1", - "0x48127fe47fff8000", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127fdc7fff8000", + "0x48127ffd7fff8000", + "0x48127ff77fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -15727,71 +18300,82 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x7", - "0x48127fe47fff8000", - "0x4800801a7fe98000", - "0x482480017fe88000", + "0x9", + "0x4800801a7fe38000", + "0x48127fdc7fff8000", + "0x482480017ffe8000", + "0x456", + "0x482480017fe08000", "0x1e", "0x480680017fff8000", "0x1", - "0x4800801c7fe68000", - "0x4800801d7fe58000", + "0x4800801c7fde8000", + "0x4800801d7fdd8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xb", - "0x48127fe47fff8000", - "0x480080147fe98000", - "0x482480017fe88000", + "0xe", + "0x480080147fe38000", + "0x48127fdc7fff8000", + "0x482480017ffe8000", + "0x2eb8", + "0x482480017fe08000", "0x18", "0x480680017fff8000", "0x1", - "0x480080167fe68000", - "0x480080177fe58000", + "0x480080167fde8000", + "0x480080177fdd8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xf", - "0x48127fe47fff8000", - "0x4800800d7fe98000", - "0x482480017fe88000", + "0x13", + "0x4800800d7fe38000", + "0x48127fdc7fff8000", + "0x482480017ffe8000", + "0x597e", + "0x482480017fe08000", "0x11", "0x480680017fff8000", "0x1", - "0x4800800f7fe68000", - "0x480080107fe58000", + "0x4800800f7fde8000", + "0x480080107fdd8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x13", - "0x48127fe47fff8000", - "0x480080057fe98000", - "0x482480017fe88000", + "0x18", + "0x480080057fe38000", + "0x48127fdc7fff8000", + "0x482480017ffe8000", + "0x84a8", + "0x482480017fe08000", "0x9", "0x480680017fff8000", "0x1", - "0x480080077fe68000", - "0x480080087fe58000", + "0x480080077fde8000", + "0x480080087fdd8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xf", + "0x16", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127fed7fff8000", - "0x48127fed7fff8000", + "0x482480017fe78000", + "0xac94", + "0x48127fe57fff8000", "0x48127ffc7fff8000", "0x482480017ffb8000", "0x1", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x15", + "0x1c", "0x480280067ff68000", + "0x482480017fff8000", + "0xafdc", "0x482680017ff68000", "0xa", "0x480280087ff68000", "0x480280097ff68000", - "0x48127fe47fff8000", + "0x48127fdc7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", @@ -15800,22 +18384,22 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x274", + "0x27d", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080077d778001", - "0x480080087d767ffe", - "0x400080097d757ffe", + "0x480080077d6c8001", + "0x480080087d6b7ffe", + "0x400080097d6a7ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7d7a", - "0x48507d7e7ffc8000", - "0x48507d7d7ffc8000", + "0x40307ffc7fff7d71", + "0x48507d757ffc8000", + "0x48507d747ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x4800800a7d718001", - "0x4800800b7d707fff", - "0x4000800c7d6f7ffd", + "0x4800800a7d668001", + "0x4800800b7d657fff", + "0x4000800c7d647ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15824,28 +18408,28 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x4800800d7d6b7fff", - "0x4800800e7d6a7ffd", - "0x4000800f7d697d6d", + "0x4800800d7d607fff", + "0x4800800e7d5f7ffd", + "0x4000800f7d5e7d63", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", - "0x40307d6d7ffe7fff", - "0x40307ffc7ff77d77", + "0x40307d637ffe7fff", + "0x40307ffc7ff77d6e", "0x4824800180008002", "0xffffffffffffffff0000000000000000", - "0x480080107d688001", - "0x480080117d677ffe", - "0x400080127d667ffe", + "0x480080107d5d8001", + "0x480080117d5c7ffe", + "0x400080127d5b7ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7d6b", - "0x48507d6d7ffc8000", - "0x48507d6c7ffc8000", + "0x40307ffc7fff7d62", + "0x48507d647ffc8000", + "0x48507d637ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", - "0x480080137d628001", - "0x480080147d617fff", - "0x400080157d607ffd", + "0x480080137d578001", + "0x480080147d567fff", + "0x400080157d557ffd", "0x484480017ffd8000", "0x10000000000000000", "0x40307ffd7fff7ffb", @@ -15854,21 +18438,22 @@ "0x48307fff7ff98003", "0x482480017fff8000", "0xfffffffffffffffe0000000000000000", - "0x480080167d5c7fff", - "0x480080177d5b7ffd", - "0x400180187d5a7ffb", + "0x480080167d517fff", + "0x480080177d507ffd", + "0x400180187d4f7ffb", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40287ffb7ffe7fff", - "0x40307ffc7ff77d67", + "0x40307ffc7ff77d5e", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x482480017d588000", + "0x482480017d4d8000", "0x19", - "0x480a7ff57fff8000", + "0x482480017d538000", + "0x24306", "0x480a7ff67fff8000", "0x480680017fff8000", "0x1", @@ -15877,9 +18462,10 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2a4", - "0x48127d587fff8000", - "0x480a7ff57fff8000", + "0x2ae", + "0x48127d4d7fff8000", + "0x482480017d4d8000", + "0x26606", "0x480a7ff67fff8000", "0x480680017fff8000", "0x0", @@ -16045,7 +18631,7 @@ "0x1", "0x48127ffe7fff8000", "0x1104800180018000", - "0xcd8", + "0xd2b", "0x20680017fff7ffd", "0xa8", "0x480080007ffc8005", @@ -16105,7 +18691,7 @@ "0x7", "0x48127ffe7fff8000", "0x1104800180018000", - "0xc9c", + "0xcef", "0x20680017fff7ffd", "0x7", "0x48127ffc7fff8000", @@ -16140,7 +18726,7 @@ "0x6", "0x48127ff67fff8000", "0x1104800180018000", - "0xc79", + "0xccc", "0x20680017fff7ffd", "0x34", "0x48127ffc7fff8000", @@ -16282,7 +18868,7 @@ "0x48127ffd7fff8000", "0x48127fef7fff8000", "0x1104800180018000", - "0xbeb", + "0xc3e", "0x20680017fff7ffd", "0xce", "0x480080007ffc8005", @@ -16317,7 +18903,7 @@ "0x5", "0x48127ffe7fff8000", "0x1104800180018000", - "0xbc8", + "0xc1b", "0x20680017fff7ffd", "0x96", "0x480680017fff8000", @@ -16359,7 +18945,7 @@ "0x3", "0x48127ffe7fff8000", "0x1104800180018000", - "0xb9e", + "0xbf1", "0x20680017fff7ffd", "0x7", "0x48127ffc7fff8000", @@ -16394,7 +18980,7 @@ "0x2", "0x48127ff67fff8000", "0x1104800180018000", - "0xb7b", + "0xbce", "0x20680017fff7ffd", "0x34", "0x48127ffc7fff8000", @@ -16579,7 +19165,7 @@ "0x3", "0x48127ffe7fff8000", "0x1104800180018000", - "0xac2", + "0xb15", "0x20680017fff7ffd", "0x7", "0x48127ffc7fff8000", @@ -16614,7 +19200,7 @@ "0x2", "0x48127ff87fff8000", "0x1104800180018000", - "0xa9f", + "0xaf2", "0x20680017fff7ffd", "0x3a", "0x48127ffc7fff8000", @@ -16749,7 +19335,7 @@ "0x2", "0x48127ffe7fff8000", "0x1104800180018000", - "0xa18", + "0xa6b", "0x20680017fff7ffd", "0x7", "0x48127ffc7fff8000", @@ -16784,7 +19370,7 @@ "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", - "0x9f5", + "0xa48", "0x20680017fff7ffd", "0x3c", "0x48127ffc7fff8000", @@ -16902,7 +19488,7 @@ "0x2", "0x48127ffe7fff8000", "0x1104800180018000", - "0x97f", + "0x9d2", "0x20680017fff7ffd", "0x7", "0x48127ffc7fff8000", @@ -16937,7 +19523,7 @@ "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", - "0x95c", + "0x9af", "0x20680017fff7ffd", "0x2d", "0x48127ffc7fff8000", @@ -17020,15 +19606,16 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff97a", + "0xfffffffffffffffffffffffffffff916", "0x400280007ff87fff", "0x10780017fff7fff", - "0x20", + "0x22", "0x4825800180007ff9", - "0x686", + "0x6ea", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", @@ -17036,8 +19623,8 @@ "0xf", "0x480280007ffa8000", "0x400280007ffd7fff", - "0x48127ffd7fff8000", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x482680017ffa8000", "0x1", "0x480a7ffb7fff8000", @@ -17045,10 +19632,11 @@ "0x482680017ffd8000", "0x1", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", "0x208b7fff7fff7ffe", - "0x48127ffe7fff8000", - "0x48127ffc7fff8000", + "0x48127ffd7fff8000", + "0x482480017ffd8000", + "0x686", "0x480680017fff8000", "0x0", "0x480a7ffc7fff8000", @@ -17392,55 +19980,58 @@ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xfffffffffffffffffffffffffffff740", + "0xfffffffffffffffffffffffffffff678", "0x400280007ff97fff", "0x10780017fff7fff", - "0x40", + "0x44", "0x4825800180007ffa", - "0x8c0", + "0x988", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x48127ffe7fff8000", "0x4825800180007ffd", "0x1", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x2a", + "0x2c", "0x480680017fff8000", "0x0", "0x400280007ffc7fff", "0x480680017fff8000", "0x1", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x482680017ffc8000", "0x1", - "0x48317ffd80017ffd", + "0x48317ffc80017ffd", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff77fff", + "0x400080007ff57fff", "0x10780017fff7fff", "0xc", - "0x400080007ff87fff", - "0x482480017ff88000", + "0x400080007ff67fff", + "0x482480017ff68000", "0x1", - "0x48127ff67fff8000", + "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd8", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd6", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x7533325f737562204f766572666c6f77", "0x400080007ffe7fff", - "0x482480017ff58000", + "0x482480017ff38000", "0x1", - "0x48127ff37fff8000", + "0x482480017ff78000", + "0x3ca", "0x480680017fff8000", "0x1", "0x48127ffb7fff8000", @@ -17450,8 +20041,9 @@ "0x480680017fff8000", "0x8000000000000000", "0x400280007ffc7fff", - "0x48127ffd7fff8000", - "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x482480017ffc8000", + "0x85c", "0x480680017fff8000", "0x0", "0x480a7ffb7fff8000", @@ -17720,14 +20312,16 @@ "0x400380047ff67ffd", "0x480280067ff68000", "0x20680017fff7fff", - "0x46c", + "0x48a", + "0x480280057ff68000", "0x480280077ff68000", "0x480280087ff68000", - "0x480280057ff68000", "0x482680017ff68000", "0x9", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x459", + "0x475", + "0x48127fff7fff8000", "0x480680017fff8000", "0x29bfcdb2dce28d959f2815b16f81798", "0x480680017fff8000", @@ -17738,38 +20332,40 @@ "0x483ada7726a3c4655da4fbfc0e1108a8", "0x480680017fff8000", "0x536563703235366b314e6577", - "0x400080007ffa7fff", - "0x400080017ffa7ff9", - "0x400080027ffa7ffb", - "0x400080037ffa7ffc", - "0x400080047ffa7ffd", - "0x400080057ffa7ffe", - "0x480080077ffa8000", - "0x20680017fff7fff", - "0x437", - "0x480080087ff98000", - "0x480080097ff88000", + "0x400080007ff87fff", + "0x400080017ff87ffa", + "0x400080027ff87ffb", + "0x400080037ff87ffc", + "0x400080047ff87ffd", + "0x400080057ff87ffe", + "0x480080077ff88000", + "0x20680017fff7fff", + "0x450", "0x480080067ff78000", - "0x482480017ff68000", + "0x480080087ff68000", + "0x480080097ff58000", + "0x482480017ff48000", "0xa", + "0x48127ffc7fff8000", "0x20680017fff7ffc", - "0x422", + "0x439", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", "0x480680017fff8000", "0xfffffffffffffffffffffffffffffffe", + "0x48127ffd7fff8000", "0xa0680017fff8000", "0x37", "0x480280007ff48001", "0x480280017ff48001", "0x480280027ff48001", "0x480280037ff48001", - "0x48307ffe80017ffa", + "0x48307ffe80017ff9", "0x40780017fff7fff", "0x12", "0x20680017fff7fee", "0x8", - "0x40307fea7fef7fe6", + "0x40307fea7fef7fe5", "0x402480017ff07fef", "0x1", "0x400280047ff47ff0", @@ -17825,9 +20421,9 @@ "0x1", "0x20680017fff7fff", "0x6", - "0x400680017fff7ff8", - "0x0", "0x400680017fff7ff7", + "0x0", + "0x400680017fff7ff6", "0x1", "0xa0680017fff7ffa", "0xc", @@ -17857,9 +20453,9 @@ "0xfffffffffffffffe0000000000000000", "0x400280067ff47fff", "0x40317ff97ffb7ffa", - "0x40307ffa7ffc7ff1", + "0x40307ffa7ffc7ff0", "0x10780017fff7fff", - "0x36b", + "0x380", "0x4824800180008002", "0xffffffffffffffff0000000000000000", "0x480280097ff48001", @@ -17867,7 +20463,7 @@ "0x4002800b7ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fcd", + "0x40307ffc7fff7fcc", "0x48507fd37ffc8000", "0x48507fd27ffc8000", "0x4824800180018002", @@ -17897,7 +20493,7 @@ "0x400280147ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fbe", + "0x40307ffc7fff7fbd", "0x48507fc37ffc8000", "0x48507fc27ffc8000", "0x4824800180018002", @@ -17927,7 +20523,7 @@ "0x4002801d7ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7fae", + "0x40307ffc7fff7fad", "0x48507fb57ffc8000", "0x48507fb47ffc8000", "0x4824800180018002", @@ -17957,7 +20553,7 @@ "0x400280267ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7f9f", + "0x40307ffc7fff7f9e", "0x48507fa57ffc8000", "0x48507fa47ffc8000", "0x4824800180018002", @@ -18107,7 +20703,7 @@ "0x48127f597fff8000", "0x48127f597fff8000", "0x1104800180018000", - "0x3bb", + "0x404", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", "0x480680017fff8000", @@ -18338,72 +20934,80 @@ "0x40307ffc7ff77f94", "0x480680017fff8000", "0xfffffffffffffffffffffffffffffffe", - "0x48307f8e80017fff", + "0x48127e6a7fff8000", + "0x48307f8d80017ffe", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080397f7f7fff", + "0x400080397f7e7fff", "0x10780017fff7fff", - "0xc", - "0x400080397f807fff", + "0xd", + "0x400080397f7f7fff", "0x40780017fff7fff", "0x1", - "0x482480017f7f8000", + "0x482480017f7e8000", "0x3a", - "0x48127ffd7fff8000", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x10780017fff7fff", - "0x7", - "0x482480017f7f8000", + "0x9", + "0x482480017f7e8000", "0x3a", - "0x48127ffe7fff8000", + "0x482480017ffb8000", + "0xa", + "0x48127ffd7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", - "0x48307f8680017fff", + "0x48307f8480017fff", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007ff97fff", + "0x400080007ff87fff", "0x10780017fff7fff", - "0xb", - "0x400080007ffa7fff", + "0xd", + "0x400080007ff97fff", "0x40780017fff7fff", - "0x4", - "0x482480017ff68000", + "0x5", + "0x482480017ff48000", "0x1", - "0x48127ffa7fff8000", - "0x48127ff57fff8000", + "0x482480017ff48000", + "0x208", + "0x48127ff87fff8000", + "0x48127ff37fff8000", "0x10780017fff7fff", - "0x11", + "0x13", "0x480680017fff8000", "0x1", - "0x48307fff80017ff9", + "0x48127ff87fff8000", + "0x48307ffe80017ff8", "0xa0680017fff7fff", "0x7", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080017ff57fff", + "0x400080017ff37fff", "0x10780017fff7fff", - "0x147", - "0x400080017ff67fff", - "0x482480017ff68000", + "0x153", + "0x400080017ff47fff", + "0x482480017ff48000", "0x2", - "0x48127ffb7fff8000", - "0x48127ffd7fff8000", - "0x20680017fff7ff5", - "0x13b", - "0x48127ffd7fff8000", + "0x48127ffc7fff8000", + "0x48127ff97fff8000", + "0x48127ffc7fff8000", + "0x20680017fff7ff3", + "0x144", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", - "0x48127e5a7fff8000", - "0x48127e5a7fff8000", + "0x48127e567fff8000", + "0x48127e567fff8000", "0x1104800180018000", - "0x293", + "0x2d4", "0x480680017fff8000", "0xbaaedce6af48a03bbfd25e8cd0364141", "0x480680017fff8000", @@ -18632,101 +21236,114 @@ "0x100000000000000000000000000000000", "0x40307f937ffe7fff", "0x40307ffc7ff77f94", - "0x48127f107fff8000", - "0x48127f107fff8000", - "0x482480017f818000", + "0x48127f0f7fff8000", + "0x48127f0f7fff8000", + "0x48127f0f7fff8000", + "0x482480017f808000", "0x39", "0x480680017fff8000", "0x536563703235366b314d756c", - "0x400080007d667fff", - "0x400080017d667d65", - "0x400080027d667d64", - "0x400080037d667ffc", - "0x400080047d667ffd", - "0x480080067d668000", + "0x400080007d5f7fff", + "0x400080017d5f7ffb", + "0x400080027d5f7d5e", + "0x400080037d5f7ffc", + "0x400080047d5f7ffd", + "0x480080067d5f8000", "0x20680017fff7fff", - "0x37", - "0x480080057d658000", - "0x480080077d648000", + "0x3d", + "0x480080057d5e8000", + "0x48127fff7fff8000", + "0x480080077d5c8000", "0x480680017fff8000", "0x536563703235366b314d756c", - "0x400080087d627fff", - "0x400080097d627ffd", - "0x4000800a7d627d56", - "0x4000800b7d627f86", - "0x4000800c7d627f87", - "0x4800800e7d628000", + "0x400080087d5a7fff", + "0x400080097d5a7ffd", + "0x4000800a7d5a7d4d", + "0x4000800b7d5a7f84", + "0x4000800c7d5a7f85", + "0x4800800e7d5a8000", "0x20680017fff7fff", - "0x20", - "0x4800800d7d618000", - "0x4800800f7d608000", + "0x23", + "0x4800800d7d598000", + "0x48127fff7fff8000", + "0x4800800f7d578000", "0x480680017fff8000", "0x536563703235366b31416464", - "0x400080107d5e7fff", - "0x400080117d5e7ffd", - "0x400080127d5e7ffa", - "0x400080137d5e7ffe", - "0x480080157d5e8000", + "0x400080107d557fff", + "0x400080117d557ffd", + "0x400080127d557ff9", + "0x400080137d557ffe", + "0x480080157d558000", "0x20680017fff7fff", - "0xc", - "0x48127ff57fff8000", - "0x480080147d5c8000", - "0x482480017d5b8000", + "0xd", + "0x480080147d548000", + "0x48127ff27fff8000", + "0x48127ffe7fff8000", + "0x482480017d518000", "0x17", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", - "0x480080167d588000", + "0x480080167d4e8000", "0x208b7fff7fff7ffe", - "0x48127ff57fff8000", - "0x480080147d5c8000", - "0x482480017d5b8000", + "0x480080147d548000", + "0x48127ff27fff8000", + "0x48127ffe7fff8000", + "0x482480017d518000", "0x18", "0x480680017fff8000", "0x1", - "0x480080167d598000", - "0x480080177d588000", + "0x480080167d4f8000", + "0x480080177d4e8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x4", - "0x48127ff57fff8000", - "0x4800800d7d5c8000", - "0x482480017d5b8000", + "0x5", + "0x4800800d7d548000", + "0x48127ff27fff8000", + "0x482480017ffe8000", + "0x2a62", + "0x482480017d518000", "0x11", "0x480680017fff8000", "0x1", - "0x4800800f7d598000", - "0x480080107d588000", + "0x4800800f7d4f8000", + "0x480080107d4e8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x8", - "0x48127ff57fff8000", - "0x480080057d5c8000", - "0x482480017d5b8000", + "0xa", + "0x480080057d548000", + "0x48127ff27fff8000", + "0x482480017ffe8000", + "0x558c", + "0x482480017d518000", "0x9", "0x480680017fff8000", "0x1", - "0x480080077d598000", - "0x480080087d588000", + "0x480080077d4f8000", + "0x480080087d4e8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0xf8", - "0x48127f057fff8000", + "0xfb", + "0x48127f017fff8000", + "0x482480017f018000", + "0x10f04", "0x10780017fff7fff", - "0x6", + "0x8", "0x40780017fff7fff", - "0xfa", - "0x482480017efb8000", + "0xfe", + "0x482480017ef58000", "0x2", + "0x482480017efd8000", + "0x11076", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x753235365f737562204f766572666c6f77", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127d5b7fff8000", - "0x48127d5b7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48127d517fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -18734,7 +21351,7 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x272", + "0x27a", "0x4824800180008002", "0xffffffffffffffff0000000000000000", "0x480280077ff48001", @@ -18742,9 +21359,9 @@ "0x400280097ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7d7c", - "0x48507d807ffc8000", - "0x48507d7f7ffc8000", + "0x40307ffc7fff7d74", + "0x48507d787ffc8000", + "0x48507d777ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", "0x4802800a7ff48001", @@ -18760,11 +21377,11 @@ "0xfffffffffffffffe0000000000000000", "0x4802800d7ff47fff", "0x4802800e7ff47ffd", - "0x4002800f7ff47d6f", + "0x4002800f7ff47d66", "0x404480017ffc7ffe", "0x100000000000000000000000000000000", - "0x40307d6f7ffe7fff", - "0x40307ffc7ff77d79", + "0x40307d667ffe7fff", + "0x40307ffc7ff77d71", "0x4824800180008002", "0xffffffffffffffff0000000000000000", "0x480280107ff48001", @@ -18772,9 +21389,9 @@ "0x400280127ff47ffe", "0x484480017ffe8000", "0x10000000000000000", - "0x40307ffc7fff7d6d", - "0x48507d6f7ffc8000", - "0x48507d6e7ffc8000", + "0x40307ffc7fff7d65", + "0x48507d677ffc8000", + "0x48507d667ffc8000", "0x4824800180018002", "0xffffffffffffffff0000000000000000", "0x480280137ff48001", @@ -18794,7 +21411,7 @@ "0x404480017ffc7ffe", "0x100000000000000000000000000000000", "0x40287ff97ffe7fff", - "0x40307ffc7ff77d69", + "0x40307ffc7ff77d61", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -18802,8 +21419,9 @@ "0x400080007ffe7fff", "0x482680017ff48000", "0x19", - "0x48127d5b7fff8000", - "0x48127d5b7fff8000", + "0x482480017d568000", + "0x1f0cc", + "0x48127d517fff8000", "0x480680017fff8000", "0x1", "0x48127ffa7fff8000", @@ -18811,26 +21429,29 @@ "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x29c", + "0x2a5", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127d607fff8000", - "0x48127d607fff8000", + "0x482480017d588000", + "0x210e8", + "0x48127d567fff8000", "0x48127ffc7fff8000", "0x482480017ffb8000", "0x1", "0x10780017fff7fff", - "0x9", + "0xb", "0x40780017fff7fff", - "0x2a2", - "0x480080067d578000", - "0x482480017d568000", + "0x2ab", + "0x480080067d4c8000", + "0x482480017fff8000", + "0x21430", + "0x482480017d4a8000", "0xa", - "0x480080087d558000", - "0x480080097d548000", + "0x480080087d498000", + "0x480080097d488000", "0x480a7ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", @@ -18840,10 +21461,11 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2ac", + "0x2b7", "0x480a7ff47fff8000", - "0x48127d517fff8000", - "0x48127d517fff8000", + "0x482480017d478000", + "0x24234", + "0x48127d457fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", @@ -18852,9 +21474,11 @@ "0x0", "0x208b7fff7fff7ffe", "0x40780017fff7fff", - "0x2b0", - "0x480a7ff47fff8000", + "0x2bb", "0x480280057ff68000", + "0x480a7ff47fff8000", + "0x482480017ffe8000", + "0x24400", "0x482680017ff68000", "0x9", "0x480680017fff8000", @@ -18871,7 +21495,8 @@ "0x400380027ffc7ffd", "0x480280047ffc8000", "0x20680017fff7fff", - "0xb5", + "0xd7", + "0x480280037ffc8000", "0x480280057ffc8000", "0x480280067ffc8000", "0x480280077ffc8000", @@ -18883,7 +21508,7 @@ "0x40780017fff7fff", "0x1", "0x480a7ff97fff8000", - "0x480280037ffc8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x48127ffb7fff8000", "0x482480017ffa8000", @@ -18893,10 +21518,10 @@ "0x402780017ffc8001", "0x9", "0x1104800180018000", - "0x23b", + "0x267", "0x40137ffa7fff8000", "0x20680017fff7ffb", - "0x8e", + "0xa5", "0x48127ff87fff8000", "0x48127ff87fff8000", "0x48127ffc7fff8000", @@ -18906,18 +21531,20 @@ "0x480680017fff8000", "0x0", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffec50", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffeb5b", "0x20680017fff7ffd", - "0x7b", + "0x88", + "0x48127ffc7fff8000", "0x480680017fff8000", "0x4b656363616b", "0x4002800080017fff", - "0x4002800180017ffb", - "0x4002800280017ffd", - "0x4002800380017ffe", + "0x4002800180017ffe", + "0x4002800280017ffc", + "0x4002800380017ffd", "0x4802800580018000", "0x20680017fff7fff", - "0x6a", + "0x6b", + "0x4802800480018000", "0x4802800780018000", "0x4002800080007fff", "0x480680017fff8000", @@ -18988,12 +21615,12 @@ "0x800000000000010fffffffffffffff7ffffffffffffef000000000000000001", "0x480680017fff8000", "0x100000000", - "0x480080007fd58005", - "0x480080017fd48005", + "0x480080007fd38005", + "0x480080017fd28005", "0x4824800180047ffe", "0x1", "0x48307ffd7ffe7ffc", - "0x480080027fd17ffd", + "0x480080027fcf7ffd", "0xa0680017fff7ffd", "0x6", "0x482480017ff97ffd", @@ -19002,16 +21629,16 @@ "0x4", "0x482480017fff7ffd", "0xffffffffffffffff0000000000000000", - "0x400080037fce7ffc", + "0x400080037fcc7ffc", "0x40507ffe7ff87ffd", "0x40307fff7ffd7ff7", "0x484480017fff8000", "0x100000000000000000000000000000000", "0x484480017fe48000", "0x800000000000010fffffffffffffff7ffffffffffffef000000000000000001", - "0x482480017fcc8000", + "0x482480017fca8000", "0x4", - "0x4802800480018000", + "0x48127fd17fff8000", "0x4826800180008000", "0x28", "0x4826800180018000", @@ -19022,26 +21649,57 @@ "0x0", "0x48307ff97ff88000", "0x208b7fff7fff7ffe", - "0x48127ff97fff8000", "0x4802800480018000", + "0x1104800180018000", + "0x35d", + "0x482480017fff8000", + "0x35c", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x1568", + "0x48127ff07fff8000", + "0x48307ffe7ff78000", "0x4826800180018000", "0x8", "0x4802800680018000", "0x4802800780018000", "0x10780017fff7fff", - "0xe", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x22", + "0x1104800180018000", + "0x34b", + "0x482480017fff8000", + "0x34a", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x3ffc", + "0x48127ff47fff8000", + "0x48307ffe7ff48000", "0x480a80017fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x10780017fff7fff", - "0x7", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x11", + "0x1104800180018000", + "0x33a", + "0x482480017fff8000", + "0x339", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x67f2", + "0x48127ff17fff8000", + "0x48307ffe7ff18000", "0x480a80017fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80007fff8000", @@ -19051,8 +21709,19 @@ "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", - "0x480a7ff97fff8000", "0x480280037ffc8000", + "0x1104800180018000", + "0x321", + "0x482480017fff8000", + "0x320", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x7b48", + "0x480a7ff97fff8000", + "0x48307ffe7ff78000", "0x480a7ffb7fff8000", "0x482680017ffc8000", "0x7", @@ -19464,15 +22133,15 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x16c", + "0x17b", "0x482480017fff8000", - "0x16b", + "0x17a", "0x480080007fff8000", "0x480080017fff8000", "0x484480017fff8000", "0x8", "0x482480017fff8000", - "0x3b06", + "0x3c32", "0xa0680017fff8000", "0x8", "0x48317ffe80007ff8", @@ -19480,16 +22149,18 @@ "0x100000000000000000000000000000000", "0x400280007ff77fff", "0x10780017fff7fff", - "0x45", + "0x54", "0x48317ffe80007ff8", "0x400280007ff77fff", "0x482680017ff78000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x2", "0x480a7ffb7fff8000", @@ -19497,7 +22168,8 @@ "0x0", "0x480a7ffa7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", @@ -19505,46 +22177,58 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x22", - "0x48127ffa7fff8000", + "0x24", + "0x48127ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480080007ffb8000", "0x480080017ffa8000", "0x1104800180018000", - "0x37", - "0x20680017fff7ffd", + "0x43", + "0x48127fab7fff8000", + "0x20680017fff7ffc", "0xc", - "0x48127ffb7fff8000", - "0x48127fa87fff8000", "0x48127ffa7fff8000", - "0x48127fa97fff8000", - "0x48127fa97fff8000", - "0x48127ff97fff8000", + "0x48127ffe7fff8000", "0x48127ff97fff8000", + "0x48127fa87fff8000", + "0x48127fa87fff8000", + "0x48127ff87fff8000", + "0x48127ff87fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc5", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc1", "0x208b7fff7fff7ffe", - "0x48127ffb7fff8000", - "0x48127fa87fff8000", "0x48127ffa7fff8000", + "0x482480017ffe8000", + "0x9a6", + "0x48127ff97fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff77fff8000", + "0x48127ff77fff8000", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", - "0x48127ff87fff8000", + "0x1104800180018000", + "0x12b", + "0x482480017fff8000", + "0x12a", + "0x480080007fff8000", + "0x480080017fff8000", + "0x484480017fff8000", + "0x8", + "0x482480017fff8000", + "0x371e", + "0x48127ff17fff8000", + "0x48307ffe7ff38000", "0x480a7ff97fff8000", "0x480680017fff8000", "0x0", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x208b7fff7fff7ffe", @@ -19829,99 +22513,567 @@ "0x20" ], "bytecode_segment_lengths": [ - 229, - 180, - 265, - 510, - 171, - 310, - 264, - 178, - 253, - 265, - 253, - 174, - 199, - 111, - 302, - 174, - 104, - 104, - 113, - 104, - 157, - 172, - 93, - 127, - 127, - 243, - 188, - 268, + 249, + 194, + 288, + 553, + 222, + 125, + 256, + 299, + 335, + 286, + 193, + 269, + 288, + 272, + 189, + 217, + 116, 330, - 111, - 138, - 144, - 128, - 123, + 186, + 110, + 110, + 119, + 110, + 167, + 185, + 99, + 135, + 135, 264, - 114, - 136, - 225, - 163, - 92, - 51, - 51, - 112, - 106, + 200, + 285, + 356, + 117, + 146, + 155, + 134, + 134, + 285, + 122, + 95, + 146, + 244, + 176, + 98, + 53, + 53, + 140, + 130, + 113, 205, - 1147, - 368, - 72, - 190, + 1210, + 418, + 77, 190, 200, - 83, - 320, - 358, - 299, - 48, - 44, - 195, - 290, - 285, - 292, - 445, + 216, + 87, + 464, + 394, + 327, + 50, + 46, + 221, + 350, + 333, + 348, + 521, 33, - 264, + 428, 185, - 80, - 116, - 138, - 89, - 249, + 84, + 124, + 153, + 95, + 281, 254, - 97, - 202, - 1222, + 105, + 308, + 1282, 31, 1098, - 51, + 53, 164, 157, - 83, + 87, 239, - 1151, - 199, + 1183, + 244, 271, 131, - 104, + 119, 232, 9, 19 ], "hints": [ [ - 0, + 0, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 38, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, + "dst": { + "register": "AP", + "offset": 4 + } + } + } + ] + ], + [ + 42, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 3 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 52, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -3 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 78, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 99, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x56b8" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 123, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 136, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -5 + }, + "b": { + "Immediate": "0x7" + } + } + } + } + } + ] + ], + [ + 140, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 180, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 195, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 219, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 233, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 249, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 268, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 289, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x5c9e" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 304, + [ + { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, + "dst": { + "register": "AP", + "offset": 4 + } + } + } + ] + ], + [ + 308, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": 3 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 318, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -3 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 340, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 356, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -5 + }, + "b": { + "Immediate": "0x7" + } + } + } + } + } + ] + ], + [ + 360, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 391, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 412, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 427, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 445, [ { "TestLessThanOrEqual": { @@ -19943,14 +23095,14 @@ ] ], [ - 33, + 484, [ { "TestLessThan": { "lhs": { "Deref": { - "register": "AP", - "offset": -1 + "register": "FP", + "offset": 1 } }, "rhs": { @@ -19965,7 +23117,7 @@ ] ], [ - 37, + 488, [ { "LinearSplit": { @@ -19994,14 +23146,14 @@ ] ], [ - 47, + 498, [ { "LinearSplit": { "value": { "Deref": { - "register": "AP", - "offset": -2 + "register": "FP", + "offset": 1 } }, "scalar": { @@ -20023,7 +23175,20 @@ ] ], [ - 71, + 542, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 564, [ { "AllocSegment": { @@ -20036,17 +23201,17 @@ ] ], [ - 90, + 585, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x41d2" + "Immediate": "0x29cc" }, "rhs": { "Deref": { "register": "AP", - "offset": -22 + "offset": -2 } }, "dst": { @@ -20058,7 +23223,7 @@ ] ], [ - 113, + 608, [ { "SystemCall": { @@ -20073,28 +23238,7 @@ ] ], [ - 125, - [ - { - "SystemCall": { - "system": { - "BinOp": { - "op": "Add", - "a": { - "register": "FP", - "offset": -5 - }, - "b": { - "Immediate": "0x7" - } - } - } - } - } - ] - ], - [ - 128, + 631, [ { "AllocSegment": { @@ -20107,7 +23251,7 @@ ] ], [ - 164, + 663, [ { "AllocSegment": { @@ -20120,7 +23264,7 @@ ] ], [ - 179, + 677, [ { "AllocSegment": { @@ -20133,7 +23277,7 @@ ] ], [ - 200, + 701, [ { "AllocSegment": { @@ -20146,7 +23290,7 @@ ] ], [ - 214, + 715, [ { "AllocSegment": { @@ -20159,12 +23303,12 @@ ] ], [ - 229, + 733, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x1982" }, "rhs": { "Deref": { @@ -20181,32 +23325,90 @@ ] ], [ - 246, + 771, [ { - "AllocSegment": { + "TestLessThan": { + "lhs": { + "Deref": { + "register": "FP", + "offset": 5 + } + }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, "dst": { "register": "AP", - "offset": 0 + "offset": 4 } } } ] ], [ - 265, + 775, [ { - "TestLessThanOrEqual": { - "lhs": { - "Immediate": "0x3e4e" - }, - "rhs": { + "LinearSplit": { + "value": { "Deref": { "register": "AP", - "offset": -7 + "offset": 3 + } + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -2 + }, + "y": { + "register": "AP", + "offset": -1 + } + } + } + ] + ], + [ + 785, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "FP", + "offset": 5 } }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 829, + [ + { + "AllocSegment": { "dst": { "register": "AP", "offset": 0 @@ -20216,14 +23418,14 @@ ] ], [ - 279, + 873, [ { "TestLessThan": { "lhs": { "Deref": { - "register": "AP", - "offset": -1 + "register": "FP", + "offset": 6 } }, "rhs": { @@ -20238,7 +23440,7 @@ ] ], [ - 283, + 877, [ { "LinearSplit": { @@ -20267,14 +23469,14 @@ ] ], [ - 293, + 887, [ { "LinearSplit": { "value": { "Deref": { - "register": "AP", - "offset": -2 + "register": "FP", + "offset": 6 } }, "scalar": { @@ -20296,7 +23498,55 @@ ] ], [ - 314, + 931, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 953, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 974, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x71fc" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 997, [ { "SystemCall": { @@ -20311,7 +23561,7 @@ ] ], [ - 329, + 1012, [ { "SystemCall": { @@ -20323,7 +23573,7 @@ "offset": -5 }, "b": { - "Immediate": "0x7" + "Immediate": "0xa" } } } @@ -20332,7 +23582,85 @@ ] ], [ - 332, + 1016, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1042, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1115, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1147, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1161, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1185, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 1216, [ { "AllocSegment": { @@ -20345,7 +23673,7 @@ ] ], [ - 359, + 1230, [ { "AllocSegment": { @@ -20358,7 +23686,7 @@ ] ], [ - 379, + 1254, [ { "AllocSegment": { @@ -20371,7 +23699,7 @@ ] ], [ - 394, + 1268, [ { "AllocSegment": { @@ -20384,7 +23712,7 @@ ] ], [ - 411, + 1284, [ { "TestLessThanOrEqual": { @@ -20406,14 +23734,14 @@ ] ], [ - 445, + 1322, [ { "TestLessThan": { "lhs": { "Deref": { - "register": "FP", - "offset": 0 + "register": "AP", + "offset": -2 } }, "rhs": { @@ -20428,7 +23756,7 @@ ] ], [ - 449, + 1326, [ { "LinearSplit": { @@ -20457,14 +23785,14 @@ ] ], [ - 459, + 1336, [ { "LinearSplit": { "value": { "Deref": { - "register": "FP", - "offset": 0 + "register": "AP", + "offset": -3 } }, "scalar": { @@ -20486,7 +23814,7 @@ ] ], [ - 499, + 1373, [ { "AllocSegment": { @@ -20499,10 +23827,19 @@ ] ], [ - 519, + 1394, [ { - "AllocSegment": { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0xb4dc" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, "dst": { "register": "AP", "offset": 0 @@ -20512,19 +23849,10 @@ ] ], [ - 538, + 1418, [ { - "TestLessThanOrEqual": { - "lhs": { - "Immediate": "0x2404" - }, - "rhs": { - "Deref": { - "register": "AP", - "offset": -12 - } - }, + "AllocSegment": { "dst": { "register": "AP", "offset": 0 @@ -20534,22 +23862,20 @@ ] ], [ - 560, + 1437, [ { - "SystemCall": { - "system": { - "Deref": { - "register": "FP", - "offset": -5 - } + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 } } } ] ], [ - 581, + 1452, [ { "AllocSegment": { @@ -20562,7 +23888,7 @@ ] ], [ - 610, + 1476, [ { "AllocSegment": { @@ -20575,7 +23901,7 @@ ] ], [ - 624, + 1490, [ { "AllocSegment": { @@ -20588,10 +23914,19 @@ ] ], [ - 645, + 1506, [ { - "AllocSegment": { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, "dst": { "register": "AP", "offset": 0 @@ -20601,7 +23936,7 @@ ] ], [ - 659, + 1525, [ { "AllocSegment": { @@ -20614,17 +23949,17 @@ ] ], [ - 676, + 1546, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1342" + "Immediate": "0x2af8" }, "rhs": { "Deref": { - "register": "FP", - "offset": -6 + "register": "AP", + "offset": -2 } }, "dst": { @@ -20636,78 +23971,52 @@ ] ], [ - 710, + 1574, [ { - "TestLessThan": { - "lhs": { + "SystemCall": { + "system": { "Deref": { "register": "FP", - "offset": 8 + "offset": -5 } - }, - "rhs": { - "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" - }, + } + } + } + ] + ], + [ + 1578, + [ + { + "AllocSegment": { "dst": { "register": "AP", - "offset": 4 + "offset": 0 } } } ] ], [ - 714, + 1600, [ { - "LinearSplit": { - "value": { - "Deref": { - "register": "AP", - "offset": 3 - } - }, - "scalar": { - "Immediate": "0x110000000000000000" - }, - "max_x": { - "Immediate": "0xffffffffffffffffffffffffffffffff" - }, - "x": { - "register": "AP", - "offset": -2 - }, - "y": { + "AllocSegment": { + "dst": { "register": "AP", - "offset": -1 + "offset": 0 } } } ] ], [ - 724, + 1615, [ { - "LinearSplit": { - "value": { - "Deref": { - "register": "FP", - "offset": 8 - } - }, - "scalar": { - "Immediate": "0x8000000000000000000000000000000" - }, - "max_x": { - "Immediate": "0xffffffffffffffffffffffffffffffff" - }, - "x": { - "register": "AP", - "offset": -1 - }, - "y": { + "AllocSegment": { + "dst": { "register": "AP", "offset": 0 } @@ -20716,10 +24025,19 @@ ] ], [ - 764, + 1631, [ { - "AllocSegment": { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, "dst": { "register": "AP", "offset": 0 @@ -20729,14 +24047,14 @@ ] ], [ - 803, + 1669, [ { "TestLessThan": { "lhs": { "Deref": { - "register": "FP", - "offset": 7 + "register": "AP", + "offset": -2 } }, "rhs": { @@ -20751,7 +24069,7 @@ ] ], [ - 807, + 1673, [ { "LinearSplit": { @@ -20780,14 +24098,14 @@ ] ], [ - 817, + 1683, [ { "LinearSplit": { "value": { "Deref": { - "register": "FP", - "offset": 7 + "register": "AP", + "offset": -3 } }, "scalar": { @@ -20809,121 +24127,78 @@ ] ], [ - 857, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 877, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 896, + 1718, [ { - "TestLessThanOrEqual": { + "TestLessThan": { "lhs": { - "Immediate": "0x70d0" - }, - "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, + "rhs": { + "Immediate": "0x800000000000000000000000000000000000000000000000000000000000000" + }, "dst": { "register": "AP", - "offset": 0 + "offset": 4 } } } ] ], [ - 918, + 1722, [ { - "SystemCall": { - "system": { + "LinearSplit": { + "value": { "Deref": { - "register": "FP", - "offset": -5 - } - } - } - } - ] - ], - [ - 932, - [ - { - "SystemCall": { - "system": { - "BinOp": { - "op": "Add", - "a": { - "register": "FP", - "offset": -5 - }, - "b": { - "Immediate": "0xa" - } + "register": "AP", + "offset": 3 } - } - } - } - ] - ], - [ - 935, - [ - { - "AllocSegment": { - "dst": { + }, + "scalar": { + "Immediate": "0x110000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 961, - [ - { - "AllocSegment": { - "dst": { + "offset": -2 + }, + "y": { "register": "AP", - "offset": 0 + "offset": -1 } } } ] ], [ - 1028, + 1732, [ { - "AllocSegment": { - "dst": { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -3 + } + }, + "scalar": { + "Immediate": "0x8000000000000000000000000000000" + }, + "max_x": { + "Immediate": "0xffffffffffffffffffffffffffffffff" + }, + "x": { + "register": "AP", + "offset": -1 + }, + "y": { "register": "AP", "offset": 0 } @@ -20932,7 +24207,7 @@ ] ], [ - 1057, + 1748, [ { "AllocSegment": { @@ -20945,10 +24220,19 @@ ] ], [ - 1071, + 1769, [ { - "AllocSegment": { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x8bd8" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, "dst": { "register": "AP", "offset": 0 @@ -20958,7 +24242,7 @@ ] ], [ - 1092, + 1791, [ { "AllocSegment": { @@ -20971,7 +24255,7 @@ ] ], [ - 1120, + 1810, [ { "AllocSegment": { @@ -20984,7 +24268,7 @@ ] ], [ - 1134, + 1834, [ { "AllocSegment": { @@ -20997,7 +24281,7 @@ ] ], [ - 1155, + 1857, [ { "AllocSegment": { @@ -21010,7 +24294,7 @@ ] ], [ - 1169, + 1871, [ { "AllocSegment": { @@ -21023,7 +24307,7 @@ ] ], [ - 1184, + 1889, [ { "TestLessThanOrEqual": { @@ -21045,14 +24329,14 @@ ] ], [ - 1217, + 1928, [ { "TestLessThan": { "lhs": { "Deref": { - "register": "AP", - "offset": -1 + "register": "FP", + "offset": 1 } }, "rhs": { @@ -21067,7 +24351,7 @@ ] ], [ - 1221, + 1932, [ { "LinearSplit": { @@ -21096,14 +24380,14 @@ ] ], [ - 1231, + 1942, [ { "LinearSplit": { "value": { "Deref": { - "register": "AP", - "offset": -2 + "register": "FP", + "offset": 1 } }, "scalar": { @@ -21125,7 +24409,20 @@ ] ], [ - 1246, + 1986, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2008, [ { "AllocSegment": { @@ -21138,17 +24435,17 @@ ] ], [ - 1265, + 2029, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x9baa" + "Immediate": "0x2cec" }, "rhs": { "Deref": { "register": "AP", - "offset": -18 + "offset": -2 } }, "dst": { @@ -21160,7 +24457,22 @@ ] ], [ - 1286, + 2052, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 2056, [ { "AllocSegment": { @@ -21173,7 +24485,7 @@ ] ], [ - 1304, + 2086, [ { "AllocSegment": { @@ -21186,7 +24498,20 @@ ] ], [ - 1326, + 2118, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2132, [ { "AllocSegment": { @@ -21199,7 +24524,7 @@ ] ], [ - 1340, + 2156, [ { "AllocSegment": { @@ -21212,12 +24537,25 @@ ] ], [ - 1357, + 2170, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2188, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x654" + "Immediate": "0xaa0" }, "rhs": { "Deref": { @@ -21234,7 +24572,7 @@ ] ], [ - 1391, + 2226, [ { "TestLessThan": { @@ -21262,7 +24600,7 @@ ] ], [ - 1395, + 2230, [ { "LinearSplit": { @@ -21291,7 +24629,7 @@ ] ], [ - 1436, + 2274, [ { "AllocSegment": { @@ -21304,7 +24642,7 @@ ] ], [ - 1474, + 2316, [ { "AllocSegment": { @@ -21317,7 +24655,7 @@ ] ], [ - 1494, + 2338, [ { "AllocSegment": { @@ -21330,7 +24668,7 @@ ] ], [ - 1513, + 2359, [ { "TestLessThanOrEqual": { @@ -21340,7 +24678,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -21352,7 +24690,7 @@ ] ], [ - 1540, + 2386, [ { "AllocSegment": { @@ -21365,7 +24703,7 @@ ] ], [ - 1558, + 2405, [ { "AllocSegment": { @@ -21378,7 +24716,7 @@ ] ], [ - 1587, + 2437, [ { "AllocSegment": { @@ -21391,7 +24729,7 @@ ] ], [ - 1615, + 2468, [ { "AllocSegment": { @@ -21404,7 +24742,7 @@ ] ], [ - 1636, + 2491, [ { "AllocSegment": { @@ -21417,7 +24755,7 @@ ] ], [ - 1650, + 2505, [ { "AllocSegment": { @@ -21430,7 +24768,7 @@ ] ], [ - 1665, + 2521, [ { "TestLessThanOrEqual": { @@ -21452,14 +24790,14 @@ ] ], [ - 1698, + 2559, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -21474,7 +24812,7 @@ ] ], [ - 1702, + 2563, [ { "LinearSplit": { @@ -21503,14 +24841,14 @@ ] ], [ - 1712, + 2573, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -21532,14 +24870,14 @@ ] ], [ - 1743, + 2608, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -21554,7 +24892,7 @@ ] ], [ - 1747, + 2612, [ { "LinearSplit": { @@ -21583,14 +24921,14 @@ ] ], [ - 1757, + 2622, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -21612,7 +24950,7 @@ ] ], [ - 1772, + 2638, [ { "AllocSegment": { @@ -21625,17 +24963,17 @@ ] ], [ - 1791, + 2659, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1e50" + "Immediate": "0x2db4" }, "rhs": { "Deref": { "register": "AP", - "offset": -29 + "offset": -2 } }, "dst": { @@ -21647,7 +24985,7 @@ ] ], [ - 1810, + 2679, [ { "SystemCall": { @@ -21662,7 +25000,7 @@ ] ], [ - 1820, + 2690, [ { "AllocSegment": { @@ -21675,7 +25013,7 @@ ] ], [ - 1830, + 2701, [ { "AllocSegment": { @@ -21688,7 +25026,7 @@ ] ], [ - 1857, + 2730, [ { "AllocSegment": { @@ -21701,188 +25039,7 @@ ] ], [ - 1879, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 1900, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 1914, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 1929, - [ - { - "TestLessThanOrEqual": { - "lhs": { - "Immediate": "0x0" - }, - "rhs": { - "Deref": { - "register": "FP", - "offset": -6 - } - }, - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 1963, - [ - { - "TestLessThan": { - "lhs": { - "BinOp": { - "op": "Add", - "a": { - "register": "AP", - "offset": -1 - }, - "b": { - "Immediate": "0x0" - } - } - }, - "rhs": { - "Immediate": "0x10000000000000000" - }, - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 1967, - [ - { - "LinearSplit": { - "value": { - "Deref": { - "register": "AP", - "offset": -1 - } - }, - "scalar": { - "Immediate": "0x8000000000000110000000000000000" - }, - "max_x": { - "Immediate": "0xfffffffffffffffffffffffffffffffe" - }, - "x": { - "register": "AP", - "offset": 0 - }, - "y": { - "register": "AP", - "offset": 1 - } - } - } - ] - ], - [ - 1992, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 2011, - [ - { - "TestLessThanOrEqual": { - "lhs": { - "Immediate": "0x1248" - }, - "rhs": { - "Deref": { - "register": "AP", - "offset": -16 - } - }, - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 2030, - [ - { - "SystemCall": { - "system": { - "Deref": { - "register": "FP", - "offset": -5 - } - } - } - } - ] - ], - [ - 2033, - [ - { - "AllocSegment": { - "dst": { - "register": "AP", - "offset": 0 - } - } - } - ] - ], - [ - 2056, + 2754, [ { "AllocSegment": { @@ -21895,7 +25052,7 @@ ] ], [ - 2078, + 2777, [ { "AllocSegment": { @@ -21908,7 +25065,7 @@ ] ], [ - 2092, + 2791, [ { "AllocSegment": { @@ -21921,12 +25078,193 @@ ] ], [ - 2109, + 2807, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x82c8" + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2846, + [ + { + "TestLessThan": { + "lhs": { + "BinOp": { + "op": "Add", + "a": { + "register": "AP", + "offset": -2 + }, + "b": { + "Immediate": "0x0" + } + } + }, + "rhs": { + "Immediate": "0x10000000000000000" + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2850, + [ + { + "LinearSplit": { + "value": { + "Deref": { + "register": "AP", + "offset": -1 + } + }, + "scalar": { + "Immediate": "0x8000000000000110000000000000000" + }, + "max_x": { + "Immediate": "0xfffffffffffffffffffffffffffffffe" + }, + "x": { + "register": "AP", + "offset": 0 + }, + "y": { + "register": "AP", + "offset": 1 + } + } + } + ] + ], + [ + 2876, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2897, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x29cc" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2917, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 2921, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2946, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2970, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 2984, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 3002, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x9074" }, "rhs": { "Deref": { @@ -21943,7 +25281,7 @@ ] ], [ - 2172, + 3071, [ { "AllocSegment": { @@ -21956,17 +25294,17 @@ ] ], [ - 2191, + 3092, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x8070" + "Immediate": "0x896c" }, "rhs": { "Deref": { "register": "AP", - "offset": -39 + "offset": -2 } }, "dst": { @@ -21978,7 +25316,7 @@ ] ], [ - 2234, + 3135, [ { "AllocSegment": { @@ -21991,7 +25329,7 @@ ] ], [ - 2252, + 3154, [ { "AllocSegment": { @@ -22004,7 +25342,7 @@ ] ], [ - 2267, + 3169, [ { "AllocSegment": { @@ -22017,7 +25355,7 @@ ] ], [ - 2281, + 3184, [ { "AllocSegment": { @@ -22030,7 +25368,7 @@ ] ], [ - 2295, + 3199, [ { "AllocSegment": { @@ -22043,7 +25381,7 @@ ] ], [ - 2309, + 3214, [ { "AllocSegment": { @@ -22056,7 +25394,7 @@ ] ], [ - 2331, + 3238, [ { "AllocSegment": { @@ -22069,7 +25407,7 @@ ] ], [ - 2345, + 3253, [ { "AllocSegment": { @@ -22082,7 +25420,7 @@ ] ], [ - 2362, + 3271, [ { "TestLessThanOrEqual": { @@ -22104,14 +25442,14 @@ ] ], [ - 2396, + 3310, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -22126,7 +25464,7 @@ ] ], [ - 2400, + 3314, [ { "LinearSplit": { @@ -22155,14 +25493,14 @@ ] ], [ - 2410, + 3324, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -22184,7 +25522,7 @@ ] ], [ - 2450, + 3368, [ { "AllocSegment": { @@ -22197,7 +25535,7 @@ ] ], [ - 2470, + 3390, [ { "AllocSegment": { @@ -22210,17 +25548,17 @@ ] ], [ - 2489, + 3411, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x2404" + "Immediate": "0x29cc" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -22232,7 +25570,7 @@ ] ], [ - 2511, + 3434, [ { "SystemCall": { @@ -22247,7 +25585,7 @@ ] ], [ - 2532, + 3457, [ { "AllocSegment": { @@ -22260,7 +25598,7 @@ ] ], [ - 2561, + 3489, [ { "AllocSegment": { @@ -22273,7 +25611,7 @@ ] ], [ - 2575, + 3503, [ { "AllocSegment": { @@ -22286,7 +25624,7 @@ ] ], [ - 2596, + 3527, [ { "AllocSegment": { @@ -22299,7 +25637,7 @@ ] ], [ - 2610, + 3541, [ { "AllocSegment": { @@ -22312,7 +25650,7 @@ ] ], [ - 2625, + 3557, [ { "TestLessThanOrEqual": { @@ -22334,14 +25672,14 @@ ] ], [ - 2658, + 3595, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -22356,7 +25694,7 @@ ] ], [ - 2662, + 3599, [ { "LinearSplit": { @@ -22385,14 +25723,14 @@ ] ], [ - 2672, + 3609, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -22414,7 +25752,7 @@ ] ], [ - 2723, + 3665, [ { "AllocSegment": { @@ -22427,17 +25765,17 @@ ] ], [ - 2742, + 3686, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x5172" + "Immediate": "0x6018" }, "rhs": { "Deref": { "register": "AP", - "offset": -34 + "offset": -2 } }, "dst": { @@ -22449,7 +25787,7 @@ ] ], [ - 2771, + 3715, [ { "AllocSegment": { @@ -22462,7 +25800,7 @@ ] ], [ - 2786, + 3730, [ { "AllocSegment": { @@ -22475,7 +25813,7 @@ ] ], [ - 2800, + 3745, [ { "AllocSegment": { @@ -22488,7 +25826,7 @@ ] ], [ - 2814, + 3760, [ { "AllocSegment": { @@ -22501,7 +25839,7 @@ ] ], [ - 2828, + 3775, [ { "AllocSegment": { @@ -22514,7 +25852,7 @@ ] ], [ - 2849, + 3799, [ { "AllocSegment": { @@ -22527,7 +25865,7 @@ ] ], [ - 2863, + 3813, [ { "AllocSegment": { @@ -22540,7 +25878,7 @@ ] ], [ - 2878, + 3829, [ { "TestLessThanOrEqual": { @@ -22562,14 +25900,14 @@ ] ], [ - 2911, + 3867, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -22584,7 +25922,7 @@ ] ], [ - 2915, + 3871, [ { "LinearSplit": { @@ -22613,14 +25951,14 @@ ] ], [ - 2925, + 3881, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -22642,7 +25980,7 @@ ] ], [ - 2940, + 3897, [ { "AllocSegment": { @@ -22655,17 +25993,17 @@ ] ], [ - 2959, + 3918, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x128e" + "Immediate": "0x2904" }, "rhs": { "Deref": { "register": "AP", - "offset": -18 + "offset": -2 } }, "dst": { @@ -22677,7 +26015,7 @@ ] ], [ - 2978, + 3938, [ { "SystemCall": { @@ -22692,7 +26030,7 @@ ] ], [ - 2981, + 3942, [ { "AllocSegment": { @@ -22705,7 +26043,7 @@ ] ], [ - 3001, + 3964, [ { "AllocSegment": { @@ -22718,7 +26056,7 @@ ] ], [ - 3023, + 3988, [ { "AllocSegment": { @@ -22731,7 +26069,7 @@ ] ], [ - 3037, + 4002, [ { "AllocSegment": { @@ -22744,7 +26082,7 @@ ] ], [ - 3054, + 4020, [ { "TestLessThanOrEqual": { @@ -22766,7 +26104,7 @@ ] ], [ - 3096, + 4067, [ { "AllocSegment": { @@ -22779,7 +26117,7 @@ ] ], [ - 3116, + 4089, [ { "AllocSegment": { @@ -22792,17 +26130,17 @@ ] ], [ - 3135, + 4110, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1c8e" + "Immediate": "0x29cc" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -22814,7 +26152,7 @@ ] ], [ - 3156, + 4132, [ { "SystemCall": { @@ -22829,7 +26167,7 @@ ] ], [ - 3159, + 4136, [ { "AllocSegment": { @@ -22842,7 +26180,7 @@ ] ], [ - 3179, + 4158, [ { "AllocSegment": { @@ -22855,7 +26193,7 @@ ] ], [ - 3208, + 4190, [ { "AllocSegment": { @@ -22868,7 +26206,7 @@ ] ], [ - 3222, + 4204, [ { "AllocSegment": { @@ -22881,7 +26219,7 @@ ] ], [ - 3236, + 4219, [ { "AllocSegment": { @@ -22894,7 +26232,7 @@ ] ], [ - 3251, + 4235, [ { "TestLessThanOrEqual": { @@ -22916,7 +26254,7 @@ ] ], [ - 3268, + 4254, [ { "AllocSegment": { @@ -22929,17 +26267,17 @@ ] ], [ - 3288, + 4276, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x41a" + "Immediate": "0x2076" }, "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -22951,7 +26289,7 @@ ] ], [ - 3300, + 4288, [ { "AllocFelt252Dict": { @@ -22966,7 +26304,7 @@ ] ], [ - 3319, + 4307, [ { "AllocSegment": { @@ -22979,7 +26317,7 @@ ] ], [ - 3330, + 4318, [ { "AllocSegment": { @@ -22992,7 +26330,7 @@ ] ], [ - 3346, + 4334, [ { "AllocSegment": { @@ -23005,12 +26343,12 @@ ] ], [ - 3364, + 4353, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x26c" }, "rhs": { "Deref": { @@ -23027,14 +26365,14 @@ ] ], [ - 3398, + 4391, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -23049,7 +26387,7 @@ ] ], [ - 3402, + 4395, [ { "LinearSplit": { @@ -23078,14 +26416,14 @@ ] ], [ - 3412, + 4405, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -23107,7 +26445,7 @@ ] ], [ - 3452, + 4449, [ { "AllocSegment": { @@ -23120,7 +26458,7 @@ ] ], [ - 3489, + 4492, [ { "AllocSegment": { @@ -23133,17 +26471,17 @@ ] ], [ - 3508, + 4513, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x28b4" + "Immediate": "0x2b5c" }, "rhs": { "Deref": { "register": "AP", - "offset": -17 + "offset": -2 } }, "dst": { @@ -23155,7 +26493,7 @@ ] ], [ - 3534, + 4540, [ { "SystemCall": { @@ -23170,7 +26508,7 @@ ] ], [ - 3537, + 4544, [ { "AllocSegment": { @@ -23183,7 +26521,7 @@ ] ], [ - 3557, + 4566, [ { "AllocSegment": { @@ -23196,7 +26534,7 @@ ] ], [ - 3572, + 4581, [ { "AllocSegment": { @@ -23209,7 +26547,7 @@ ] ], [ - 3600, + 4613, [ { "AllocSegment": { @@ -23222,7 +26560,7 @@ ] ], [ - 3614, + 4627, [ { "AllocSegment": { @@ -23235,7 +26573,7 @@ ] ], [ - 3635, + 4651, [ { "AllocSegment": { @@ -23248,7 +26586,7 @@ ] ], [ - 3649, + 4665, [ { "AllocSegment": { @@ -23261,7 +26599,7 @@ ] ], [ - 3664, + 4681, [ { "TestLessThanOrEqual": { @@ -23283,14 +26621,14 @@ ] ], [ - 3698, + 4720, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -23305,14 +26643,14 @@ ] ], [ - 3700, + 4722, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -23331,7 +26669,7 @@ ] ], [ - 3728, + 4751, [ { "AllocSegment": { @@ -23344,17 +26682,17 @@ ] ], [ - 3747, + 4772, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x690" }, "rhs": { "Deref": { "register": "AP", - "offset": -15 + "offset": -2 } }, "dst": { @@ -23366,7 +26704,7 @@ ] ], [ - 3767, + 4792, [ { "AllocSegment": { @@ -23379,7 +26717,7 @@ ] ], [ - 3787, + 4813, [ { "AllocSegment": { @@ -23392,7 +26730,7 @@ ] ], [ - 3809, + 4837, [ { "AllocSegment": { @@ -23405,7 +26743,7 @@ ] ], [ - 3823, + 4851, [ { "AllocSegment": { @@ -23418,7 +26756,7 @@ ] ], [ - 3838, + 4867, [ { "TestLessThanOrEqual": { @@ -23440,7 +26778,7 @@ ] ], [ - 3855, + 4886, [ { "AllocSegment": { @@ -23453,17 +26791,17 @@ ] ], [ - 3874, + 4907, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x7364" + "Immediate": "0x96c8" }, "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -23475,7 +26813,7 @@ ] ], [ - 3894, + 4927, [ { "AllocSegment": { @@ -23488,7 +26826,7 @@ ] ], [ - 3912, + 4946, [ { "AllocSegment": { @@ -23501,7 +26839,7 @@ ] ], [ - 3927, + 4961, [ { "AllocSegment": { @@ -23514,7 +26852,7 @@ ] ], [ - 3942, + 4977, [ { "TestLessThanOrEqual": { @@ -23536,7 +26874,7 @@ ] ], [ - 3959, + 4996, [ { "AllocSegment": { @@ -23549,17 +26887,17 @@ ] ], [ - 3978, + 5017, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x3b92" + "Immediate": "0x58b6" }, "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -23571,7 +26909,7 @@ ] ], [ - 3998, + 5037, [ { "AllocSegment": { @@ -23584,7 +26922,7 @@ ] ], [ - 4016, + 5056, [ { "AllocSegment": { @@ -23597,7 +26935,7 @@ ] ], [ - 4031, + 5071, [ { "AllocSegment": { @@ -23610,7 +26948,7 @@ ] ], [ - 4046, + 5087, [ { "TestLessThanOrEqual": { @@ -23632,7 +26970,7 @@ ] ], [ - 4063, + 5106, [ { "AllocSegment": { @@ -23645,7 +26983,7 @@ ] ], [ - 4088, + 5133, [ { "TestLessThanOrEqual": { @@ -23658,7 +26996,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -10 + "offset": -5 } }, "dst": { @@ -23670,7 +27008,7 @@ ] ], [ - 4107, + 5152, [ { "AllocSegment": { @@ -23683,7 +27021,7 @@ ] ], [ - 4127, + 5173, [ { "AllocSegment": { @@ -23696,7 +27034,7 @@ ] ], [ - 4143, + 5189, [ { "AllocSegment": { @@ -23709,7 +27047,7 @@ ] ], [ - 4159, + 5206, [ { "TestLessThanOrEqual": { @@ -23731,7 +27069,7 @@ ] ], [ - 4176, + 5225, [ { "AllocSegment": { @@ -23744,17 +27082,17 @@ ] ], [ - 4195, + 5246, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x366fa" + "Immediate": "0x3909e" }, "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -23766,7 +27104,7 @@ ] ], [ - 4215, + 5266, [ { "AllocSegment": { @@ -23779,7 +27117,7 @@ ] ], [ - 4233, + 5285, [ { "AllocSegment": { @@ -23792,7 +27130,7 @@ ] ], [ - 4248, + 5300, [ { "AllocSegment": { @@ -23805,7 +27143,7 @@ ] ], [ - 4263, + 5316, [ { "TestLessThanOrEqual": { @@ -23827,7 +27165,7 @@ ] ], [ - 4298, + 5355, [ { "AllocSegment": { @@ -23840,17 +27178,17 @@ ] ], [ - 4317, + 5376, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0xc8" }, "rhs": { "Deref": { "register": "AP", - "offset": -15 + "offset": -2 } }, "dst": { @@ -23862,7 +27200,7 @@ ] ], [ - 4334, + 5394, [ { "AllocSegment": { @@ -23875,7 +27213,7 @@ ] ], [ - 4348, + 5408, [ { "AllocSegment": { @@ -23888,7 +27226,7 @@ ] ], [ - 4362, + 5422, [ { "AllocSegment": { @@ -23901,7 +27239,7 @@ ] ], [ - 4377, + 5437, [ { "AllocSegment": { @@ -23914,7 +27252,7 @@ ] ], [ - 4391, + 5452, [ { "AllocSegment": { @@ -23927,7 +27265,7 @@ ] ], [ - 4405, + 5467, [ { "AllocSegment": { @@ -23940,7 +27278,7 @@ ] ], [ - 4420, + 5483, [ { "TestLessThanOrEqual": { @@ -23962,7 +27300,7 @@ ] ], [ - 4453, + 5520, [ { "AllocSegment": { @@ -23975,7 +27313,7 @@ ] ], [ - 4473, + 5542, [ { "AllocSegment": { @@ -23988,17 +27326,17 @@ ] ], [ - 4492, + 5563, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x74e" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -24010,7 +27348,7 @@ ] ], [ - 4514, + 5585, [ { "AllocSegment": { @@ -24023,7 +27361,7 @@ ] ], [ - 4534, + 5606, [ { "AllocSegment": { @@ -24036,7 +27374,7 @@ ] ], [ - 4563, + 5638, [ { "AllocSegment": { @@ -24049,7 +27387,7 @@ ] ], [ - 4577, + 5652, [ { "AllocSegment": { @@ -24062,7 +27400,7 @@ ] ], [ - 4592, + 5668, [ { "TestLessThanOrEqual": { @@ -24084,7 +27422,7 @@ ] ], [ - 4609, + 5687, [ { "AllocSegment": { @@ -24097,7 +27435,7 @@ ] ], [ - 4628, + 5708, [ { "TestLessThanOrEqual": { @@ -24107,7 +27445,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -24119,7 +27457,7 @@ ] ], [ - 4640, + 5720, [ { "AllocSegment": { @@ -24132,7 +27470,7 @@ ] ], [ - 4655, + 5736, [ { "AllocSegment": { @@ -24145,7 +27483,7 @@ ] ], [ - 4670, + 5751, [ { "AllocSegment": { @@ -24158,7 +27496,7 @@ ] ], [ - 4685, + 5767, [ { "TestLessThanOrEqual": { @@ -24180,7 +27518,7 @@ ] ], [ - 4711, + 5796, [ { "AllocSegment": { @@ -24193,17 +27531,17 @@ ] ], [ - 4730, + 5817, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x5be" }, "rhs": { "Deref": { "register": "AP", - "offset": -11 + "offset": -2 } }, "dst": { @@ -24215,7 +27553,7 @@ ] ], [ - 4750, + 5837, [ { "AllocSegment": { @@ -24228,7 +27566,7 @@ ] ], [ - 4768, + 5856, [ { "AllocSegment": { @@ -24241,7 +27579,7 @@ ] ], [ - 4783, + 5871, [ { "AllocSegment": { @@ -24254,7 +27592,7 @@ ] ], [ - 4797, + 5886, [ { "AllocSegment": { @@ -24267,7 +27605,7 @@ ] ], [ - 4812, + 5902, [ { "TestLessThanOrEqual": { @@ -24289,7 +27627,7 @@ ] ], [ - 4838, + 5931, [ { "AllocSegment": { @@ -24302,17 +27640,17 @@ ] ], [ - 4857, + 5952, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x5be" }, "rhs": { "Deref": { "register": "AP", - "offset": -11 + "offset": -2 } }, "dst": { @@ -24324,7 +27662,7 @@ ] ], [ - 4877, + 5972, [ { "AllocSegment": { @@ -24337,7 +27675,7 @@ ] ], [ - 4895, + 5991, [ { "AllocSegment": { @@ -24350,7 +27688,7 @@ ] ], [ - 4910, + 6006, [ { "AllocSegment": { @@ -24363,7 +27701,7 @@ ] ], [ - 4924, + 6021, [ { "AllocSegment": { @@ -24376,7 +27714,7 @@ ] ], [ - 4939, + 6037, [ { "TestLessThanOrEqual": { @@ -24398,14 +27736,14 @@ ] ], [ - 4972, + 6075, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -24420,7 +27758,7 @@ ] ], [ - 4976, + 6079, [ { "LinearSplit": { @@ -24449,14 +27787,14 @@ ] ], [ - 4986, + 6089, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -24478,7 +27816,7 @@ ] ], [ - 5019, + 6125, [ { "AllocSegment": { @@ -24491,17 +27829,17 @@ ] ], [ - 5038, + 6146, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1b8a" + "Immediate": "0x2e7c" }, "rhs": { "Deref": { "register": "AP", - "offset": -26 + "offset": -2 } }, "dst": { @@ -24513,7 +27851,7 @@ ] ], [ - 5060, + 6170, [ { "AllocSegment": { @@ -24526,7 +27864,7 @@ ] ], [ - 5078, + 6189, [ { "SystemCall": { @@ -24541,7 +27879,7 @@ ] ], [ - 5084, + 6196, [ { "AllocSegment": { @@ -24554,7 +27892,7 @@ ] ], [ - 5103, + 6217, [ { "AllocSegment": { @@ -24567,7 +27905,7 @@ ] ], [ - 5118, + 6232, [ { "AllocSegment": { @@ -24580,7 +27918,7 @@ ] ], [ - 5132, + 6247, [ { "AllocSegment": { @@ -24593,7 +27931,7 @@ ] ], [ - 5153, + 6271, [ { "AllocSegment": { @@ -24606,7 +27944,7 @@ ] ], [ - 5167, + 6285, [ { "AllocSegment": { @@ -24619,7 +27957,7 @@ ] ], [ - 5182, + 6301, [ { "TestLessThanOrEqual": { @@ -24641,7 +27979,7 @@ ] ], [ - 5226, + 6350, [ { "AllocSegment": { @@ -24654,7 +27992,7 @@ ] ], [ - 5251, + 6377, [ { "TestLessThanOrEqual": { @@ -24667,7 +28005,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -22 + "offset": -5 } }, "dst": { @@ -24679,7 +28017,7 @@ ] ], [ - 5273, + 6399, [ { "AllocSegment": { @@ -24692,7 +28030,7 @@ ] ], [ - 5293, + 6420, [ { "AllocSegment": { @@ -24705,7 +28043,7 @@ ] ], [ - 5309, + 6436, [ { "AllocSegment": { @@ -24718,7 +28056,7 @@ ] ], [ - 5324, + 6452, [ { "AllocSegment": { @@ -24731,7 +28069,7 @@ ] ], [ - 5339, + 6468, [ { "AllocSegment": { @@ -24744,7 +28082,7 @@ ] ], [ - 5354, + 6484, [ { "AllocSegment": { @@ -24757,7 +28095,7 @@ ] ], [ - 5370, + 6501, [ { "TestLessThanOrEqual": { @@ -24779,14 +28117,14 @@ ] ], [ - 5413, + 6550, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -24801,14 +28139,14 @@ ] ], [ - 5415, + 6552, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -24827,14 +28165,14 @@ ] ], [ - 5460, + 6601, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -24849,14 +28187,14 @@ ] ], [ - 5462, + 6603, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -24875,7 +28213,7 @@ ] ], [ - 5490, + 6632, [ { "AllocSegment": { @@ -24888,7 +28226,7 @@ ] ], [ - 5520, + 6664, [ { "TestLessThanOrEqual": { @@ -24901,7 +28239,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -33 + "offset": -8 } }, "dst": { @@ -24913,7 +28251,7 @@ ] ], [ - 5543, + 6687, [ { "AllocSegment": { @@ -24926,7 +28264,7 @@ ] ], [ - 5565, + 6710, [ { "AllocSegment": { @@ -24939,7 +28277,7 @@ ] ], [ - 5605, + 6752, [ { "AllocSegment": { @@ -24952,7 +28290,7 @@ ] ], [ - 5621, + 6768, [ { "AllocSegment": { @@ -24965,7 +28303,7 @@ ] ], [ - 5638, + 6786, [ { "TestLessThanOrEqual": { @@ -24987,14 +28325,14 @@ ] ], [ - 5671, + 6824, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -25009,7 +28347,7 @@ ] ], [ - 5675, + 6828, [ { "LinearSplit": { @@ -25038,14 +28376,14 @@ ] ], [ - 5685, + 6838, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -25067,14 +28405,14 @@ ] ], [ - 5726, + 6884, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -25089,14 +28427,14 @@ ] ], [ - 5728, + 6886, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -25115,14 +28453,14 @@ ] ], [ - 5773, + 6935, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -25137,14 +28475,14 @@ ] ], [ - 5775, + 6937, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -25163,7 +28501,7 @@ ] ], [ - 5803, + 6966, [ { "AllocSegment": { @@ -25176,17 +28514,17 @@ ] ], [ - 5822, + 6987, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x2382" + "Immediate": "0x2e18" }, "rhs": { "Deref": { "register": "AP", - "offset": -38 + "offset": -2 } }, "dst": { @@ -25198,7 +28536,7 @@ ] ], [ - 5834, + 6999, [ { "AllocSegment": { @@ -25211,7 +28549,7 @@ ] ], [ - 5857, + 7023, [ { "SystemCall": { @@ -25226,7 +28564,7 @@ ] ], [ - 5860, + 7027, [ { "AllocSegment": { @@ -25239,7 +28577,7 @@ ] ], [ - 5880, + 7049, [ { "AllocSegment": { @@ -25252,7 +28590,7 @@ ] ], [ - 5918, + 7089, [ { "AllocSegment": { @@ -25265,7 +28603,7 @@ ] ], [ - 5939, + 7112, [ { "AllocSegment": { @@ -25278,7 +28616,7 @@ ] ], [ - 5953, + 7126, [ { "AllocSegment": { @@ -25291,7 +28629,7 @@ ] ], [ - 5968, + 7142, [ { "TestLessThanOrEqual": { @@ -25313,7 +28651,7 @@ ] ], [ - 5985, + 7161, [ { "AllocSegment": { @@ -25326,7 +28664,7 @@ ] ], [ - 6008, + 7186, [ { "TestLessThanOrEqual": { @@ -25339,7 +28677,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -9 + "offset": -4 } }, "dst": { @@ -25351,7 +28689,7 @@ ] ], [ - 6027, + 7205, [ { "AllocSegment": { @@ -25364,7 +28702,7 @@ ] ], [ - 6047, + 7226, [ { "AllocSegment": { @@ -25377,7 +28715,7 @@ ] ], [ - 6063, + 7242, [ { "AllocSegment": { @@ -25390,7 +28728,7 @@ ] ], [ - 6079, + 7259, [ { "TestLessThanOrEqual": { @@ -25412,7 +28750,7 @@ ] ], [ - 6105, + 7288, [ { "AllocSegment": { @@ -25425,7 +28763,7 @@ ] ], [ - 6130, + 7315, [ { "TestLessThanOrEqual": { @@ -25438,7 +28776,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -14 + "offset": -5 } }, "dst": { @@ -25450,7 +28788,7 @@ ] ], [ - 6150, + 7335, [ { "AllocSegment": { @@ -25463,7 +28801,7 @@ ] ], [ - 6170, + 7356, [ { "AllocSegment": { @@ -25476,7 +28814,7 @@ ] ], [ - 6186, + 7372, [ { "AllocSegment": { @@ -25489,7 +28827,7 @@ ] ], [ - 6201, + 7388, [ { "AllocSegment": { @@ -25502,7 +28840,7 @@ ] ], [ - 6217, + 7405, [ { "TestLessThanOrEqual": { @@ -25524,7 +28862,7 @@ ] ], [ - 6243, + 7434, [ { "AllocSegment": { @@ -25537,17 +28875,17 @@ ] ], [ - 6262, + 7455, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x10f4" + "Immediate": "0x2c88" }, "rhs": { "Deref": { "register": "AP", - "offset": -11 + "offset": -2 } }, "dst": { @@ -25559,7 +28897,7 @@ ] ], [ - 6274, + 7467, [ { "AllocSegment": { @@ -25572,7 +28910,7 @@ ] ], [ - 6294, + 7488, [ { "SystemCall": { @@ -25587,7 +28925,7 @@ ] ], [ - 6297, + 7492, [ { "AllocSegment": { @@ -25600,7 +28938,7 @@ ] ], [ - 6317, + 7514, [ { "AllocSegment": { @@ -25613,7 +28951,7 @@ ] ], [ - 6332, + 7529, [ { "AllocSegment": { @@ -25626,7 +28964,7 @@ ] ], [ - 6346, + 7544, [ { "AllocSegment": { @@ -25639,7 +28977,7 @@ ] ], [ - 6361, + 7560, [ { "TestLessThanOrEqual": { @@ -25661,7 +28999,7 @@ ] ], [ - 6378, + 7579, [ { "AllocSegment": { @@ -25674,7 +29012,7 @@ ] ], [ - 6409, + 7612, [ { "TestLessThanOrEqual": { @@ -25687,7 +29025,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -13 + "offset": -8 } }, "dst": { @@ -25699,7 +29037,7 @@ ] ], [ - 6429, + 7632, [ { "AllocSegment": { @@ -25712,7 +29050,7 @@ ] ], [ - 6453, + 7657, [ { "AllocSegment": { @@ -25725,7 +29063,7 @@ ] ], [ - 6471, + 7675, [ { "AllocSegment": { @@ -25738,7 +29076,7 @@ ] ], [ - 6489, + 7694, [ { "TestLessThanOrEqual": { @@ -25760,7 +29098,7 @@ ] ], [ - 6506, + 7713, [ { "AllocSegment": { @@ -25773,17 +29111,17 @@ ] ], [ - 6526, + 7735, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x0" + "Immediate": "0x1864" }, "rhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -2 } }, "dst": { @@ -25795,7 +29133,7 @@ ] ], [ - 6550, + 7761, [ { "AllocSegment": { @@ -25808,7 +29146,7 @@ ] ], [ - 6580, + 7795, [ { "AllocSegment": { @@ -25821,7 +29159,7 @@ ] ], [ - 6596, + 7811, [ { "AllocSegment": { @@ -25834,7 +29172,7 @@ ] ], [ - 6614, + 7830, [ { "TestLessThanOrEqual": { @@ -25856,14 +29194,14 @@ ] ], [ - 6648, + 7869, [ { "TestLessThan": { "lhs": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "rhs": { @@ -25878,7 +29216,7 @@ ] ], [ - 6652, + 7873, [ { "LinearSplit": { @@ -25907,14 +29245,14 @@ ] ], [ - 6662, + 7883, [ { "LinearSplit": { "value": { "Deref": { "register": "FP", - "offset": 0 + "offset": 1 } }, "scalar": { @@ -25936,7 +29274,7 @@ ] ], [ - 6702, + 7927, [ { "AllocSegment": { @@ -25949,7 +29287,7 @@ ] ], [ - 6722, + 7949, [ { "AllocSegment": { @@ -25962,17 +29300,17 @@ ] ], [ - 6741, + 7970, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0xb48c" + "Immediate": "0x118dc" }, "rhs": { "Deref": { "register": "AP", - "offset": -12 + "offset": -2 } }, "dst": { @@ -25984,7 +29322,7 @@ ] ], [ - 6765, + 7994, [ { "AllocSegment": { @@ -25997,7 +29335,7 @@ ] ], [ - 6783, + 8013, [ { "AllocSegment": { @@ -26010,7 +29348,7 @@ ] ], [ - 6812, + 8045, [ { "AllocSegment": { @@ -26023,7 +29361,7 @@ ] ], [ - 6826, + 8059, [ { "AllocSegment": { @@ -26036,7 +29374,7 @@ ] ], [ - 6847, + 8083, [ { "AllocSegment": { @@ -26049,7 +29387,7 @@ ] ], [ - 6861, + 8097, [ { "AllocSegment": { @@ -26062,7 +29400,7 @@ ] ], [ - 6876, + 8113, [ { "TestLessThanOrEqual": { @@ -26084,7 +29422,7 @@ ] ], [ - 6902, + 8142, [ { "AllocSegment": { @@ -26097,7 +29435,7 @@ ] ], [ - 6921, + 8163, [ { "TestLessThanOrEqual": { @@ -26107,7 +29445,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -11 + "offset": -2 } }, "dst": { @@ -26119,7 +29457,7 @@ ] ], [ - 6933, + 8175, [ { "AllocSegment": { @@ -26132,7 +29470,7 @@ ] ], [ - 6946, + 8189, [ { "AllocSegment": { @@ -26145,7 +29483,7 @@ ] ], [ - 6961, + 8204, [ { "AllocSegment": { @@ -26158,7 +29496,7 @@ ] ], [ - 6975, + 8219, [ { "AllocSegment": { @@ -26171,7 +29509,7 @@ ] ], [ - 6990, + 8235, [ { "TestLessThanOrEqual": { @@ -26193,7 +29531,7 @@ ] ], [ - 7024, + 8254, [ { "AllocSegment": { @@ -26206,7 +29544,7 @@ ] ], [ - 7043, + 8275, [ { "TestLessThanOrEqual": { @@ -26216,7 +29554,7 @@ "rhs": { "Deref": { "register": "AP", - "offset": -14 + "offset": -2 } }, "dst": { @@ -26228,7 +29566,7 @@ ] ], [ - 7055, + 8287, [ { "AllocSegment": { @@ -26241,7 +29579,7 @@ ] ], [ - 7068, + 8299, [ { "AllocSegment": { @@ -26254,7 +29592,7 @@ ] ], [ - 7083, + 8314, [ { "AllocSegment": { @@ -26267,7 +29605,64 @@ ] ], [ - 7097, + 8330, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "FP", + "offset": -6 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8368, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8389, + [ + { + "TestLessThanOrEqual": { + "lhs": { + "Immediate": "0x0" + }, + "rhs": { + "Deref": { + "register": "AP", + "offset": -2 + } + }, + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8401, [ { "AllocSegment": { @@ -26280,7 +29675,7 @@ ] ], [ - 7111, + 8415, [ { "AllocSegment": { @@ -26293,7 +29688,46 @@ ] ], [ - 7126, + 8430, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8445, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8460, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 8476, [ { "TestLessThanOrEqual": { @@ -26315,14 +29749,14 @@ ] ], [ - 7167, + 8523, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -26337,7 +29771,7 @@ ] ], [ - 7171, + 8527, [ { "LinearSplit": { @@ -26366,14 +29800,14 @@ ] ], [ - 7181, + 8537, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -26395,7 +29829,7 @@ ] ], [ - 7205, + 8563, [ { "AllocSegment": { @@ -26408,17 +29842,17 @@ ] ], [ - 7224, + 8584, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x17a2" + "Immediate": "0x2a94" }, "rhs": { "Deref": { "register": "AP", - "offset": -25 + "offset": -2 } }, "dst": { @@ -26430,7 +29864,7 @@ ] ], [ - 7247, + 8608, [ { "SystemCall": { @@ -26445,7 +29879,7 @@ ] ], [ - 7250, + 8612, [ { "AllocSegment": { @@ -26458,7 +29892,7 @@ ] ], [ - 7272, + 8636, [ { "AllocSegment": { @@ -26471,7 +29905,7 @@ ] ], [ - 7287, + 8651, [ { "AllocSegment": { @@ -26484,7 +29918,7 @@ ] ], [ - 7308, + 8675, [ { "AllocSegment": { @@ -26497,7 +29931,7 @@ ] ], [ - 7322, + 8689, [ { "AllocSegment": { @@ -26510,7 +29944,7 @@ ] ], [ - 7336, + 8704, [ { "AllocSegment": { @@ -26523,7 +29957,7 @@ ] ], [ - 7351, + 8720, [ { "TestLessThanOrEqual": { @@ -26545,7 +29979,7 @@ ] ], [ - 7386, + 8759, [ { "AllocSegment": { @@ -26558,17 +29992,17 @@ ] ], [ - 7405, + 8780, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x11bc" + "Immediate": "0x2b5c" }, "rhs": { "Deref": { "register": "AP", - "offset": -15 + "offset": -2 } }, "dst": { @@ -26580,7 +30014,7 @@ ] ], [ - 7431, + 8807, [ { "SystemCall": { @@ -26595,7 +30029,7 @@ ] ], [ - 7434, + 8811, [ { "AllocSegment": { @@ -26608,7 +30042,7 @@ ] ], [ - 7456, + 8835, [ { "AllocSegment": { @@ -26621,7 +30055,7 @@ ] ], [ - 7471, + 8850, [ { "AllocSegment": { @@ -26634,7 +30068,7 @@ ] ], [ - 7485, + 8865, [ { "AllocSegment": { @@ -26647,7 +30081,7 @@ ] ], [ - 7499, + 8880, [ { "AllocSegment": { @@ -26660,12 +30094,12 @@ ] ], [ - 7514, + 8896, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x942" + "Immediate": "0xa6e" }, "rhs": { "Deref": { @@ -26682,7 +30116,7 @@ ] ], [ - 7586, + 8974, [ { "AllocSegment": { @@ -26695,12 +30129,12 @@ ] ], [ - 7606, + 8994, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x686" + "Immediate": "0x6ea" }, "rhs": { "Deref": { @@ -26717,7 +30151,7 @@ ] ], [ - 7643, + 9033, [ { "AllocSegment": { @@ -26730,12 +30164,12 @@ ] ], [ - 7657, + 9047, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x686" + "Immediate": "0x6ea" }, "rhs": { "Deref": { @@ -26752,7 +30186,111 @@ ] ], [ - 7694, + 9086, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 9100, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 9116, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "FP", + "offset": -5 + } + } + } + } + ] + ], + [ + 9126, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -5 + }, + "b": { + "Immediate": "0x8" + } + } + } + } + } + ] + ], + [ + 9140, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -5 + }, + "b": { + "Immediate": "0xd" + } + } + } + } + } + ] + ], + [ + 9158, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -5 + }, + "b": { + "Immediate": "0x14" + } + } + } + } + } + ] + ], + [ + 9179, [ { "AllocSegment": { @@ -26765,7 +30303,7 @@ ] ], [ - 7708, + 9240, [ { "AllocSegment": { @@ -26778,14 +30316,14 @@ ] ], [ - 7724, + 9252, [ { "SystemCall": { "system": { "Deref": { "register": "FP", - "offset": -4 + "offset": -5 } } } @@ -26793,28 +30331,20 @@ ] ], [ - 7733, + 9256, [ { - "SystemCall": { - "system": { - "BinOp": { - "op": "Add", - "a": { - "register": "FP", - "offset": -4 - }, - "b": { - "Immediate": "0x8" - } - } + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 } } } ] ], [ - 7746, + 9276, [ { "SystemCall": { @@ -26823,10 +30353,10 @@ "op": "Add", "a": { "register": "FP", - "offset": -4 + "offset": -5 }, "b": { - "Immediate": "0xd" + "Immediate": "0xa" } } } @@ -26835,7 +30365,20 @@ ] ], [ - 7763, + 9282, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 9309, [ { "SystemCall": { @@ -26844,7 +30387,7 @@ "op": "Add", "a": { "register": "FP", - "offset": -4 + "offset": -5 }, "b": { "Immediate": "0x14" @@ -26856,7 +30399,7 @@ ] ], [ - 7766, + 9333, [ { "AllocSegment": { @@ -26869,12 +30412,12 @@ ] ], [ - 7820, + 9370, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x3480" + "Immediate": "0x35ac" }, "rhs": { "Deref": { @@ -26891,7 +30434,7 @@ ] ], [ - 7845, + 9397, [ { "SystemCall": { @@ -26906,7 +30449,7 @@ ] ], [ - 7853, + 9406, [ { "TestLessThan": { @@ -26937,7 +30480,7 @@ ] ], [ - 7878, + 9431, [ { "AllocSegment": { @@ -26950,7 +30493,7 @@ ] ], [ - 7911, + 9468, [ { "AllocSegment": { @@ -26963,7 +30506,7 @@ ] ], [ - 7948, + 9505, [ { "TestLessThan": { @@ -26991,7 +30534,7 @@ ] ], [ - 7952, + 9509, [ { "LinearSplit": { @@ -27020,7 +30563,7 @@ ] ], [ - 7994, + 9551, [ { "TestLessThan": { @@ -27048,7 +30591,7 @@ ] ], [ - 7998, + 9555, [ { "LinearSplit": { @@ -27077,7 +30620,7 @@ ] ], [ - 8039, + 9596, [ { "TestLessThan": { @@ -27099,7 +30642,7 @@ ] ], [ - 8043, + 9600, [ { "LinearSplit": { @@ -27128,7 +30671,7 @@ ] ], [ - 8053, + 9610, [ { "LinearSplit": { @@ -27157,7 +30700,7 @@ ] ], [ - 8164, + 9725, [ { "TestLessThan": { @@ -27179,7 +30722,7 @@ ] ], [ - 8168, + 9729, [ { "LinearSplit": { @@ -27208,7 +30751,7 @@ ] ], [ - 8178, + 9739, [ { "LinearSplit": { @@ -27237,7 +30780,7 @@ ] ], [ - 8210, + 9775, [ { "TestLessThan": { @@ -27259,7 +30802,7 @@ ] ], [ - 8212, + 9777, [ { "DivMod": { @@ -27285,7 +30828,7 @@ ] ], [ - 8293, + 9866, [ { "AllocSegment": { @@ -27298,14 +30841,14 @@ ] ], [ - 8348, + 9929, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -27320,14 +30863,14 @@ ] ], [ - 8350, + 9931, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "rhs": { @@ -27346,7 +30889,7 @@ ] ], [ - 8403, + 9990, [ { "TestLessThan": { @@ -27355,7 +30898,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -1 + "offset": -2 }, "b": { "Immediate": "0x0" @@ -27374,7 +30917,7 @@ ] ], [ - 8407, + 9994, [ { "LinearSplit": { @@ -27403,7 +30946,7 @@ ] ], [ - 8449, + 10040, [ { "TestLessThan": { @@ -27412,7 +30955,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -1 + "offset": -2 }, "b": { "Immediate": "0x0" @@ -27431,7 +30974,7 @@ ] ], [ - 8453, + 10044, [ { "LinearSplit": { @@ -27460,7 +31003,7 @@ ] ], [ - 9284, + 10904, [ { "SystemCall": { @@ -27475,7 +31018,7 @@ ] ], [ - 9517, + 11174, [ { "AllocSegment": { @@ -27488,7 +31031,7 @@ ] ], [ - 9531, + 11188, [ { "AllocSegment": { @@ -27501,7 +31044,7 @@ ] ], [ - 9545, + 11203, [ { "AllocSegment": { @@ -27514,7 +31057,7 @@ ] ], [ - 9609, + 11275, [ { "AllocSegment": { @@ -27527,7 +31070,7 @@ ] ], [ - 9623, + 11291, [ { "AllocSegment": { @@ -27540,7 +31083,7 @@ ] ], [ - 9646, + 11316, [ { "AllocSegment": { @@ -27553,7 +31096,7 @@ ] ], [ - 9670, + 11340, [ { "SystemCall": { @@ -27568,7 +31111,7 @@ ] ], [ - 9673, + 11344, [ { "AllocSegment": { @@ -27581,7 +31124,7 @@ ] ], [ - 9689, + 11360, [ { "SystemCall": { @@ -27602,7 +31145,7 @@ ] ], [ - 9726, + 11401, [ { "GetSegmentArenaIndex": { @@ -27621,7 +31164,7 @@ ] ], [ - 9767, + 11442, [ { "AllocSegment": { @@ -27634,7 +31177,7 @@ ] ], [ - 9775, + 11450, [ { "InitSquashData": { @@ -27669,7 +31212,7 @@ ] ], [ - 9794, + 11469, [ { "GetCurrentAccessIndex": { @@ -27684,7 +31227,7 @@ ] ], [ - 9807, + 11482, [ { "ShouldSkipSquashLoop": { @@ -27697,7 +31240,7 @@ ] ], [ - 9809, + 11484, [ { "GetCurrentAccessDelta": { @@ -27710,7 +31253,7 @@ ] ], [ - 9820, + 11495, [ { "ShouldContinueSquashLoop": { @@ -27723,7 +31266,7 @@ ] ], [ - 9834, + 11509, [ { "GetNextDictKey": { @@ -27736,7 +31279,7 @@ ] ], [ - 9853, + 11528, [ { "AssertLeFindSmallArcs": { @@ -27769,7 +31312,7 @@ ] ], [ - 9865, + 11540, [ { "AssertLeIsFirstArcExcluded": { @@ -27782,7 +31325,7 @@ ] ], [ - 9877, + 11552, [ { "AssertLeIsSecondArcExcluded": { @@ -27795,12 +31338,12 @@ ] ], [ - 9910, + 11585, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x2256" + "Immediate": "0x23e6" }, "rhs": { "Deref": { @@ -27817,7 +31360,7 @@ ] ], [ - 9923, + 11599, [ { "TestLessThan": { @@ -27839,7 +31382,7 @@ ] ], [ - 9943, + 11620, [ { "TestLessThan": { @@ -27861,7 +31404,7 @@ ] ], [ - 9961, + 11638, [ { "WideMul128": { @@ -27890,7 +31433,7 @@ ] ], [ - 9963, + 11640, [ { "DivMod": { @@ -27916,7 +31459,7 @@ ] ], [ - 9973, + 11650, [ { "DivMod": { @@ -27942,7 +31485,7 @@ ] ], [ - 9984, + 11661, [ { "DivMod": { @@ -27968,7 +31511,7 @@ ] ], [ - 9998, + 11677, [ { "TestLessThan": { @@ -27990,7 +31533,7 @@ ] ], [ - 10015, + 11695, [ { "AllocSegment": { @@ -28003,7 +31546,7 @@ ] ], [ - 10029, + 11709, [ { "AllocSegment": { @@ -28016,7 +31559,7 @@ ] ], [ - 10049, + 11731, [ { "AllocSegment": { @@ -28029,7 +31572,7 @@ ] ], [ - 10070, + 11754, [ { "AllocSegment": { @@ -28042,7 +31585,7 @@ ] ], [ - 10084, + 11769, [ { "AllocSegment": { @@ -28055,7 +31598,7 @@ ] ], [ - 10098, + 11783, [ { "AllocSegment": { @@ -28068,7 +31611,7 @@ ] ], [ - 10106, + 11791, [ { "AllocSegment": { @@ -28081,7 +31624,7 @@ ] ], [ - 10137, + 11823, [ { "SystemCall": { @@ -28096,7 +31639,7 @@ ] ], [ - 10151, + 11838, [ { "AllocSegment": { @@ -28109,7 +31652,7 @@ ] ], [ - 10171, + 11860, [ { "AllocSegment": { @@ -28122,7 +31665,7 @@ ] ], [ - 10185, + 11875, [ { "AllocSegment": { @@ -28135,14 +31678,14 @@ ] ], [ - 10199, + 11890, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -9 + "offset": -12 } } } @@ -28150,7 +31693,7 @@ ] ], [ - 10202, + 11894, [ { "AllocSegment": { @@ -28163,7 +31706,7 @@ ] ], [ - 10242, + 11938, [ { "AllocSegment": { @@ -28176,7 +31719,7 @@ ] ], [ - 10256, + 11952, [ { "AllocSegment": { @@ -28189,7 +31732,7 @@ ] ], [ - 10298, + 11999, [ { "AllocSegment": { @@ -28202,7 +31745,7 @@ ] ], [ - 10337, + 12039, [ { "AllocSegment": { @@ -28215,7 +31758,7 @@ ] ], [ - 10397, + 12102, [ { "SystemCall": { @@ -28230,7 +31773,7 @@ ] ], [ - 10407, + 12123, [ { "AllocSegment": { @@ -28243,14 +31786,14 @@ ] ], [ - 10438, + 12155, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -6 + "offset": -8 } } } @@ -28258,7 +31801,7 @@ ] ], [ - 10441, + 12169, [ { "AllocSegment": { @@ -28271,14 +31814,14 @@ ] ], [ - 10488, + 12219, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -9 + "offset": -12 } } } @@ -28286,14 +31829,14 @@ ] ], [ - 10503, + 12236, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } } } @@ -28301,7 +31844,7 @@ ] ], [ - 10549, + 12330, [ { "AllocSegment": { @@ -28314,7 +31857,7 @@ ] ], [ - 10605, + 12388, [ { "AllocSegment": { @@ -28327,7 +31870,7 @@ ] ], [ - 10636, + 12443, [ { "AllocSegment": { @@ -28340,7 +31883,7 @@ ] ], [ - 10661, + 12489, [ { "AllocSegment": { @@ -28353,7 +31896,7 @@ ] ], [ - 10676, + 12514, [ { "AllocSegment": { @@ -28366,7 +31909,7 @@ ] ], [ - 10717, + 12566, [ { "SystemCall": { @@ -28381,7 +31924,7 @@ ] ], [ - 10729, + 12579, [ { "AllocSegment": { @@ -28394,14 +31937,14 @@ ] ], [ - 10759, + 12611, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -6 + "offset": -8 } } } @@ -28409,7 +31952,7 @@ ] ], [ - 10764, + 12617, [ { "AllocSegment": { @@ -28422,14 +31965,14 @@ ] ], [ - 10810, + 12667, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -9 + "offset": -12 } } } @@ -28437,14 +31980,14 @@ ] ], [ - 10825, + 12684, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } } } @@ -28452,7 +31995,7 @@ ] ], [ - 10873, + 12744, [ { "AllocSegment": { @@ -28465,14 +32008,14 @@ ] ], [ - 10903, + 12775, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -12 + "offset": -17 } } } @@ -28480,7 +32023,7 @@ ] ], [ - 10953, + 12826, [ { "AllocSegment": { @@ -28493,7 +32036,7 @@ ] ], [ - 10991, + 12869, [ { "AllocSegment": { @@ -28506,7 +32049,7 @@ ] ], [ - 11018, + 12899, [ { "AllocSegment": { @@ -28519,7 +32062,7 @@ ] ], [ - 11034, + 12916, [ { "AllocSegment": { @@ -28532,12 +32075,12 @@ ] ], [ - 11059, + 12944, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x3700" + "Immediate": "0x3a84" }, "rhs": { "Deref": { @@ -28554,7 +32097,7 @@ ] ], [ - 11073, + 12959, [ { "TestLessThan": { @@ -28576,14 +32119,14 @@ ] ], [ - 11112, + 13004, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -9 + "offset": -12 } }, "rhs": { @@ -28598,7 +32141,7 @@ ] ], [ - 11116, + 13008, [ { "LinearSplit": { @@ -28627,14 +32170,14 @@ ] ], [ - 11126, + 13018, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -10 + "offset": -13 } }, "scalar": { @@ -28656,7 +32199,7 @@ ] ], [ - 11144, + 13037, [ { "SystemCall": { @@ -28671,7 +32214,7 @@ ] ], [ - 11162, + 13058, [ { "AllocSegment": { @@ -28684,14 +32227,14 @@ ] ], [ - 11181, + 13080, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -10 + "offset": -14 } }, "rhs": { @@ -28706,7 +32249,7 @@ ] ], [ - 11185, + 13084, [ { "LinearSplit": { @@ -28735,14 +32278,14 @@ ] ], [ - 11195, + 13094, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -11 + "offset": -15 } }, "scalar": { @@ -28764,7 +32307,7 @@ ] ], [ - 11213, + 13113, [ { "SystemCall": { @@ -28779,7 +32322,7 @@ ] ], [ - 11231, + 13134, [ { "AllocSegment": { @@ -28792,7 +32335,7 @@ ] ], [ - 11262, + 13170, [ { "AllocSegment": { @@ -28805,7 +32348,7 @@ ] ], [ - 11286, + 13195, [ { "AllocSegment": { @@ -28818,7 +32361,7 @@ ] ], [ - 11300, + 13210, [ { "AllocSegment": { @@ -28831,7 +32374,7 @@ ] ], [ - 11314, + 13225, [ { "AllocSegment": { @@ -28844,7 +32387,7 @@ ] ], [ - 11328, + 13240, [ { "AllocSegment": { @@ -28857,7 +32400,7 @@ ] ], [ - 11343, + 13256, [ { "AllocSegment": { @@ -28870,12 +32413,12 @@ ] ], [ - 11358, + 13271, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x42e" + "Immediate": "0x492" }, "rhs": { "Deref": { @@ -28892,7 +32435,7 @@ ] ], [ - 11372, + 13286, [ { "AllocSegment": { @@ -28905,7 +32448,7 @@ ] ], [ - 11392, + 13307, [ { "AllocSegment": { @@ -28918,12 +32461,12 @@ ] ], [ - 11406, + 13321, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x42e" + "Immediate": "0x492" }, "rhs": { "Deref": { @@ -28940,7 +32483,7 @@ ] ], [ - 11436, + 13353, [ { "AllocSegment": { @@ -28953,7 +32496,7 @@ ] ], [ - 11455, + 13372, [ { "TestLessThan": { @@ -28975,7 +32518,7 @@ ] ], [ - 11459, + 13376, [ { "LinearSplit": { @@ -29004,7 +32547,7 @@ ] ], [ - 11470, + 13387, [ { "LinearSplit": { @@ -29033,7 +32576,7 @@ ] ], [ - 11496, + 13413, [ { "SystemCall": { @@ -29048,7 +32591,7 @@ ] ], [ - 11511, + 13429, [ { "SystemCall": { @@ -29069,7 +32612,7 @@ ] ], [ - 11519, + 13438, [ { "TestLessThan": { @@ -29091,7 +32634,7 @@ ] ], [ - 11523, + 13442, [ { "LinearSplit": { @@ -29120,7 +32663,7 @@ ] ], [ - 11534, + 13453, [ { "LinearSplit": { @@ -29149,7 +32692,7 @@ ] ], [ - 11564, + 13483, [ { "SystemCall": { @@ -29170,7 +32713,7 @@ ] ], [ - 11580, + 13500, [ { "SystemCall": { @@ -29191,7 +32734,7 @@ ] ], [ - 11650, + 13593, [ { "TestLessThan": { @@ -29213,7 +32756,7 @@ ] ], [ - 11654, + 13597, [ { "LinearSplit": { @@ -29242,7 +32785,7 @@ ] ], [ - 11665, + 13608, [ { "LinearSplit": { @@ -29271,7 +32814,7 @@ ] ], [ - 11691, + 13634, [ { "SystemCall": { @@ -29286,7 +32829,7 @@ ] ], [ - 11706, + 13650, [ { "SystemCall": { @@ -29307,14 +32850,14 @@ ] ], [ - 11713, + 13658, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -6 + "offset": -7 } }, "rhs": { @@ -29329,14 +32872,14 @@ ] ], [ - 11715, + 13660, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -7 + "offset": -8 } }, "rhs": { @@ -29355,14 +32898,14 @@ ] ], [ - 11736, + 13682, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } }, "rhs": { @@ -29377,14 +32920,14 @@ ] ], [ - 11738, + 13684, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -3 + "offset": -5 } }, "rhs": { @@ -29403,7 +32946,7 @@ ] ], [ - 11768, + 13714, [ { "TestLessThan": { @@ -29425,7 +32968,7 @@ ] ], [ - 11772, + 13718, [ { "LinearSplit": { @@ -29454,7 +32997,7 @@ ] ], [ - 11783, + 13729, [ { "LinearSplit": { @@ -29483,14 +33026,14 @@ ] ], [ - 11814, + 13761, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -20 + "offset": -23 } } } @@ -29498,7 +33041,7 @@ ] ], [ - 11829, + 13777, [ { "SystemCall": { @@ -29507,7 +33050,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -25 + "offset": -29 }, "b": { "Immediate": "0x7" @@ -29519,7 +33062,7 @@ ] ], [ - 11873, + 13838, [ { "AllocSegment": { @@ -29532,7 +33075,7 @@ ] ], [ - 11892, + 13869, [ { "AllocSegment": { @@ -29545,7 +33088,7 @@ ] ], [ - 11974, + 13988, [ { "RandomEcPoint": { @@ -29573,7 +33116,7 @@ ] ], [ - 12038, + 14061, [ { "RandomEcPoint": { @@ -29601,7 +33144,7 @@ ] ], [ - 12108, + 14135, [ { "AllocSegment": { @@ -29614,7 +33157,7 @@ ] ], [ - 12133, + 14162, [ { "SystemCall": { @@ -29629,7 +33172,7 @@ ] ], [ - 12150, + 14180, [ { "SystemCall": { @@ -29650,7 +33193,7 @@ ] ], [ - 12190, + 14233, [ { "AllocSegment": { @@ -29663,7 +33206,7 @@ ] ], [ - 12206, + 14257, [ { "AllocSegment": { @@ -29676,7 +33219,7 @@ ] ], [ - 12224, + 14275, [ { "SystemCall": { @@ -29691,7 +33234,7 @@ ] ], [ - 12234, + 14286, [ { "TestLessThan": { @@ -29713,7 +33256,7 @@ ] ], [ - 12238, + 14290, [ { "LinearSplit": { @@ -29742,7 +33285,7 @@ ] ], [ - 12249, + 14301, [ { "LinearSplit": { @@ -29771,7 +33314,7 @@ ] ], [ - 12293, + 14345, [ { "SystemCall": { @@ -29792,7 +33335,7 @@ ] ], [ - 12308, + 14361, [ { "SystemCall": { @@ -29813,14 +33356,14 @@ ] ], [ - 12324, + 14379, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -3 + "offset": -4 } }, "rhs": { @@ -29838,7 +33381,7 @@ ] ], [ - 12340, + 14395, [ { "TestLessThan": { @@ -29860,7 +33403,7 @@ ] ], [ - 12344, + 14399, [ { "LinearSplit": { @@ -29889,7 +33432,7 @@ ] ], [ - 12355, + 14410, [ { "LinearSplit": { @@ -29918,14 +33461,14 @@ ] ], [ - 12384, + 14440, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -25 + "offset": -28 } } } @@ -29933,7 +33476,7 @@ ] ], [ - 12400, + 14457, [ { "SystemCall": { @@ -29942,7 +33485,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -31 + "offset": -35 }, "b": { "Immediate": "0x7" @@ -29954,7 +33497,7 @@ ] ], [ - 12442, + 14512, [ { "AllocSegment": { @@ -29967,7 +33510,7 @@ ] ], [ - 12460, + 14538, [ { "AllocSegment": { @@ -29980,7 +33523,7 @@ ] ], [ - 12561, + 14683, [ { "AllocSegment": { @@ -29993,14 +33536,14 @@ ] ], [ - 12627, + 14751, [ { "EvalCircuit": { "n_add_mods": { "Deref": { "register": "AP", - "offset": -6 + "offset": -7 } }, "add_mod_builtin": { @@ -30012,7 +33555,7 @@ "n_mul_mods": { "Deref": { "register": "AP", - "offset": -4 + "offset": -5 } }, "mul_mod_builtin": { @@ -30026,7 +33569,7 @@ ] ], [ - 12684, + 14817, [ { "AllocSegment": { @@ -30039,7 +33582,7 @@ ] ], [ - 12740, + 14877, [ { "AllocSegment": { @@ -30052,7 +33595,7 @@ ] ], [ - 12833, + 14978, [ { "AllocSegment": { @@ -30065,7 +33608,7 @@ ] ], [ - 12854, + 14999, [ { "AllocSegment": { @@ -30078,7 +33621,7 @@ ] ], [ - 12925, + 15094, [ { "AllocSegment": { @@ -30091,7 +33634,7 @@ ] ], [ - 12941, + 15124, [ { "AllocSegment": { @@ -30104,7 +33647,7 @@ ] ], [ - 12995, + 15178, [ { "SystemCall": { @@ -30119,7 +33662,7 @@ ] ], [ - 13008, + 15197, [ { "SystemCall": { @@ -30140,7 +33683,41 @@ ] ], [ - 13013, + 15210, + [ + { + "SystemCall": { + "system": { + "BinOp": { + "op": "Add", + "a": { + "register": "FP", + "offset": -7 + }, + "b": { + "Immediate": "0xd" + } + } + } + } + } + ] + ], + [ + 15216, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 15289, [ { "AllocSegment": { @@ -30153,7 +33730,7 @@ ] ], [ - 13076, + 15321, [ { "AllocSegment": { @@ -30166,14 +33743,14 @@ ] ], [ - 13098, + 15351, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -13 + "offset": -23 } } } @@ -30181,7 +33758,7 @@ ] ], [ - 13113, + 15367, [ { "SystemCall": { @@ -30190,7 +33767,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -19 + "offset": -30 }, "b": { "Immediate": "0x6" @@ -30202,7 +33779,35 @@ ] ], [ - 13136, + 15392, + [ + { + "SystemCall": { + "system": { + "Deref": { + "register": "AP", + "offset": -8 + } + } + } + } + ] + ], + [ + 15416, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 15443, [ { "AllocSegment": { @@ -30215,7 +33820,7 @@ ] ], [ - 13151, + 15459, [ { "AllocSegment": { @@ -30228,7 +33833,7 @@ ] ], [ - 13186, + 15499, [ { "AllocSegment": { @@ -30241,7 +33846,7 @@ ] ], [ - 13201, + 15515, [ { "AllocSegment": { @@ -30254,7 +33859,7 @@ ] ], [ - 13216, + 15531, [ { "AllocSegment": { @@ -30267,7 +33872,7 @@ ] ], [ - 13231, + 15547, [ { "AllocSegment": { @@ -30280,7 +33885,20 @@ ] ], [ - 13276, + 15563, + [ + { + "AllocSegment": { + "dst": { + "register": "AP", + "offset": 0 + } + } + } + ] + ], + [ + 15623, [ { "TestLessThan": { @@ -30308,7 +33926,7 @@ ] ], [ - 13280, + 15627, [ { "LinearSplit": { @@ -30337,7 +33955,7 @@ ] ], [ - 13302, + 15649, [ { "TestLessThanOrEqual": { @@ -30362,7 +33980,7 @@ ] ], [ - 13316, + 15663, [ { "TestLessThan": { @@ -30384,7 +34002,7 @@ ] ], [ - 13326, + 15673, [ { "TestLessThanOrEqual": { @@ -30409,7 +34027,7 @@ ] ], [ - 13349, + 15696, [ { "AllocSegment": { @@ -30422,7 +34040,7 @@ ] ], [ - 13370, + 15717, [ { "AllocSegment": { @@ -30435,7 +34053,7 @@ ] ], [ - 13391, + 15738, [ { "AllocSegment": { @@ -30448,12 +34066,12 @@ ] ], [ - 13439, + 15786, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x1cfc" + "Immediate": "0x1dc4" }, "rhs": { "Deref": { @@ -30470,7 +34088,7 @@ ] ], [ - 13499, + 15850, [ { "AllocSegment": { @@ -30483,12 +34101,12 @@ ] ], [ - 13519, + 15870, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0xb36" + "Immediate": "0xcc6" }, "rhs": { "Deref": { @@ -30505,7 +34123,7 @@ ] ], [ - 13585, + 15942, [ { "AllocSegment": { @@ -30518,7 +34136,7 @@ ] ], [ - 13615, + 15974, [ { "AllocSegment": { @@ -30531,12 +34149,12 @@ ] ], [ - 13635, + 15994, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0xf1e" + "Immediate": "0x1176" }, "rhs": { "Deref": { @@ -30553,7 +34171,7 @@ ] ], [ - 13723, + 16095, [ { "AllocSegment": { @@ -30566,7 +34184,7 @@ ] ], [ - 13753, + 16127, [ { "AllocSegment": { @@ -30579,12 +34197,12 @@ ] ], [ - 13773, + 16147, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x22ce" + "Immediate": "0x23fa" }, "rhs": { "Deref": { @@ -30601,7 +34219,7 @@ ] ], [ - 13844, + 16224, [ { "AllocSegment": { @@ -30614,7 +34232,7 @@ ] ], [ - 13865, + 16245, [ { "DivMod": { @@ -30643,7 +34261,7 @@ ] ], [ - 13926, + 16315, [ { "AllocSegment": { @@ -30656,7 +34274,7 @@ ] ], [ - 13979, + 16382, [ { "AllocSegment": { @@ -30669,7 +34287,7 @@ ] ], [ - 13992, + 16396, [ { "DivMod": { @@ -30698,7 +34316,7 @@ ] ], [ - 14000, + 16405, [ { "TestLessThan": { @@ -30707,12 +34325,12 @@ "op": "Add", "a": { "register": "AP", - "offset": -6 + "offset": -7 }, "b": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } } } @@ -30729,7 +34347,7 @@ ] ], [ - 14028, + 16435, [ { "TestLessThan": { @@ -30751,7 +34369,7 @@ ] ], [ - 14045, + 16452, [ { "AllocSegment": { @@ -30764,7 +34382,7 @@ ] ], [ - 14061, + 16471, [ { "TestLessThan": { @@ -30773,12 +34391,12 @@ "op": "Add", "a": { "register": "AP", - "offset": -1 + "offset": -2 }, "b": { "Deref": { "register": "AP", - "offset": -3 + "offset": -4 } } } @@ -30795,7 +34413,7 @@ ] ], [ - 14083, + 16494, [ { "AllocSegment": { @@ -30808,7 +34426,7 @@ ] ], [ - 14097, + 16508, [ { "AllocSegment": { @@ -30821,7 +34439,7 @@ ] ], [ - 14161, + 16573, [ { "DivMod": { @@ -30850,7 +34468,7 @@ ] ], [ - 14170, + 16582, [ { "TestLessThan": { @@ -30872,7 +34490,7 @@ ] ], [ - 14180, + 16592, [ { "TestLessThan": { @@ -30903,7 +34521,7 @@ ] ], [ - 14201, + 16613, [ { "TestLessThan": { @@ -30934,7 +34552,7 @@ ] ], [ - 14215, + 16627, [ { "DivMod": { @@ -30963,7 +34581,7 @@ ] ], [ - 14232, + 16644, [ { "TestLessThan": { @@ -30985,7 +34603,7 @@ ] ], [ - 14244, + 16656, [ { "TestLessThan": { @@ -31007,7 +34625,7 @@ ] ], [ - 14254, + 16666, [ { "TestLessThan": { @@ -31038,7 +34656,7 @@ ] ], [ - 14277, + 16689, [ { "AllocSegment": { @@ -31051,7 +34669,7 @@ ] ], [ - 14292, + 16704, [ { "AllocSegment": { @@ -31064,7 +34682,7 @@ ] ], [ - 14307, + 16719, [ { "AllocSegment": { @@ -31077,7 +34695,7 @@ ] ], [ - 14322, + 16734, [ { "AllocSegment": { @@ -31090,7 +34708,7 @@ ] ], [ - 14337, + 16749, [ { "AllocSegment": { @@ -31103,7 +34721,7 @@ ] ], [ - 14352, + 16764, [ { "AllocSegment": { @@ -31116,12 +34734,12 @@ ] ], [ - 14365, + 16777, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x32f0" + "Immediate": "0x3480" }, "rhs": { "Deref": { @@ -31138,7 +34756,7 @@ ] ], [ - 14375, + 16788, [ { "TestLessThanOrEqualAddress": { @@ -31169,7 +34787,7 @@ ] ], [ - 14412, + 16828, [ { "SystemCall": { @@ -31184,7 +34802,7 @@ ] ], [ - 14445, + 16865, [ { "AllocSegment": { @@ -31197,7 +34815,7 @@ ] ], [ - 14474, + 16909, [ { "TestLessThan": { @@ -31219,7 +34837,7 @@ ] ], [ - 14496, + 16944, [ { "TestLessThan": { @@ -31241,7 +34859,7 @@ ] ], [ - 14534, + 17012, [ { "TestLessThan": { @@ -31263,7 +34881,7 @@ ] ], [ - 14556, + 17047, [ { "TestLessThan": { @@ -31285,7 +34903,7 @@ ] ], [ - 14640, + 17156, [ { "AllocSegment": { @@ -31298,7 +34916,7 @@ ] ], [ - 14678, + 17212, [ { "TestLessThan": { @@ -31320,7 +34938,7 @@ ] ], [ - 14702, + 17240, [ { "TestLessThan": { @@ -31342,7 +34960,7 @@ ] ], [ - 14740, + 17291, [ { "TestLessThan": { @@ -31364,7 +34982,7 @@ ] ], [ - 14766, + 17321, [ { "TestLessThan": { @@ -31386,7 +35004,7 @@ ] ], [ - 14803, + 17364, [ { "U256InvModN": { @@ -31405,13 +35023,13 @@ "n0": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "n1": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "g0_or_no_inv": { @@ -31443,7 +35061,7 @@ ] ], [ - 14821, + 17382, [ { "WideMul128": { @@ -31546,7 +35164,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -26 + "offset": -27 } }, "rhs": { @@ -31570,7 +35188,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -26 + "offset": -27 } }, "rhs": { @@ -31594,7 +35212,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -25 + "offset": -26 } }, "rhs": { @@ -31618,7 +35236,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -25 + "offset": -26 } }, "rhs": { @@ -31640,7 +35258,7 @@ ] ], [ - 14874, + 17435, [ { "WideMul128": { @@ -31686,14 +35304,14 @@ }, "low": { "register": "AP", - "offset": -9 + "offset": -10 } } } ] ], [ - 14878, + 17439, [ { "TestLessThan": { @@ -31715,7 +35333,7 @@ ] ], [ - 14892, + 17453, [ { "TestLessThan": { @@ -31737,14 +35355,14 @@ ] ], [ - 14905, + 17466, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -47 + "offset": -48 } }, "rhs": { @@ -31763,7 +35381,7 @@ ] ], [ - 14915, + 17476, [ { "DivMod": { @@ -31789,7 +35407,7 @@ ] ], [ - 14926, + 17487, [ { "DivMod": { @@ -31815,14 +35433,14 @@ ] ], [ - 14935, + 17496, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -62 + "offset": -63 } }, "rhs": { @@ -31841,7 +35459,7 @@ ] ], [ - 14945, + 17506, [ { "DivMod": { @@ -31867,7 +35485,7 @@ ] ], [ - 14956, + 17517, [ { "DivMod": { @@ -31893,14 +35511,14 @@ ] ], [ - 14965, + 17526, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -78 + "offset": -79 } }, "rhs": { @@ -31919,7 +35537,7 @@ ] ], [ - 14975, + 17536, [ { "DivMod": { @@ -31945,7 +35563,7 @@ ] ], [ - 14986, + 17547, [ { "DivMod": { @@ -31971,14 +35589,14 @@ ] ], [ - 14995, + 17556, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -93 + "offset": -94 } }, "rhs": { @@ -31997,7 +35615,7 @@ ] ], [ - 15005, + 17566, [ { "DivMod": { @@ -32023,7 +35641,7 @@ ] ], [ - 15016, + 17577, [ { "DivMod": { @@ -32049,7 +35667,7 @@ ] ], [ - 15025, + 17586, [ { "DivMod": { @@ -32075,7 +35693,7 @@ ] ], [ - 15035, + 17596, [ { "DivMod": { @@ -32101,7 +35719,7 @@ ] ], [ - 15046, + 17607, [ { "DivMod": { @@ -32127,7 +35745,7 @@ ] ], [ - 15055, + 17616, [ { "DivMod": { @@ -32153,7 +35771,7 @@ ] ], [ - 15065, + 17626, [ { "DivMod": { @@ -32179,7 +35797,7 @@ ] ], [ - 15076, + 17637, [ { "DivMod": { @@ -32205,7 +35823,7 @@ ] ], [ - 15085, + 17646, [ { "DivMod": { @@ -32231,7 +35849,7 @@ ] ], [ - 15095, + 17656, [ { "DivMod": { @@ -32257,7 +35875,7 @@ ] ], [ - 15106, + 17667, [ { "DivMod": { @@ -32283,7 +35901,7 @@ ] ], [ - 15115, + 17676, [ { "DivMod": { @@ -32309,7 +35927,7 @@ ] ], [ - 15125, + 17686, [ { "DivMod": { @@ -32335,7 +35953,7 @@ ] ], [ - 15136, + 17697, [ { "DivMod": { @@ -32361,7 +35979,7 @@ ] ], [ - 15157, + 17718, [ { "Uint512DivModByUint256": { @@ -32430,7 +36048,7 @@ ] ], [ - 15175, + 17736, [ { "WideMul128": { @@ -32555,7 +36173,7 @@ ] ], [ - 15204, + 17765, [ { "TestLessThan": { @@ -32580,7 +36198,7 @@ ] ], [ - 15216, + 17777, [ { "TestLessThan": { @@ -32605,7 +36223,7 @@ ] ], [ - 15231, + 17792, [ { "DivMod": { @@ -32631,7 +36249,7 @@ ] ], [ - 15241, + 17802, [ { "DivMod": { @@ -32657,7 +36275,7 @@ ] ], [ - 15252, + 17813, [ { "DivMod": { @@ -32683,7 +36301,7 @@ ] ], [ - 15261, + 17822, [ { "DivMod": { @@ -32709,7 +36327,7 @@ ] ], [ - 15271, + 17832, [ { "DivMod": { @@ -32735,7 +36353,7 @@ ] ], [ - 15282, + 17843, [ { "DivMod": { @@ -32761,7 +36379,7 @@ ] ], [ - 15291, + 17852, [ { "DivMod": { @@ -32787,7 +36405,7 @@ ] ], [ - 15301, + 17862, [ { "DivMod": { @@ -32813,7 +36431,7 @@ ] ], [ - 15312, + 17873, [ { "DivMod": { @@ -32839,7 +36457,7 @@ ] ], [ - 15321, + 17882, [ { "DivMod": { @@ -32865,7 +36483,7 @@ ] ], [ - 15331, + 17892, [ { "DivMod": { @@ -32891,7 +36509,7 @@ ] ], [ - 15342, + 17903, [ { "DivMod": { @@ -32917,7 +36535,7 @@ ] ], [ - 15351, + 17912, [ { "DivMod": { @@ -32943,7 +36561,7 @@ ] ], [ - 15361, + 17922, [ { "DivMod": { @@ -32969,7 +36587,7 @@ ] ], [ - 15372, + 17933, [ { "DivMod": { @@ -32995,7 +36613,7 @@ ] ], [ - 15393, + 17954, [ { "Uint512DivModByUint256": { @@ -33064,7 +36682,7 @@ ] ], [ - 15411, + 17972, [ { "WideMul128": { @@ -33189,7 +36807,7 @@ ] ], [ - 15440, + 18001, [ { "TestLessThan": { @@ -33214,7 +36832,7 @@ ] ], [ - 15452, + 18013, [ { "TestLessThan": { @@ -33239,7 +36857,7 @@ ] ], [ - 15467, + 18028, [ { "DivMod": { @@ -33265,7 +36883,7 @@ ] ], [ - 15477, + 18038, [ { "DivMod": { @@ -33291,7 +36909,7 @@ ] ], [ - 15488, + 18049, [ { "DivMod": { @@ -33317,7 +36935,7 @@ ] ], [ - 15497, + 18058, [ { "DivMod": { @@ -33343,7 +36961,7 @@ ] ], [ - 15507, + 18068, [ { "DivMod": { @@ -33369,7 +36987,7 @@ ] ], [ - 15518, + 18079, [ { "DivMod": { @@ -33395,7 +37013,7 @@ ] ], [ - 15527, + 18088, [ { "DivMod": { @@ -33421,7 +37039,7 @@ ] ], [ - 15537, + 18098, [ { "DivMod": { @@ -33447,7 +37065,7 @@ ] ], [ - 15548, + 18109, [ { "DivMod": { @@ -33473,7 +37091,7 @@ ] ], [ - 15557, + 18118, [ { "DivMod": { @@ -33499,7 +37117,7 @@ ] ], [ - 15567, + 18128, [ { "DivMod": { @@ -33525,7 +37143,7 @@ ] ], [ - 15578, + 18139, [ { "DivMod": { @@ -33551,7 +37169,7 @@ ] ], [ - 15587, + 18148, [ { "DivMod": { @@ -33577,7 +37195,7 @@ ] ], [ - 15597, + 18158, [ { "DivMod": { @@ -33603,7 +37221,7 @@ ] ], [ - 15608, + 18169, [ { "DivMod": { @@ -33629,7 +37247,7 @@ ] ], [ - 15635, + 18197, [ { "SystemCall": { @@ -33644,14 +37262,14 @@ ] ], [ - 15652, + 18216, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -2 + "offset": -4 } } } @@ -33659,7 +37277,7 @@ ] ], [ - 15664, + 18229, [ { "SystemCall": { @@ -33668,7 +37286,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -6 + "offset": -9 }, "b": { "Immediate": "0x8" @@ -33680,7 +37298,7 @@ ] ], [ - 15675, + 18241, [ { "SystemCall": { @@ -33689,7 +37307,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -10 + "offset": -14 }, "b": { "Immediate": "0x10" @@ -33701,7 +37319,7 @@ ] ], [ - 15685, + 18252, [ { "SystemCall": { @@ -33710,7 +37328,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -14 + "offset": -19 }, "b": { "Immediate": "0x17" @@ -33722,7 +37340,7 @@ ] ], [ - 15770, + 18351, [ { "AllocSegment": { @@ -33735,14 +37353,14 @@ ] ], [ - 15799, + 18383, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -642 + "offset": -651 } }, "rhs": { @@ -33761,7 +37379,7 @@ ] ], [ - 15809, + 18393, [ { "DivMod": { @@ -33787,7 +37405,7 @@ ] ], [ - 15820, + 18404, [ { "DivMod": { @@ -33806,21 +37424,21 @@ }, "remainder": { "register": "AP", - "offset": -656 + "offset": -666 } } } ] ], [ - 15829, + 18413, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -657 + "offset": -666 } }, "rhs": { @@ -33839,7 +37457,7 @@ ] ], [ - 15839, + 18423, [ { "DivMod": { @@ -33865,7 +37483,7 @@ ] ], [ - 15850, + 18434, [ { "DivMod": { @@ -33891,7 +37509,7 @@ ] ], [ - 15859, + 18443, [ { "AllocSegment": { @@ -33904,7 +37522,7 @@ ] ], [ - 15929, + 18515, [ { "TestLessThan": { @@ -33935,7 +37553,7 @@ ] ], [ - 15944, + 18530, [ { "TestLessThan": { @@ -33957,7 +37575,7 @@ ] ], [ - 15963, + 18549, [ { "TestLessThan": { @@ -33979,7 +37597,7 @@ ] ], [ - 15982, + 18568, [ { "TestLessThan": { @@ -34001,7 +37619,7 @@ ] ], [ - 15992, + 18578, [ { "TestLessThan": { @@ -34023,7 +37641,7 @@ ] ], [ - 15994, + 18580, [ { "DivMod": { @@ -34049,7 +37667,7 @@ ] ], [ - 16031, + 18617, [ { "TestLessThan": { @@ -34071,7 +37689,7 @@ ] ], [ - 16046, + 18632, [ { "DivMod": { @@ -34100,7 +37718,7 @@ ] ], [ - 16052, + 18638, [ { "TestLessThan": { @@ -34122,7 +37740,7 @@ ] ], [ - 16066, + 18652, [ { "TestLessThan": { @@ -34144,7 +37762,7 @@ ] ], [ - 16080, + 18666, [ { "TestLessThan": { @@ -34166,7 +37784,7 @@ ] ], [ - 16091, + 18677, [ { "TestLessThan": { @@ -34188,7 +37806,7 @@ ] ], [ - 16120, + 18706, [ { "AllocSegment": { @@ -34201,7 +37819,7 @@ ] ], [ - 16145, + 18731, [ { "TestLessThan": { @@ -34223,7 +37841,7 @@ ] ], [ - 16149, + 18735, [ { "LinearSplit": { @@ -34252,7 +37870,7 @@ ] ], [ - 16159, + 18745, [ { "LinearSplit": { @@ -34281,7 +37899,7 @@ ] ], [ - 16179, + 18765, [ { "AllocSegment": { @@ -34294,7 +37912,7 @@ ] ], [ - 16200, + 18786, [ { "AllocSegment": { @@ -34307,7 +37925,7 @@ ] ], [ - 16221, + 18807, [ { "AllocSegment": { @@ -34320,7 +37938,7 @@ ] ], [ - 16241, + 18827, [ { "TestLessThan": { @@ -34342,7 +37960,7 @@ ] ], [ - 16243, + 18829, [ { "DivMod": { @@ -34368,7 +37986,7 @@ ] ], [ - 16283, + 18869, [ { "DivMod": { @@ -34397,7 +38015,7 @@ ] ], [ - 16289, + 18875, [ { "TestLessThan": { @@ -34419,7 +38037,7 @@ ] ], [ - 16303, + 18889, [ { "TestLessThan": { @@ -34441,7 +38059,7 @@ ] ], [ - 16321, + 18907, [ { "TestLessThan": { @@ -34463,7 +38081,7 @@ ] ], [ - 16334, + 18920, [ { "TestLessThan": { @@ -34485,7 +38103,7 @@ ] ], [ - 16345, + 18931, [ { "TestLessThan": { @@ -34507,7 +38125,7 @@ ] ], [ - 16374, + 18960, [ { "AllocSegment": { @@ -34520,7 +38138,7 @@ ] ], [ - 16399, + 18985, [ { "TestLessThan": { @@ -34542,7 +38160,7 @@ ] ], [ - 16403, + 18989, [ { "LinearSplit": { @@ -34571,7 +38189,7 @@ ] ], [ - 16413, + 18999, [ { "LinearSplit": { @@ -34600,7 +38218,7 @@ ] ], [ - 16433, + 19019, [ { "AllocSegment": { @@ -34613,7 +38231,7 @@ ] ], [ - 16454, + 19040, [ { "AllocSegment": { @@ -34626,7 +38244,7 @@ ] ], [ - 16475, + 19061, [ { "AllocSegment": { @@ -34639,7 +38257,7 @@ ] ], [ - 16504, + 19090, [ { "TestLessThan": { @@ -34661,7 +38279,7 @@ ] ], [ - 16506, + 19092, [ { "DivMod": { @@ -34687,7 +38305,7 @@ ] ], [ - 16543, + 19129, [ { "TestLessThan": { @@ -34709,7 +38327,7 @@ ] ], [ - 16554, + 19140, [ { "TestLessThan": { @@ -34731,7 +38349,7 @@ ] ], [ - 16565, + 19151, [ { "TestLessThan": { @@ -34753,7 +38371,7 @@ ] ], [ - 16594, + 19180, [ { "AllocSegment": { @@ -34766,7 +38384,7 @@ ] ], [ - 16619, + 19205, [ { "TestLessThan": { @@ -34788,7 +38406,7 @@ ] ], [ - 16623, + 19209, [ { "LinearSplit": { @@ -34817,7 +38435,7 @@ ] ], [ - 16633, + 19219, [ { "LinearSplit": { @@ -34846,7 +38464,7 @@ ] ], [ - 16659, + 19245, [ { "AllocSegment": { @@ -34859,7 +38477,7 @@ ] ], [ - 16680, + 19266, [ { "AllocSegment": { @@ -34872,7 +38490,7 @@ ] ], [ - 16702, + 19288, [ { "AllocSegment": { @@ -34885,7 +38503,7 @@ ] ], [ - 16724, + 19310, [ { "TestLessThan": { @@ -34907,7 +38525,7 @@ ] ], [ - 16735, + 19321, [ { "TestLessThan": { @@ -34929,7 +38547,7 @@ ] ], [ - 16764, + 19350, [ { "AllocSegment": { @@ -34942,7 +38560,7 @@ ] ], [ - 16789, + 19375, [ { "TestLessThan": { @@ -34964,7 +38582,7 @@ ] ], [ - 16793, + 19379, [ { "LinearSplit": { @@ -34993,7 +38611,7 @@ ] ], [ - 16803, + 19389, [ { "LinearSplit": { @@ -35022,7 +38640,7 @@ ] ], [ - 16826, + 19412, [ { "AllocSegment": { @@ -35035,7 +38653,7 @@ ] ], [ - 16877, + 19463, [ { "TestLessThan": { @@ -35057,7 +38675,7 @@ ] ], [ - 16888, + 19474, [ { "TestLessThan": { @@ -35079,7 +38697,7 @@ ] ], [ - 16917, + 19503, [ { "AllocSegment": { @@ -35092,7 +38710,7 @@ ] ], [ - 16940, + 19526, [ { "TestLessThan": { @@ -35123,7 +38741,7 @@ ] ], [ - 16964, + 19550, [ { "AllocSegment": { @@ -35136,7 +38754,7 @@ ] ], [ - 16998, + 19584, [ { "AllocSegment": { @@ -35149,12 +38767,12 @@ ] ], [ - 17015, + 19601, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x686" + "Immediate": "0x6ea" }, "rhs": { "Deref": { @@ -35171,7 +38789,7 @@ ] ], [ - 17052, + 19640, [ { "AllocSegment": { @@ -35184,7 +38802,7 @@ ] ], [ - 17097, + 19685, [ { "TestLessThan": { @@ -35212,7 +38830,7 @@ ] ], [ - 17101, + 19689, [ { "LinearSplit": { @@ -35241,7 +38859,7 @@ ] ], [ - 17143, + 19731, [ { "TestLessThan": { @@ -35263,7 +38881,7 @@ ] ], [ - 17145, + 19733, [ { "DivMod": { @@ -35289,7 +38907,7 @@ ] ], [ - 17232, + 19820, [ { "DivMod": { @@ -35318,7 +38936,7 @@ ] ], [ - 17238, + 19826, [ { "TestLessThan": { @@ -35340,7 +38958,7 @@ ] ], [ - 17249, + 19837, [ { "TestLessThan": { @@ -35362,7 +38980,7 @@ ] ], [ - 17259, + 19847, [ { "TestLessThan": { @@ -35384,7 +39002,7 @@ ] ], [ - 17273, + 19861, [ { "DivMod": { @@ -35413,7 +39031,7 @@ ] ], [ - 17279, + 19867, [ { "TestLessThan": { @@ -35435,7 +39053,7 @@ ] ], [ - 17293, + 19881, [ { "TestLessThan": { @@ -35457,7 +39075,7 @@ ] ], [ - 17303, + 19891, [ { "TestLessThan": { @@ -35479,7 +39097,7 @@ ] ], [ - 17325, + 19913, [ { "AllocSegment": { @@ -35492,7 +39110,7 @@ ] ], [ - 17339, + 19927, [ { "AllocSegment": { @@ -35505,7 +39123,7 @@ ] ], [ - 17357, + 19945, [ { "AllocSegment": { @@ -35518,7 +39136,7 @@ ] ], [ - 17371, + 19959, [ { "AllocSegment": { @@ -35531,12 +39149,12 @@ ] ], [ - 17387, + 19975, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x8c0" + "Immediate": "0x988" }, "rhs": { "Deref": { @@ -35553,7 +39171,7 @@ ] ], [ - 17414, + 20004, [ { "TestLessThan": { @@ -35575,7 +39193,7 @@ ] ], [ - 17431, + 20021, [ { "AllocSegment": { @@ -35588,7 +39206,7 @@ ] ], [ - 17456, + 20048, [ { "AllocSegment": { @@ -35601,7 +39219,7 @@ ] ], [ - 17716, + 20308, [ { "SystemCall": { @@ -35616,14 +39234,14 @@ ] ], [ - 17742, + 20336, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -6 + "offset": -8 } } } @@ -35631,7 +39249,7 @@ ] ], [ - 17756, + 20352, [ { "U256InvModN": { @@ -35650,13 +39268,13 @@ "n0": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "n1": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "g0_or_no_inv": { @@ -35688,7 +39306,7 @@ ] ], [ - 17774, + 20370, [ { "WideMul128": { @@ -35791,7 +39409,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -26 + "offset": -27 } }, "rhs": { @@ -35815,7 +39433,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -26 + "offset": -27 } }, "rhs": { @@ -35839,7 +39457,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -25 + "offset": -26 } }, "rhs": { @@ -35863,7 +39481,7 @@ "lhs": { "Deref": { "register": "AP", - "offset": -25 + "offset": -26 } }, "rhs": { @@ -35885,7 +39503,7 @@ ] ], [ - 17827, + 20423, [ { "WideMul128": { @@ -35931,14 +39549,14 @@ }, "low": { "register": "AP", - "offset": -9 + "offset": -10 } } } ] ], [ - 17831, + 20427, [ { "TestLessThan": { @@ -35960,7 +39578,7 @@ ] ], [ - 17845, + 20441, [ { "TestLessThan": { @@ -35982,14 +39600,14 @@ ] ], [ - 17858, + 20454, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -47 + "offset": -48 } }, "rhs": { @@ -36008,7 +39626,7 @@ ] ], [ - 17868, + 20464, [ { "DivMod": { @@ -36034,7 +39652,7 @@ ] ], [ - 17879, + 20475, [ { "DivMod": { @@ -36060,14 +39678,14 @@ ] ], [ - 17888, + 20484, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -62 + "offset": -63 } }, "rhs": { @@ -36086,7 +39704,7 @@ ] ], [ - 17898, + 20494, [ { "DivMod": { @@ -36112,7 +39730,7 @@ ] ], [ - 17909, + 20505, [ { "DivMod": { @@ -36138,14 +39756,14 @@ ] ], [ - 17918, + 20514, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -78 + "offset": -79 } }, "rhs": { @@ -36164,7 +39782,7 @@ ] ], [ - 17928, + 20524, [ { "DivMod": { @@ -36190,7 +39808,7 @@ ] ], [ - 17939, + 20535, [ { "DivMod": { @@ -36216,14 +39834,14 @@ ] ], [ - 17948, + 20544, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -93 + "offset": -94 } }, "rhs": { @@ -36242,7 +39860,7 @@ ] ], [ - 17958, + 20554, [ { "DivMod": { @@ -36268,7 +39886,7 @@ ] ], [ - 17969, + 20565, [ { "DivMod": { @@ -36294,7 +39912,7 @@ ] ], [ - 17978, + 20574, [ { "DivMod": { @@ -36320,7 +39938,7 @@ ] ], [ - 17988, + 20584, [ { "DivMod": { @@ -36346,7 +39964,7 @@ ] ], [ - 17999, + 20595, [ { "DivMod": { @@ -36372,7 +39990,7 @@ ] ], [ - 18008, + 20604, [ { "DivMod": { @@ -36398,7 +40016,7 @@ ] ], [ - 18018, + 20614, [ { "DivMod": { @@ -36424,7 +40042,7 @@ ] ], [ - 18029, + 20625, [ { "DivMod": { @@ -36450,7 +40068,7 @@ ] ], [ - 18038, + 20634, [ { "DivMod": { @@ -36476,7 +40094,7 @@ ] ], [ - 18048, + 20644, [ { "DivMod": { @@ -36502,7 +40120,7 @@ ] ], [ - 18059, + 20655, [ { "DivMod": { @@ -36528,7 +40146,7 @@ ] ], [ - 18068, + 20664, [ { "DivMod": { @@ -36554,7 +40172,7 @@ ] ], [ - 18078, + 20674, [ { "DivMod": { @@ -36580,7 +40198,7 @@ ] ], [ - 18089, + 20685, [ { "DivMod": { @@ -36606,7 +40224,7 @@ ] ], [ - 18110, + 20706, [ { "Uint512DivModByUint256": { @@ -36675,7 +40293,7 @@ ] ], [ - 18128, + 20724, [ { "WideMul128": { @@ -36800,7 +40418,7 @@ ] ], [ - 18157, + 20753, [ { "TestLessThan": { @@ -36825,7 +40443,7 @@ ] ], [ - 18169, + 20765, [ { "TestLessThan": { @@ -36850,7 +40468,7 @@ ] ], [ - 18184, + 20780, [ { "DivMod": { @@ -36876,7 +40494,7 @@ ] ], [ - 18194, + 20790, [ { "DivMod": { @@ -36902,7 +40520,7 @@ ] ], [ - 18205, + 20801, [ { "DivMod": { @@ -36928,7 +40546,7 @@ ] ], [ - 18214, + 20810, [ { "DivMod": { @@ -36954,7 +40572,7 @@ ] ], [ - 18224, + 20820, [ { "DivMod": { @@ -36980,7 +40598,7 @@ ] ], [ - 18235, + 20831, [ { "DivMod": { @@ -37006,7 +40624,7 @@ ] ], [ - 18244, + 20840, [ { "DivMod": { @@ -37032,7 +40650,7 @@ ] ], [ - 18254, + 20850, [ { "DivMod": { @@ -37058,7 +40676,7 @@ ] ], [ - 18265, + 20861, [ { "DivMod": { @@ -37084,7 +40702,7 @@ ] ], [ - 18274, + 20870, [ { "DivMod": { @@ -37110,7 +40728,7 @@ ] ], [ - 18284, + 20880, [ { "DivMod": { @@ -37136,7 +40754,7 @@ ] ], [ - 18295, + 20891, [ { "DivMod": { @@ -37162,7 +40780,7 @@ ] ], [ - 18304, + 20900, [ { "DivMod": { @@ -37188,7 +40806,7 @@ ] ], [ - 18314, + 20910, [ { "DivMod": { @@ -37214,7 +40832,7 @@ ] ], [ - 18325, + 20921, [ { "DivMod": { @@ -37240,7 +40858,7 @@ ] ], [ - 18337, + 20934, [ { "TestLessThan": { @@ -37262,7 +40880,7 @@ ] ], [ - 18362, + 20962, [ { "TestLessThan": { @@ -37284,7 +40902,7 @@ ] ], [ - 18381, + 20984, [ { "TestLessThan": { @@ -37306,7 +40924,7 @@ ] ], [ - 18406, + 21010, [ { "Uint512DivModByUint256": { @@ -37375,7 +40993,7 @@ ] ], [ - 18424, + 21028, [ { "WideMul128": { @@ -37500,7 +41118,7 @@ ] ], [ - 18453, + 21057, [ { "TestLessThan": { @@ -37525,7 +41143,7 @@ ] ], [ - 18465, + 21069, [ { "TestLessThan": { @@ -37550,7 +41168,7 @@ ] ], [ - 18480, + 21084, [ { "DivMod": { @@ -37576,7 +41194,7 @@ ] ], [ - 18490, + 21094, [ { "DivMod": { @@ -37602,7 +41220,7 @@ ] ], [ - 18501, + 21105, [ { "DivMod": { @@ -37628,7 +41246,7 @@ ] ], [ - 18510, + 21114, [ { "DivMod": { @@ -37654,7 +41272,7 @@ ] ], [ - 18520, + 21124, [ { "DivMod": { @@ -37680,7 +41298,7 @@ ] ], [ - 18531, + 21135, [ { "DivMod": { @@ -37706,7 +41324,7 @@ ] ], [ - 18540, + 21144, [ { "DivMod": { @@ -37732,7 +41350,7 @@ ] ], [ - 18550, + 21154, [ { "DivMod": { @@ -37758,7 +41376,7 @@ ] ], [ - 18561, + 21165, [ { "DivMod": { @@ -37784,7 +41402,7 @@ ] ], [ - 18570, + 21174, [ { "DivMod": { @@ -37810,7 +41428,7 @@ ] ], [ - 18580, + 21184, [ { "DivMod": { @@ -37836,7 +41454,7 @@ ] ], [ - 18591, + 21195, [ { "DivMod": { @@ -37862,7 +41480,7 @@ ] ], [ - 18600, + 21204, [ { "DivMod": { @@ -37888,7 +41506,7 @@ ] ], [ - 18610, + 21214, [ { "DivMod": { @@ -37914,7 +41532,7 @@ ] ], [ - 18621, + 21225, [ { "DivMod": { @@ -37940,14 +41558,14 @@ ] ], [ - 18641, + 21246, [ { "SystemCall": { "system": { "Deref": { "register": "AP", - "offset": -666 + "offset": -673 } } } @@ -37955,7 +41573,7 @@ ] ], [ - 18653, + 21259, [ { "SystemCall": { @@ -37964,7 +41582,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -670 + "offset": -678 }, "b": { "Immediate": "0x8" @@ -37976,7 +41594,7 @@ ] ], [ - 18664, + 21271, [ { "SystemCall": { @@ -37985,7 +41603,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -674 + "offset": -683 }, "b": { "Immediate": "0x10" @@ -37997,7 +41615,7 @@ ] ], [ - 18717, + 21334, [ { "AllocSegment": { @@ -38010,14 +41628,14 @@ ] ], [ - 18733, + 21350, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -640 + "offset": -648 } }, "rhs": { @@ -38036,7 +41654,7 @@ ] ], [ - 18743, + 21360, [ { "DivMod": { @@ -38062,7 +41680,7 @@ ] ], [ - 18754, + 21371, [ { "DivMod": { @@ -38081,21 +41699,21 @@ }, "remainder": { "register": "AP", - "offset": -654 + "offset": -663 } } } ] ], [ - 18763, + 21380, [ { "DivMod": { "lhs": { "Deref": { "register": "AP", - "offset": -655 + "offset": -663 } }, "rhs": { @@ -38114,7 +41732,7 @@ ] ], [ - 18773, + 21390, [ { "DivMod": { @@ -38140,7 +41758,7 @@ ] ], [ - 18784, + 21401, [ { "DivMod": { @@ -38166,7 +41784,7 @@ ] ], [ - 18793, + 21410, [ { "AllocSegment": { @@ -38179,7 +41797,7 @@ ] ], [ - 18810, + 21428, [ { "AllocSegment": { @@ -38192,7 +41810,7 @@ ] ], [ - 18867, + 21491, [ { "SystemCall": { @@ -38207,7 +41825,7 @@ ] ], [ - 18874, + 21499, [ { "AllocConstantSize": { @@ -38223,7 +41841,7 @@ ] ], [ - 18878, + 21503, [ { "AllocSegment": { @@ -38236,7 +41854,7 @@ ] ], [ - 18913, + 21539, [ { "SystemCall": { @@ -38251,7 +41869,7 @@ ] ], [ - 18986, + 21613, [ { "DivMod": { @@ -38280,7 +41898,7 @@ ] ], [ - 18992, + 21619, [ { "TestLessThan": { @@ -38302,7 +41920,7 @@ ] ], [ - 19059, + 21728, [ { "WideMul128": { @@ -38331,7 +41949,7 @@ ] ], [ - 19061, + 21730, [ { "DivMod": { @@ -38357,7 +41975,7 @@ ] ], [ - 19071, + 21740, [ { "DivMod": { @@ -38383,7 +42001,7 @@ ] ], [ - 19082, + 21751, [ { "DivMod": { @@ -38409,7 +42027,7 @@ ] ], [ - 19091, + 21760, [ { "WideMul128": { @@ -38438,7 +42056,7 @@ ] ], [ - 19093, + 21762, [ { "DivMod": { @@ -38464,7 +42082,7 @@ ] ], [ - 19103, + 21772, [ { "DivMod": { @@ -38490,7 +42108,7 @@ ] ], [ - 19114, + 21783, [ { "DivMod": { @@ -38516,7 +42134,7 @@ ] ], [ - 19124, + 21793, [ { "TestLessThan": { @@ -38538,7 +42156,7 @@ ] ], [ - 19146, + 21815, [ { "WideMul128": { @@ -38567,7 +42185,7 @@ ] ], [ - 19148, + 21817, [ { "DivMod": { @@ -38593,7 +42211,7 @@ ] ], [ - 19158, + 21827, [ { "DivMod": { @@ -38619,7 +42237,7 @@ ] ], [ - 19169, + 21838, [ { "DivMod": { @@ -38645,7 +42263,7 @@ ] ], [ - 19179, + 21848, [ { "TestLessThan": { @@ -38667,7 +42285,7 @@ ] ], [ - 19202, + 21871, [ { "TestLessThan": { @@ -38689,7 +42307,7 @@ ] ], [ - 19224, + 21893, [ { "WideMul128": { @@ -38718,7 +42336,7 @@ ] ], [ - 19226, + 21895, [ { "DivMod": { @@ -38744,7 +42362,7 @@ ] ], [ - 19236, + 21905, [ { "DivMod": { @@ -38770,7 +42388,7 @@ ] ], [ - 19247, + 21916, [ { "DivMod": { @@ -38796,7 +42414,7 @@ ] ], [ - 19257, + 21926, [ { "TestLessThan": { @@ -38818,7 +42436,7 @@ ] ], [ - 19281, + 21950, [ { "TestLessThan": { @@ -38840,7 +42458,7 @@ ] ], [ - 19306, + 21975, [ { "TestLessThan": { @@ -38862,7 +42480,7 @@ ] ], [ - 19330, + 21999, [ { "TestLessThan": { @@ -38884,7 +42502,7 @@ ] ], [ - 19448, + 22117, [ { "AllocSegment": { @@ -38897,7 +42515,7 @@ ] ], [ - 19471, + 22140, [ { "TestLessThanOrEqual": { @@ -38922,7 +42540,7 @@ ] ], [ - 19546, + 22230, [ { "AllocSegment": { @@ -38935,7 +42553,7 @@ ] ], [ - 19601, + 22285, [ { "DivMod": { @@ -38964,7 +42582,7 @@ ] ], [ - 19607, + 22291, [ { "TestLessThan": { @@ -38986,7 +42604,7 @@ ] ], [ - 19620, + 22304, [ { "TestLessThan": { @@ -39008,7 +42626,7 @@ ] ], [ - 19630, + 22314, [ { "TestLessThan": { @@ -39030,7 +42648,7 @@ ] ], [ - 19678, + 22362, [ { "DivMod": { @@ -39059,7 +42677,7 @@ ] ], [ - 19684, + 22368, [ { "TestLessThan": { @@ -39081,7 +42699,7 @@ ] ], [ - 19700, + 22384, [ { "TestLessThan": { @@ -39103,7 +42721,7 @@ ] ], [ - 19710, + 22394, [ { "TestLessThan": { @@ -39125,7 +42743,7 @@ ] ], [ - 19733, + 22417, [ { "AllocSegment": { @@ -39138,7 +42756,7 @@ ] ], [ - 19747, + 22431, [ { "AllocSegment": { @@ -39151,7 +42769,7 @@ ] ], [ - 19766, + 22450, [ { "AllocSegment": { @@ -39164,7 +42782,7 @@ ] ], [ - 19780, + 22464, [ { "AllocSegment": { @@ -39181,14 +42799,14 @@ "EXTERNAL": [ { "selector": "0x1143aa89c8e3ebf8ed14df2a3606c1cd2dd513fac8040b0f8ab441f5c52fe4", - "offset": 4812, + "offset": 5902, "builtins": [ "range_check" ] }, { "selector": "0x3541591104188daef4379e06e92ecce09094a3b381da2e654eb041d00566d8", - "offset": 6489, + "offset": 7694, "builtins": [ "range_check", "range_check96" @@ -39196,35 +42814,35 @@ }, { "selector": "0x3c118a68e16e12e97ed25cb4901c12f4d3162818669cc44c391d8049924c14", - "offset": 2107, + "offset": 3000, "builtins": [ "range_check" ] }, { "selector": "0x5562b3e932b4d139366854d5a2e578382e6a3b6572ac9943d55e7efbe43d00", - "offset": 4263, + "offset": 5316, "builtins": [ "range_check" ] }, { "selector": "0x600c98a299d72ef1e09a2e1503206fbc76081233172c65f7e2438ef0069d8d", - "offset": 4939, + "offset": 6037, "builtins": [ "range_check" ] }, { "selector": "0x62c83572d28cb834a3de3c1e94977a4191469a4a8c26d1d7bc55305e640ed5", - "offset": 4420, + "offset": 5483, "builtins": [ "range_check" ] }, { "selector": "0x679c22735055a10db4f275395763a3752a1e3a3043c192299ab6b574fba8d6", - "offset": 5968, + "offset": 7142, "builtins": [ "range_check", "ec_op" @@ -39232,7 +42850,7 @@ }, { "selector": "0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb", - "offset": 5370, + "offset": 6501, "builtins": [ "pedersen", "range_check", @@ -39241,28 +42859,28 @@ }, { "selector": "0xd47144c49bce05b6de6bce9d5ff0cc8da9420f8945453e20ef779cbea13ad4", - "offset": 229, + "offset": 249, "builtins": [ "range_check" ] }, { "selector": "0xe7510edcf6e9f1b70f7bd1f488767b50f0363422f3c563160ab77adf62467b", - "offset": 2878, + "offset": 3829, "builtins": [ "range_check" ] }, { "selector": "0xf818e4530ec36b83dfe702489b4df537308c3b798b0cc120e32c2056d68b7d", - "offset": 3838, + "offset": 4867, "builtins": [ "range_check" ] }, { "selector": "0x10d2fede95e3ec06a875a67219425c27c5bd734d57f1b221d729a2337b6b556", - "offset": 3251, + "offset": 4235, "builtins": [ "range_check", "segment_arena" @@ -39270,42 +42888,42 @@ }, { "selector": "0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6", - "offset": 6217, + "offset": 7405, "builtins": [ "range_check" ] }, { "selector": "0x1469798554697a4c50c64f933147bd163500204d4ae206eee1a9b9bf6c228de", - "offset": 3664, + "offset": 4681, "builtins": [ "range_check" ] }, { "selector": "0x14dae1999ae9ab799bc72def6dc6e90890cf8ac0d64525021b7e71d05cb13e8", - "offset": 1355, + "offset": 2186, "builtins": [ "range_check" ] }, { "selector": "0x169f135eddda5ab51886052d777a57f2ea9c162d713691b5e04a6d4ed71d47f", - "offset": 3362, + "offset": 4351, "builtins": [ "range_check" ] }, { "selector": "0x1995689b6aedab51ad67bc2ae0b0ee3fe1ffc433f96179953e6a6b7210b9e13", - "offset": 1665, + "offset": 2521, "builtins": [ "range_check" ] }, { "selector": "0x1ae1a515cf2d214b29bdf63a79ee2d490efd4dd1acc99d383a8e549c3cecb5d", - "offset": 6079, + "offset": 7259, "builtins": [ "pedersen", "range_check" @@ -39313,56 +42931,84 @@ }, { "selector": "0x1e4089d1f1349077b1970f9937c904e27c4582b49a60b6078946dba95bc3c08", - "offset": 1184, + "offset": 1284, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x227ac0f3ce8083231605cb10be915be2004456b618e44b56067e27fc6f8c84f", + "offset": 8235, "builtins": [ "range_check" ] }, { "selector": "0x23039bef544cff56442d9f61ae9b13cf9e36fcce009102c5b678aac93f37b36", - "offset": 1929, + "offset": 2807, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x25ff849c52d40a7f29c9849fbe0064575d61c84ddc0ef562bf05bc599abe0ae", + "offset": 1506, "builtins": [ "range_check" ] }, { "selector": "0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c", - "offset": 409, + "offset": 443, "builtins": [ "range_check" ] }, { "selector": "0x298e03955860424b6a946506da72353a645f653dc1879f6b55fd756f3d20a59", - "offset": 674, + "offset": 731, "builtins": [ "range_check" ] }, { "selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", - "offset": 3052, + "offset": 4018, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x2f8b66957adc4564548f3832947bf264a065874e087c21b9e7cf969e2874c0c", + "offset": 1631, "builtins": [ "range_check" ] }, { "selector": "0x30f842021fbf02caf80d09a113997c1e00a32870eee0c6136bed27acb348bea", - "offset": 5638, + "offset": 6786, + "builtins": [ + "range_check" + ] + }, + { + "selector": "0x311fb2a7f01403971aca6ae0a12b8ad0602e7a5ec48ad48951969942e99d788", + "offset": 1887, "builtins": [ "range_check" ] }, { "selector": "0x31401f504973a5e8e1bb41e9c592519e3aa0b8cf6bbfb9c91b532aab8db54b0", - "offset": 6612, + "offset": 7828, "builtins": [ "range_check" ] }, { "selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", - "offset": 5182, + "offset": 6301, "builtins": [ "pedersen", "range_check" @@ -39370,28 +43016,28 @@ }, { "selector": "0x32564d7e0fe091d49b4c20f4632191e4ed6986bf993849879abfef9465def25", - "offset": 4592, + "offset": 5668, "builtins": [ "range_check" ] }, { "selector": "0x3604cea1cdb094a73a31144f14a3e5861613c008e1e879939ebc4827d10cd50", - "offset": 2360, + "offset": 3269, "builtins": [ "range_check" ] }, { "selector": "0x382be990ca34815134e64a9ac28f41a907c62e5ad10547f97174362ab94dc89", - "offset": 3942, + "offset": 4977, "builtins": [ "range_check" ] }, { "selector": "0x38be5d5f7bf135b52888ba3e440a457d11107aca3f6542e574b016bf3f074d8", - "offset": 4046, + "offset": 5087, "builtins": [ "range_check", "bitwise" @@ -39399,14 +43045,14 @@ }, { "selector": "0x39a1491f76903a16feed0a6433bec78de4c73194944e1118e226820ad479701", - "offset": 6876, + "offset": 8113, "builtins": [ "range_check" ] }, { "selector": "0x3a6a8bae4c51d5959683ae246347ffdd96aa5b2bfa68cc8c3a6a7c2ed0be331", - "offset": 2625, + "offset": 3557, "builtins": [ "range_check" ] @@ -39420,7 +43066,7 @@ }, { "selector": "0x3d3da80997f8be5d16e9ae7ee6a4b5f7191d60765a1a6c219ab74269c85cf97", - "offset": 6361, + "offset": 7560, "builtins": [ "range_check", "range_check96", @@ -39430,14 +43076,14 @@ }, { "selector": "0x3d95049b565ec2d4197a55108ef03996381d31c84acf392a0a42b28163d69d1", - "offset": 4159, + "offset": 5206, "builtins": [ "range_check" ] }, { "selector": "0x3eb640b15f75fcc06d43182cdb94ed38c8e71755d5fb57c16dd673b466db1d4", - "offset": 4685, + "offset": 5767, "builtins": [ "range_check" ] @@ -39446,14 +43092,14 @@ "L1_HANDLER": [ { "selector": "0x205500a208d0d49d79197fea83cc3f5fde99ac2e1909ae0a5d9f394c0c52ed0", - "offset": 7126, + "offset": 8476, "builtins": [ "range_check" ] }, { "selector": "0x39edbbb129ad752107a94d40c3873cae369a46fd2fc578d075679aa67e85d12", - "offset": 6990, + "offset": 8330, "builtins": [ "range_check" ] @@ -39462,7 +43108,7 @@ "CONSTRUCTOR": [ { "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", - "offset": 7351, + "offset": 8720, "builtins": [ "range_check" ] diff --git a/crates/blockifier/feature_contracts/cairo1/compiled/test_contract_execution_info_v1.casm.json b/crates/blockifier/feature_contracts/cairo1/compiled/test_contract_execution_info_v1.casm.json index 0b36d00aff2..72388e9e119 100644 --- a/crates/blockifier/feature_contracts/cairo1/compiled/test_contract_execution_info_v1.casm.json +++ b/crates/blockifier/feature_contracts/cairo1/compiled/test_contract_execution_info_v1.casm.json @@ -1,24 +1,26 @@ { "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "compiler_version": "2.9.2", + "compiler_version": "2.10.0", "bytecode": [ "0xa0680017fff8000", "0x7", "0x482680017ffa8000", - "0xffffffffffffffffffffffffffffd33c", + "0xffffffffffffffffffffffffffffccfc", "0x400280007ff97fff", "0x10780017fff7fff", - "0x18d", + "0x1ad", "0x4825800180007ffa", - "0x2cc4", + "0x3304", "0x400280007ff97fff", "0x482680017ff98000", "0x1", + "0x48127ffe7fff8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", @@ -26,7 +28,8 @@ "0x0", "0x480a7ffc7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", @@ -34,170 +37,186 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x162", + "0x17f", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x12", - "0x4824800180007ffe", + "0x4824800180007ffd", "0x10000000000000000", "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007ff57fff", + "0x480080007ff27fff", "0x482480017ffe8000", "0xefffffffffffffdeffffffffffffffff", - "0x480080017ff37fff", - "0x400080027ff27ffb", + "0x480080017ff07fff", + "0x400080027fef7ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0x14d", + "0x167", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ffe8000", + "0x400080007ff57ffd", + "0x482480017ffd8000", "0xffffffffffffffff0000000000000000", - "0x400080017ff77fff", - "0x482480017ff78000", + "0x400080017ff47fff", + "0x482480017ff48000", "0x2", - "0x48307ff880007ff9", + "0x48127ffc7fff8000", + "0x48307ff680007ff7", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff78000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff48000", "0x1", - "0x48127ff77fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", - "0x48127ff47fff8000", + "0x48127ff17fff8000", "0x10780017fff7fff", - "0x8", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x11f", + "0x136", "0x480080007fff8000", + "0x48127ffa7fff8000", "0xa0680017fff8000", "0x12", - "0x4824800180007ffe", + "0x4824800180007ffd", "0x10000000000000000", "0x4844800180008002", "0x8000000000000110000000000000000", "0x4830800080017ffe", - "0x480080007ff57fff", + "0x480080007ff27fff", "0x482480017ffe8000", "0xefffffffffffffdeffffffffffffffff", - "0x480080017ff37fff", - "0x400080027ff27ffb", + "0x480080017ff07fff", + "0x400080027fef7ffb", "0x402480017fff7ffb", "0xffffffffffffffffffffffffffffffff", "0x20680017fff7fff", - "0x10a", + "0x11e", "0x402780017fff7fff", "0x1", - "0x400080007ff87ffe", - "0x482480017ffe8000", + "0x400080007ff57ffd", + "0x482480017ffd8000", "0xffffffffffffffff0000000000000000", - "0x400080017ff77fff", - "0x482480017ff78000", + "0x400080017ff47fff", + "0x482480017ff48000", "0x2", - "0x48307ff880007ff9", + "0x48127ffc7fff8000", + "0x48307ff680007ff7", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", - "0x482480017ff78000", + "0xb", + "0x48127ffe7fff8000", + "0x482480017ff48000", "0x1", - "0x48127ff77fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x0", - "0x480080007ff48000", + "0x480080007ff18000", "0x10780017fff7fff", - "0x8", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x9", + "0x48127ffe7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0xdc", + "0xed", + "0x48127ffb7fff8000", "0xa0680017fff8004", "0xe", - "0x4824800180047ffe", + "0x4824800180047ffd", "0x800000000000000000000000000000000000000000000000000000000000000", "0x484480017ffe8000", "0x110000000000000000", "0x48307ffe7fff8002", - "0x480080007ff67ffc", - "0x480080017ff57ffc", + "0x480080007ff37ffc", + "0x480080017ff27ffc", "0x402480017ffb7ffd", "0xffffffffffffffeeffffffffffffffff", - "0x400080027ff47ffd", + "0x400080027ff17ffd", "0x10780017fff7fff", - "0xca", + "0xd8", "0x484480017fff8001", "0x8000000000000000000000000000000", - "0x48307fff80007ffd", - "0x480080007ff77ffd", - "0x480080017ff67ffd", + "0x48307fff80007ffc", + "0x480080007ff47ffd", + "0x480080017ff37ffd", "0x402480017ffc7ffe", "0xf8000000000000000000000000000000", - "0x400080027ff57ffe", - "0x482480017ff58000", + "0x400080027ff27ffe", + "0x482480017ff28000", "0x3", - "0x48127ff67fff8000", - "0x48127ff67fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", "0x1104800180018000", - "0x10a", - "0x20680017fff7ff4", - "0xb2", - "0x20680017fff7ff7", - "0xa2", - "0x48307ff580007ff6", + "0x11f", + "0x48127fa07fff8000", + "0x20680017fff7ff3", + "0xbe", + "0x48127fff7fff8000", + "0x20680017fff7ff5", + "0xac", + "0x48127fff7fff8000", + "0x48307ff280007ff3", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x8f", - "0x482480017ff48000", + "0x97", + "0x482480017ff18000", "0x1", - "0x48127ff47fff8000", - "0x480080007ff28000", - "0x48307ffd80007ffe", + "0x48127ff17fff8000", + "0x48127ffc7fff8000", + "0x480080007fee8000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x78", - "0x482480017ffc8000", + "0x7e", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x61", - "0x482480017ffc8000", + "0x65", + "0x482480017ffb8000", "0x1", - "0x48127ffc7fff8000", - "0x480080007ffa8000", - "0x48307ffd80007ffe", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480080007ff88000", + "0x48307ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x400080007ffe7fff", - "0x48127fe47fff8000", - "0x48127f787fff8000", + "0x48127fde7fff8000", + "0x482480017ffa8000", + "0x492", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -206,42 +225,43 @@ "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", - "0x4b2", + "0x4e7", "0x482480017fff8000", - "0x4b1", - "0x480080007fff8000", + "0x4e6", + "0x48127ffa7fff8000", + "0x480080007ffe8000", "0xa0680017fff8000", "0x9", - "0x4824800180007f76", - "0x5122", + "0x4824800180007ffd", + "0x569a", "0x482480017fff8000", "0x100000000000000000000000000000000", - "0x400080007fdf7fff", + "0x400080007fd87fff", "0x10780017fff7fff", - "0x2d", - "0x4824800180007f76", - "0x5122", - "0x400080007fe07fff", - "0x482480017fe08000", + "0x2e", + "0x4824800180007ffd", + "0x569a", + "0x400080007fd97fff", + "0x482480017fd98000", "0x1", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", - "0x48127f797fff8000", - "0x48127f817fff8000", - "0x48127f887fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", - "0x48127fdf7fff8000", + "0x48127f6b7fff8000", + "0x48127f767fff8000", + "0x48127f807fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", + "0x48127fd87fff8000", "0x48127fdf7fff8000", - "0x48127fe27fff8000", - "0x48127fe57fff8000", - "0x48127fe87fff8000", + "0x48127fe37fff8000", + "0x48127fe77fff8000", "0x1104800180018000", - "0x231", + "0x23e", "0x20680017fff7ffd", "0xc", "0x40780017fff7fff", @@ -255,7 +275,8 @@ "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x482480017ffa8000", + "0x64", "0x48127ffa7fff8000", "0x480680017fff8000", "0x1", @@ -267,9 +288,9 @@ "0x480680017fff8000", "0x4f7574206f6620676173", "0x400080007ffe7fff", - "0x482480017fdd8000", + "0x482480017fd68000", "0x1", - "0x48127f717fff8000", + "0x48127ff87fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -282,8 +303,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202337", "0x400080007ffe7fff", - "0x48127fe87fff8000", - "0x48127f7c7fff8000", + "0x48127fe37fff8000", + "0x482480017ffa8000", + "0x686", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -296,8 +318,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202336", "0x400080007ffe7fff", - "0x48127fec7fff8000", - "0x48127f807fff8000", + "0x48127fe87fff8000", + "0x482480017ffa8000", + "0x8de", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -310,8 +333,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202335", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127f847fff8000", + "0x48127fed7fff8000", + "0x482480017ffb8000", + "0xb36", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -324,8 +348,9 @@ "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x400080007ffe7fff", - "0x48127ff17fff8000", - "0x48127f857fff8000", + "0x48127fef7fff8000", + "0x482480017ffc8000", + "0xcc6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -333,28 +358,31 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ff37fff8000", - "0x48127f877fff8000", + "0x48127ff27fff8000", + "0x482480017ffe8000", + "0xeba", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", - "0x48127ffa7fff8000", - "0x48127ffa7fff8000", + "0x48127ff97fff8000", + "0x48127ff97fff8000", "0x208b7fff7fff7ffe", - "0x482480017ff48000", + "0x482480017ff18000", "0x3", + "0x482480017ff88000", + "0x3c8c", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x6", - "0x48127ff47fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x41aa", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fdd7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -362,20 +390,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff28000", + "0x482480017fef8000", "0x3", + "0x482480017ff78000", + "0x42f4", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x8", - "0x48127ff27fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x48da", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fe47fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -383,20 +413,22 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x482480017ff28000", + "0x482480017fef8000", "0x3", + "0x482480017ff78000", + "0x4a24", "0x10780017fff7fff", "0x5", - "0x40780017fff7fff", - "0x8", - "0x48127ff27fff8000", + "0x48127ff87fff8000", + "0x482480017ffa8000", + "0x500a", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x400080007ffe7fff", - "0x48127ffd7fff8000", - "0x48127fed7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -411,7 +443,8 @@ "0x400080007ffe7fff", "0x482680017ff98000", "0x1", - "0x480a7ffa7fff8000", + "0x482680017ffa8000", + "0x21b6", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", @@ -523,7 +556,7 @@ "0x48127ff97fff8000", "0x48127ff97fff8000", "0x1104800180018000", - "0x248", + "0x267", "0x20680017fff7ffa", "0xa1", "0x20680017fff7ffd", @@ -809,13 +842,14 @@ "0x400380017fef7fee", "0x480280037fef8000", "0x20680017fff7fff", - "0x121", + "0x13e", + "0x480280027fef8000", "0x480280047fef8000", "0x480080007fff8000", "0x480080007fff8000", - "0x480280027fef8000", "0x402780017fef8001", "0x5", + "0x48127ffc7fff8000", "0x480080017ffc8000", "0x400180027ffb8004", "0x400180037ffb8003", @@ -826,14 +860,15 @@ "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x424c4f434b5f4e554d4245525f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x1dd8", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -841,18 +876,20 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48287ff180007ffd", + "0x48127ffb7fff8000", + "0x48287ff180007ffc", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x424c4f434b5f54494d455354414d505f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127ff77fff8000", + "0x482480017ffb8000", + "0x1c48", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -860,35 +897,40 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48287ff280007ffd", - "0x20680017fff7fff", - "0xde", - "0x480080007ffa8000", + "0x48287ff280007ffc", + "0x48127ffd7fff8000", + "0x20680017fff7ffe", + "0xf5", + "0x480080007ff88000", "0x48287ff380007fff", - "0x480080017ff88000", - "0x480080027ff78000", - "0x480080037ff68000", - "0x480080047ff58000", - "0x400180057ff48000", - "0x400180067ff48006", - "0x400180077ff48005", - "0x20680017fff7ffb", - "0xc5", + "0x48127ffd7fff8000", + "0x480080017ff58000", + "0x480080027ff48000", + "0x480080037ff38000", + "0x480080047ff28000", + "0x400180057ff18000", + "0x400180067ff18006", + "0x400180077ff18005", + "0x20680017fff7ffa", + "0xda", "0x48287ff480007ffc", - "0x20680017fff7fff", - "0xb4", - "0x48287ff580007ffc", + "0x48127ffa7fff8000", + "0x20680017fff7ffe", + "0xc7", + "0x48127fff7fff8000", + "0x48287ff580007ffa", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x10", + "0x11", "0x40780017fff7fff", "0x1", "0x480680017fff8000", "0x54585f494e464f5f4d41585f4645455f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127fee7fff8000", + "0x482480017ffb8000", + "0x1432", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -896,31 +938,35 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x48307ffc80007ffd", + "0x48307ffa80007ffb", "0x48297ff680007ff7", - "0x48307fff80007ffe", + "0x48127ffc7fff8000", + "0x48307ffe80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x6", + "0x7", "0x480a7fed7fff8000", - "0x48127fed7fff8000", + "0x482480017ffd8000", + "0x10ae", "0x10780017fff7fff", - "0x10", + "0x12", "0x480a7fed7fff8000", - "0x48127fed7fff8000", - "0x48127ff77fff8000", - "0x48127ff77fff8000", + "0x48127ffd7fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x1104800180018000", - "0x17a", + "0x18e", "0x20680017fff7ffa", - "0x84", - "0x20680017fff7fff", - "0x12", - "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x92", + "0x48127ff97fff8000", + "0x20680017fff7ffe", + "0x13", + "0x48127ff77fff8000", + "0x482480017ffe8000", + "0x640", "0x40780017fff7fff", "0x1", "0x480680017fff8000", @@ -936,25 +982,32 @@ "0x1", "0x208b7fff7fff7ffe", "0x48297ff880008000", - "0x20680017fff7fff", - "0x61", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x6b", "0x48297ff980008006", - "0x20680017fff7fff", - "0x50", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x58", "0x48297ffa80008005", - "0x20680017fff7fff", - "0x3f", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x45", "0x48297ffb80008004", - "0x20680017fff7fff", - "0x2e", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x32", "0x48297ffc80008003", - "0x20680017fff7fff", - "0x1d", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0x1f", "0x48297ffd80008002", - "0x20680017fff7fff", - "0xc", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x48127ffe7fff8000", + "0x20680017fff7ffe", + "0xd", + "0x48127feb7fff8000", + "0x482480017ffe8000", + "0x12c", "0x480a80017fff8000", "0x480680017fff8000", "0x0", @@ -968,8 +1021,8 @@ "0x480680017fff8000", "0x53454c4543544f525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff07fff8000", - "0x48127ff07fff8000", + "0x48127fe97fff8000", + "0x48127ffc7fff8000", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -982,8 +1035,9 @@ "0x480680017fff8000", "0x434f4e54524143545f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff17fff8000", - "0x48127ff17fff8000", + "0x48127feb7fff8000", + "0x482480017ffc8000", + "0x12c", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -996,8 +1050,9 @@ "0x480680017fff8000", "0x43414c4c45525f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff27fff8000", - "0x48127ff27fff8000", + "0x48127fed7fff8000", + "0x482480017ffc8000", + "0x258", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1010,8 +1065,9 @@ "0x480680017fff8000", "0x54585f494e464f5f4e4f4e43455f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127fef7fff8000", + "0x482480017ffc8000", + "0x384", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1024,8 +1080,9 @@ "0x480680017fff8000", "0x54585f494e464f5f434841494e5f49445f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff47fff8000", - "0x48127ff47fff8000", + "0x48127ff17fff8000", + "0x482480017ffc8000", + "0x4b0", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1038,8 +1095,9 @@ "0x480680017fff8000", "0x54585f494e464f5f484153485f4d49534d41544348", "0x400080007ffe7fff", - "0x48127ff57fff8000", - "0x48127ff57fff8000", + "0x48127ff37fff8000", + "0x482480017ffc8000", + "0x5dc", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1048,7 +1106,8 @@ "0x1", "0x208b7fff7fff7ffe", "0x48127ff87fff8000", - "0x48127ff87fff8000", + "0x482480017ff88000", + "0x8fc", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1061,7 +1120,8 @@ "0x4143434f554e545f435f414444524553535f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127fef7fff8000", + "0x482480017ffc8000", + "0x155e", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1075,7 +1135,8 @@ "0x54585f494e464f5f56455253494f4e5f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127ff07fff8000", + "0x482480017ff88000", + "0x168a", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1089,7 +1150,8 @@ "0x53455155454e4345525f4d49534d41544348", "0x400080007ffe7fff", "0x480a7fed7fff8000", - "0x48127ff67fff8000", + "0x482480017ffc8000", + "0x1ab8", "0x480a80017fff8000", "0x480680017fff8000", "0x1", @@ -1097,8 +1159,10 @@ "0x482480017ff98000", "0x1", "0x208b7fff7fff7ffe", - "0x480a7fed7fff8000", "0x480280027fef8000", + "0x480a7fed7fff8000", + "0x482480017ffe8000", + "0x23f0", "0x482680017fef8000", "0x6", "0x480680017fff8000", @@ -1294,20 +1358,22 @@ "0xa0680017fff8000", "0x7", "0x482680017ff98000", - "0xfffffffffffffffffffffffffffff4ca", + "0xfffffffffffffffffffffffffffff33a", "0x400280007ff87fff", "0x10780017fff7fff", - "0x5b", + "0x63", "0x4825800180007ff9", - "0xb36", + "0xcc6", "0x400280007ff87fff", "0x482680017ff88000", "0x1", + "0x48127ffe7fff8000", "0x48297ffa80007ffb", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0xa", + "0xb", + "0x48127ffe7fff8000", "0x482680017ffa8000", "0x1", "0x480a7ffb7fff8000", @@ -1315,7 +1381,8 @@ "0x0", "0x480a7ffa7fff8000", "0x10780017fff7fff", - "0x8", + "0x9", + "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", @@ -1323,35 +1390,38 @@ "0x480680017fff8000", "0x0", "0x20680017fff7ffe", - "0x36", - "0x480080007fff8000", + "0x3a", + "0x48127ffb7fff8000", + "0x480080007ffe8000", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x4", "0x10780017fff7fff", - "0x1d", + "0x1f", "0x480280007ffc8000", "0x48307fff80007ffd", + "0x48127ffb7fff8000", "0x482680017ffc8000", "0x1", "0x480a7ffd7fff8000", - "0x20680017fff7ffd", + "0x20680017fff7ffc", "0xb", - "0x48127ff47fff8000", + "0x48127ff07fff8000", + "0x48127ffc7fff8000", + "0x48127ff27fff8000", "0x48127ff27fff8000", - "0x48127ff47fff8000", - "0x48127ff47fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcd", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc8", "0x208b7fff7fff7ffe", - "0x48127ff47fff8000", - "0x48127ff27fff8000", + "0x48127ff07fff8000", + "0x482480017ffc8000", + "0x622", "0x480680017fff8000", "0x0", - "0x48127ff37fff8000", - "0x48127ff37fff8000", + "0x48127ff17fff8000", + "0x48127ff17fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x480680017fff8000", @@ -1362,8 +1432,9 @@ "0x480680017fff8000", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x400080007ffe7fff", - "0x48127ff67fff8000", - "0x48127ff47fff8000", + "0x48127ff37fff8000", + "0x482480017ffa8000", + "0x6ea", "0x480680017fff8000", "0x1", "0x480680017fff8000", @@ -1376,8 +1447,9 @@ "0x482480017ff78000", "0x1", "0x208b7fff7fff7ffe", - "0x48127ffa7fff8000", "0x48127ff87fff8000", + "0x482480017ffa8000", + "0xa0a", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", @@ -1409,11 +1481,11 @@ "0x208b7fff7fff7ffe" ], "bytecode_segment_lengths": [ - 417, + 450, 382, - 305, + 336, 185, - 116 + 124 ], "hints": [ [ @@ -1422,7 +1494,7 @@ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x2cc4" + "Immediate": "0x3304" }, "rhs": { "Deref": { @@ -1439,7 +1511,7 @@ ] ], [ - 34, + 38, [ { "TestLessThan": { @@ -1448,7 +1520,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -1 + "offset": -2 }, "b": { "Immediate": "0x0" @@ -1467,7 +1539,7 @@ ] ], [ - 38, + 42, [ { "LinearSplit": { @@ -1496,7 +1568,7 @@ ] ], [ - 80, + 88, [ { "TestLessThan": { @@ -1505,7 +1577,7 @@ "op": "Add", "a": { "register": "AP", - "offset": -1 + "offset": -2 }, "b": { "Immediate": "0x0" @@ -1524,7 +1596,7 @@ ] ], [ - 84, + 92, [ { "LinearSplit": { @@ -1553,14 +1625,14 @@ ] ], [ - 125, + 137, [ { "TestLessThan": { "lhs": { "Deref": { "register": "AP", - "offset": -1 + "offset": -2 } }, "rhs": { @@ -1575,7 +1647,7 @@ ] ], [ - 129, + 141, [ { "LinearSplit": { @@ -1604,14 +1676,14 @@ ] ], [ - 139, + 151, [ { "LinearSplit": { "value": { "Deref": { "register": "AP", - "offset": -2 + "offset": -3 } }, "scalar": { @@ -1633,7 +1705,7 @@ ] ], [ - 189, + 207, [ { "AllocSegment": { @@ -1646,17 +1718,17 @@ ] ], [ - 208, + 228, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0x5122" + "Immediate": "0x569a" }, "rhs": { "Deref": { "register": "AP", - "offset": -137 + "offset": -2 } }, "dst": { @@ -1668,7 +1740,7 @@ ] ], [ - 242, + 262, [ { "AllocSegment": { @@ -1681,7 +1753,7 @@ ] ], [ - 260, + 281, [ { "AllocSegment": { @@ -1694,7 +1766,7 @@ ] ], [ - 275, + 296, [ { "AllocSegment": { @@ -1707,7 +1779,7 @@ ] ], [ - 289, + 311, [ { "AllocSegment": { @@ -1720,7 +1792,7 @@ ] ], [ - 303, + 326, [ { "AllocSegment": { @@ -1733,7 +1805,7 @@ ] ], [ - 317, + 341, [ { "AllocSegment": { @@ -1746,7 +1818,7 @@ ] ], [ - 346, + 374, [ { "AllocSegment": { @@ -1759,7 +1831,7 @@ ] ], [ - 367, + 397, [ { "AllocSegment": { @@ -1772,7 +1844,7 @@ ] ], [ - 388, + 420, [ { "AllocSegment": { @@ -1785,7 +1857,7 @@ ] ], [ - 402, + 434, [ { "AllocSegment": { @@ -1798,7 +1870,7 @@ ] ], [ - 447, + 480, [ { "TestLessThan": { @@ -1820,7 +1892,7 @@ ] ], [ - 451, + 484, [ { "LinearSplit": { @@ -1849,7 +1921,7 @@ ] ], [ - 461, + 494, [ { "LinearSplit": { @@ -1878,7 +1950,7 @@ ] ], [ - 493, + 526, [ { "TestLessThan": { @@ -1900,7 +1972,7 @@ ] ], [ - 495, + 528, [ { "DivMod": { @@ -1926,7 +1998,7 @@ ] ], [ - 805, + 838, [ { "SystemCall": { @@ -1941,7 +2013,7 @@ ] ], [ - 825, + 859, [ { "AllocSegment": { @@ -1954,7 +2026,7 @@ ] ], [ - 844, + 880, [ { "AllocSegment": { @@ -1967,7 +2039,7 @@ ] ], [ - 880, + 921, [ { "AllocSegment": { @@ -1980,7 +2052,7 @@ ] ], [ - 919, + 965, [ { "AllocSegment": { @@ -1993,7 +2065,7 @@ ] ], [ - 961, + 1014, [ { "AllocSegment": { @@ -2006,7 +2078,7 @@ ] ], [ - 975, + 1028, [ { "AllocSegment": { @@ -2019,7 +2091,7 @@ ] ], [ - 989, + 1043, [ { "AllocSegment": { @@ -2032,7 +2104,7 @@ ] ], [ - 1003, + 1058, [ { "AllocSegment": { @@ -2045,7 +2117,7 @@ ] ], [ - 1017, + 1073, [ { "AllocSegment": { @@ -2058,7 +2130,7 @@ ] ], [ - 1031, + 1088, [ { "AllocSegment": { @@ -2071,7 +2143,7 @@ ] ], [ - 1053, + 1112, [ { "AllocSegment": { @@ -2084,7 +2156,7 @@ ] ], [ - 1067, + 1127, [ { "AllocSegment": { @@ -2097,7 +2169,7 @@ ] ], [ - 1081, + 1142, [ { "AllocSegment": { @@ -2110,7 +2182,7 @@ ] ], [ - 1126, + 1190, [ { "TestLessThan": { @@ -2138,7 +2210,7 @@ ] ], [ - 1130, + 1194, [ { "LinearSplit": { @@ -2167,7 +2239,7 @@ ] ], [ - 1152, + 1216, [ { "TestLessThanOrEqual": { @@ -2192,7 +2264,7 @@ ] ], [ - 1166, + 1230, [ { "TestLessThan": { @@ -2214,7 +2286,7 @@ ] ], [ - 1176, + 1240, [ { "TestLessThanOrEqual": { @@ -2239,7 +2311,7 @@ ] ], [ - 1199, + 1263, [ { "AllocSegment": { @@ -2252,7 +2324,7 @@ ] ], [ - 1220, + 1284, [ { "AllocSegment": { @@ -2265,7 +2337,7 @@ ] ], [ - 1241, + 1305, [ { "AllocSegment": { @@ -2278,12 +2350,12 @@ ] ], [ - 1289, + 1353, [ { "TestLessThanOrEqual": { "lhs": { - "Immediate": "0xb36" + "Immediate": "0xcc6" }, "rhs": { "Deref": { @@ -2300,7 +2372,7 @@ ] ], [ - 1355, + 1425, [ { "AllocSegment": { @@ -2313,7 +2385,7 @@ ] ], [ - 1385, + 1457, [ { "AllocSegment": { diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/account_faulty.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/account_faulty.sierra.json index 9fa615c5b3d..9011b172169 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/account_faulty.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/account_faulty.sierra.json @@ -1,13 +1,13 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", - "0x1d9", - "0x27", + "0xa", + "0x0", + "0x209", + "0x1f7", "0x43", "0x52616e6765436865636b", "0x800000000000000100000000000000000000000000000000", @@ -35,6 +35,7 @@ "0x53746f7261676541646472657373", "0xf", "0x8", + "0x7c8", "0x496e646578206f7574206f6620626f756e6473", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x1b1a0649752af1b28b3dc29a1556eee781e4a4c3a1f7f53f90fa834de098c4d", @@ -103,12 +104,14 @@ "0x3b", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x4761734275696c74696e", - "0x90", + "0x91", "0x7265766f6b655f61705f747261636b696e67", "0x77697468647261775f676173", "0x6272616e63685f616c69676e", + "0x72656465706f7369745f676173", "0x7374727563745f6465636f6e737472756374", "0x73746f72655f74656d70", + "0x42", "0x61727261795f736e617073686f745f706f705f66726f6e74", "0x756e626f78", "0x64726f70", @@ -119,7 +122,6 @@ "0x7374727563745f636f6e737472756374", "0x656e756d5f696e6974", "0x40", - "0x42", "0x3f", "0x6765745f6275696c74696e5f636f737473", "0x3e", @@ -178,39 +180,40 @@ "0x9", "0x7536345f746f5f66656c74323532", "0x636f6e74726163745f616464726573735f746f5f66656c74323532", - "0x69c", + "0x7a9", "0xffffffffffffffff", - "0x55", - "0x47", - "0x112", - "0x104", - "0xf6", - "0xe8", - "0x7f", - "0x84", - "0x96", - "0xda", - "0xac", - "0xaf", - "0xb9", - "0xc7", - "0xd3", + "0x61", + "0x52", "0x44", "0x45", + "0x13c", + "0x12d", + "0x11e", + "0x10f", + "0x96", + "0x9d", + "0xb0", + "0x100", + "0xcc", + "0xd1", + "0xdc", "0x46", + "0x47", + "0xec", "0x48", "0x49", "0x4a", "0x4b", "0x4c", "0x4d", + "0xf8", "0x4e", "0x4f", "0x50", "0x51", - "0x52", "0x53", "0x54", + "0x55", "0x56", "0x57", "0x58", @@ -222,32 +225,14 @@ "0x5e", "0x5f", "0x60", - "0x61", "0x62", "0x63", "0x64", "0x65", "0x66", - "0x1f4", - "0x12e", - "0x133", - "0x1e3", - "0x1df", - "0x1d0", - "0x144", - "0x149", - "0x1be", - "0x1b7", - "0x1b1", - "0x16d", - "0x1a3", - "0x196", - "0x18e", - "0x19b", "0x67", "0x68", "0x69", - "0x1c4", "0x6a", "0x6b", "0x6c", @@ -262,76 +247,50 @@ "0x75", "0x76", "0x77", - "0x1e7", "0x78", "0x79", "0x7a", "0x7b", "0x7c", + "0x249", + "0x15d", + "0x164", + "0x236", + "0x230", + "0x221", + "0x17f", + "0x186", + "0x20e", + "0x206", + "0x1ff", + "0x1b0", + "0x1f0", + "0x1e1", + "0x1d8", + "0x1e8", "0x7d", "0x7e", + "0x7f", + "0x215", "0x80", "0x81", "0x82", "0x83", - "0x2d9", - "0x213", - "0x218", - "0x2c6", - "0x2c1", - "0x2b0", - "0x22a", - "0x22f", - "0x29c", - "0x293", - "0x28b", - "0x255", - "0x27b", - "0x274", - "0x2a4", - "0x2cc", - "0x31c", - "0x2fe", - "0x30f", - "0x3af", - "0x3a1", - "0x33c", - "0x341", - "0x353", - "0x393", - "0x369", - "0x36c", - "0x374", - "0x381", - "0x38c", - "0x5a6", - "0x597", - "0x3ef", - "0x416", - "0x408", - "0x463", - "0x456", - "0x448", - "0x43f", - "0x483", - "0x47a", - "0x4ce", - "0x4c0", + "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", - "0x4b2", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f", - "0x4a9", - "0x91", + "0x90", "0x92", + "0x23d", "0x93", "0x94", "0x95", @@ -341,26 +300,69 @@ "0x9a", "0x9b", "0x9c", - "0x9d", "0x9e", "0x9f", "0xa0", + "0x354", + "0x26d", + "0x274", + "0x33f", + "0x338", + "0x327", + "0x290", + "0x297", + "0x312", + "0x308", + "0x2ff", + "0x2c3", + "0x2ee", + "0x2e6", + "0x31b", + "0x348", + "0x39f", + "0x37d", + "0x391", + "0x44a", + "0x43b", + "0x3c6", + "0x3cd", + "0x3e0", + "0x42c", + "0x3fc", + "0x401", + "0x40a", + "0x419", + "0x424", + "0x68c", + "0x67c", + "0x490", + "0x4bd", + "0x4ae", + "0x518", + "0x50a", + "0x4fb", + "0x4f0", + "0x540", + "0x535", + "0x599", + "0x58a", + "0x57b", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", - "0x588", + "0x570", "0xa7", "0xa8", "0xa9", "0xaa", "0xab", + "0xac", "0xad", "0xae", - "0x57a", - "0xb0", + "0xaf", "0xb1", "0xb2", "0xb3", @@ -368,8 +370,8 @@ "0xb5", "0xb6", "0xb7", - "0x56b", "0xb8", + "0xb9", "0xba", "0xbb", "0xbc", @@ -377,51 +379,51 @@ "0xbe", "0xbf", "0xc0", - "0x55c", "0xc1", "0xc2", + "0x66c", "0xc3", "0xc4", "0xc5", - "0x550", "0xc6", + "0xc7", "0xc8", "0xc9", "0xca", "0xcb", - "0xcc", + "0x65d", "0xcd", "0xce", "0xcf", "0xd0", - "0xd1", "0xd2", + "0xd3", "0xd4", "0xd5", - "0x53e", + "0x64d", "0xd6", "0xd7", "0xd8", "0xd9", - "0x52e", + "0xda", "0xdb", - "0xdc", "0xdd", - "0x520", "0xde", "0xdf", + "0x63d", "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", + "0x62f", "0xe6", "0xe7", + "0xe8", "0xe9", "0xea", "0xeb", - "0xec", "0xed", "0xee", "0xef", @@ -431,19 +433,22 @@ "0xf3", "0xf4", "0xf5", + "0xf6", + "0x61c", "0xf7", - "0xf8", "0xf9", "0xfa", "0xfb", + "0x60b", "0xfc", "0xfd", "0xfe", "0xff", - "0x100", + "0x5fc", "0x101", "0x102", "0x103", + "0x104", "0x105", "0x106", "0x107", @@ -454,562 +459,734 @@ "0x10c", "0x10d", "0x10e", - "0x10f", "0x110", "0x111", + "0x112", "0x113", "0x114", "0x115", "0x116", "0x117", - "0x5e8", - "0x5be", - "0x5ca", - "0x5cf", - "0x5dd", - "0x692", - "0x682", - "0x667", - "0x659", - "0x64b", - "0x642", - "0x679", + "0x118", + "0x119", + "0x11a", + "0x11b", + "0x11c", + "0x11d", + "0x11f", "0x120", - "0x202", - "0x2e9", - "0x32a", - "0x3bd", - "0x5af", - "0x5f7", - "0x37ae", - "0x2c0e0602810060a038180a04018240e06028100608038180a04018080200", - "0xc0e070a81408030b01c2a050200c280509814260509044200f068381a0c", - "0x10061a038180a04018640e0602810060d0c0440e15028100617038180a04", - "0x1c0c050200c38070301408030d81c0c050200c2c070301408030881c2605", - "0x10061f038180a04018780e06028100607038180a04018140e1502810061d", - "0x44200f068ac1a2a1481450111383c4c05128904605110841a200281c0c05", - "0x180a32088c41e30028bc2227078b80a25120180a22108b40a13028180a2c", - "0x144a35198142a050a8146605168146805030140c05030146605168142805", - "0xf8223d078f00a251a8180a14028500a3b028e80a39088e01e37028946a36", - "0x1482112183c8a051701488112190882111e83c220703014080303014803f", - "0x180a251a92c0a4a029242243210b80a480290422430791c223d079180a33", - "0x1c0c050200ca007030140803228140c05278449842228149c05268449842", - "0x100655038180a04018180a252a1140a450294c224c211480e06028100651", - "0x1681a5925814b0052b84486420301482111383c6605208444e0f2b01c0c05", - "0x140a6308988226108980be022f1740e0602810064b029700a5b0890c8402", - "0x14ce3002814ce3002814c80602814ce0602814cc0602814ca1102814c833", - "0x1b49605029b09005029b00c05029ac0c0502990d405029a40c05029a09c05", - "0x14e811399c80a0532044e26e02814c87002814c86f02814c805039b80a07", - "0x1b4b805029b06605029b05c050299c5c05029dcb0050298cec05029d42816", - "0x14d8113e044f60602814f43302814ce7902814d27802814d211039b80a07", - "0x19c22800881cfa05039b4fe050299c227e3e8140a640281cfa05039b48a05", - "0x14d28302814d28202814d24502814ce7d02814ea7d02814ee11409f40a05", - "0x140a6708a190a05029d40a07428140e6d428140a640881d0a05039b50805", - "0x14c83302814c88702814ea0503a1c0a0736a1c0a05320440e870281cda14", - "0x140a6308a291205029a48c05029d494050298d1005029d46e16029d05c05", - "0x2380a0533a380a053ba380a05360180a0546845180602815164802814ce4b", - "0x18c78050299922050299022902c0140a67478140a670d0580a740a0140a64", - "0xd00a05338b40a05338d80a05318d80a05330ec0a05320e80a05338f00a05", - "0x19022073b0140e6d2c0140a6c030140a92180140a7a198140a770a8140a67", - "0x25c0a05348140e760281cda9602814d29502814d2114a24c0a05349d80a05", - "0x1a53805029a4229b4d0140a69270140a64030140a990a8140a644c0140a69", - "0x4544a102814d2a002814d2114f84c0a05320640a0534a780a0534a740a05", - "0x19076050299c3405029a54e05029a54c05029a54a050299c22a4518140a69", - "0x4c0a05338580a053485c0a05348455211540dc0a05318dc0a05330e80a05", - "0x140a640881d1005039b49405029b02207230140e6d028140a69038140a69", - "0x2ac0e050881c0a1108aac0a1108845540503a200a07368140e460281cda88", - "0x2ac0a170285c221a02aac0a16028582211558142207088dc28075604c2e07", - "0x15560553014281108aac0a1103845460556a994e075581c3405098442e05", - "0x144ca05081d560753814261153815560553814341108aac0aa5028dc22a5", - "0x15560508a8c22115581540055304422ab02a840aa70884556050881c2219", - "0x64229c02aac0a9d4f01d40114e81556054e81542114e815560508a94229e", - "0x142e050b8452e055581530054e845300555815389a03a78229a02aac0a11", - "0x25c0aab02a5c0a980881c0aab0281c0a9a0884c0aab0284c0a9c0885c0aab", - "0x452c055581422970884556050c8154e1108aac0a11038452e070985c2e05", - "0x2ac0a11038444c15039e1269503aac0e960985c2c9508a580aab02a580a96", - "0x24c220702aac0a0702a68229302aac0a9302a70229502aac0a950285c2211", - "0x2ac0a11038445c054288c0aab038180a15088185a341485d560503a4d2a16", - "0xa4223602aac0a331801d4011198155605118144c1118015560508a8c2211", - "0x1478050304478055581474051684422ab028ec0a34088e87607558146c05", - "0xd00aab028d00a9c088a40aab028a40a1708a380aab02a440a2308a440aab", - "0x2ac0a11038451c2d1a0a42e05470155605470153011168155605168153411", - "0x268223402aac0a3402a70222902aac0a290285c228f02aac0a2e02a742211", - "0x4422ab028440e11478b468290b8151e05558151e054c0445a05558145a05", - "0x148a8903a80224502aac0a4502a84224502aac0a111704512055581422a3", - "0x12c0aab029200a9d089200aab0291894074f0449405558142219089180aab", - "0x1530110381556050381534111301556051301538110a81556050a8142e11", - "0x45461108aac0aa302a9c22115581422070892c0e260a85c0a4b02aac0a4b", - "0x155605272200ea0089380aab029380aa1089380aab028446011440155605", - "0x5c228302aac0a8402a74228402aac0a874281d3c11428155605088642287", - "0x1506054c0440e05558140e054d04426055581426054e0442e05558142e05", - "0x2ac0a115184422ab028580a330884556050881c22830384c2e1702a0c0aab", - "0x44fe0555814fa8203a80227d02aac0a7d02a84227d02aac0a11170450405", - "0x500a17089700aab029e00a9d089e00aab029fcf2074f044f205558142219", - "0x1556052e01530110381556050381534111b81556051b81538110a0155605", - "0xdc28075704c2e075581c0a11038142211558142211089700e370a05c0a5c", - "0x1c3405098442e05558142e050b8443405558142c050b04422ab028440e11", - "0x2ac0aa5028dc22a502aac0aa602850221155814220708a8c0aaf5329c0eab", - "0x4556050881c221902ac140a103aac0ea70284c22a702aac0aa7028682211", - "0x2840a1308a840aab02a840a1a0884556054f0146e114f0155605500142811", - "0x1530051b04530055581538050a04422ab028440e114d015629c4e81d5607", - "0xe8229d02aac0a9d02868229702aac0a9702a84221155814223b08a5c0aab", - "0x2ac0a9502a44229502aac0a111e04422ab028440e114b01564115581d2e05", - "0x152c054484422ab028440e1108acc0a11478442a05558152605470452605", - "0x4c221502aac0a2902a38222902aac0a2602914222602aac0a111e04422ab", - "0x1468055384422ab028448c1108aac0a11038440c055a0b468075581d3a05", - "0x1422a50888c0aab02845461108aac0a15029282211558145a055304422ab", - "0xcc0aab0284432111801556051708c0ea0088b80aab028b80aa1088b80aab", - "0x270221702aac0a170285c223b02aac0a3602a74223602aac0a301981d3c11", - "0x1c26170b81476055581476054c0440e05558140e054d0442605558142605", - "0xe80aab028452e1108aac0a0602a9c22115581422460884556050881c223b", - "0x14220708a3d1c075aa4478075581c74130b8592a111d01556051d0152c11", - "0x4422ab029140a4a089188a07558151205258451205558142a052404422ab", - "0x155605230151c1108aac0a111d844900555814940522844940555814223c", - "0x156c4b02aac0e4602a20224802aac0a4802a38223c02aac0a3c0285c2246", - "0x149c05470449c055581490052404422ab0292c0a4e0884556050881c2288", - "0x1490054704422ab02a200a4e0884556050881c22115b814228f08a1c0aab", - "0x4422ab028448c1108aac0a110384508055c2140aab03a1c0a8808a1c0aab", - "0x2ac0a9102a70228202aac0a3c0285c228302aac0a114384422ab02a140a4e", - "0x440e1108ae40a1147844f20555815060550844fe05558140e054d044fa05", - "0x1538111e01556051e0142e1108aac0a84029382211558142246088455605", - "0x44ec582e1e02eab0281d223c0b24c220702aac0a0702a68229102aac0a91", - "0x142e11370155605390144c1108aac0a1103844e0055d1c80aab039d80a15", - "0x2ac0a6e02a84227f02aac0a5802a68227d02aac0a5c02a70228202aac0a78", - "0x2ec000755814de0514844de0555814f26a03a80226a02aac0a1151844f205", - "0x2f40a2308af40aab02af00a0608af00aab02aec0a2d088455605000146811", - "0x1556053f81534113e81556053e8153811410155605410142e11568155605", - "0x2ac0a7002a74221155814220708ab4fe7d4105c0aad02aac0aad02a60227f", - "0x44b00555814b0054d044b80555814b8054e044f00555814f0050b8457c05", - "0x4422ab028540a4a0884556050881c22be2c170f01702af80aab02af80a98", - "0x1580bf03a8022c002aac0ac002a8422c002aac0a11170457e055581422a3", - "0x3100aab02b0c0a9d08b0c0aab02b0584074f045840555814221908b040aab", - "0x153011038155605038153411478155605478153811470155605470142e11", - "0x45461108aac0a9a02a9c221155814220708b100e8f4705c0ac402aac0ac4", - "0x155605633140ea008b180aab02b180aa108b180aab028450a11628155605", - "0x5c22ca02aac0ac902a7422c902aac0ac76401d3c116401556050886422c7", - "0x1594054c0440e05558140e054d04426055581426054e0442e05558142e05", - "0x2ac0a115184422ab028640aa70884556050881c22ca0384c2e1702b280aab", - "0x4598055581596ac03a8022cb02aac0acb02a8422cb02aac0a11420455805", - "0x5c0a1708b3c0aab02b380a9d08b380aab02b319a074f0459a05558142219", - "0x1556056781530110381556050381534110981556050981538110b8155605", - "0x3400aab02845461108aac0aa302a9c221155814220708b3c0e130b85c0acf", - "0x44321169015560568b400ea008b440aab02b440aa108b440aab028446011", - "0x2ac0a170285c22d502aac0ad402a7422d402aac0ad26981d3c11698155605", - "0x15aa0555815aa054c0440e05558140e054d04426055581426054e0442e05", - "0xb822d602aac0a115184422ab028580a330884556050881c22d50384c2e17", - "0x2ac0a110c845b00555815aed603a8022d702aac0ad702a8422d702aac0a11", - "0x500aab028500a1708b6c0aab02b680a9d08b680aab02b61b2074f045b205", - "0x502e056d81556056d81530110381556050381534111b81556051b8153811", - "0x142207088dc28076e04c2e075581c0a1103814221155814221108b6c0e37", - "0x1426110b81556050b8142e1108aac0a111d8443405558142c050b04422ab", - "0x2940a3608a940aab02a980a140884556050881c22a302b754ca703aac0e1a", - "0x1556055001504110c8155605538143411500155605508150611508155605", - "0x1556054e814fa114e8155605088f0221155814220708845bc0508a3c229e", - "0x15be9a02aac0e9e029fc229e02aac0a9c02a08221902aac0aa302868229c", - "0x4422ab028440e114a815c0964b81d56074d05c0e790884556050881c2298", - "0x444c057085526075581c3205098452e05558152e050b84422ab02a580a78", - "0x15560549814341108aac0a29028dc222902aac0a15028502211558142207", - "0x8c0aab028b40a5c0884556050881c220602b885a3403aac0e930284c2293", - "0x2ac0a110384422e3028451e1118015560511814b0111701556051a0143411", - "0x14b0111701556050301434111b015560519814ec11198155605088f02211", - "0x2ac0a112304422ab028440e111d015c83b02aac0e30029c8223002aac0a36", - "0x146c11470155605170145a1148815560508a8c223c02aac0a3b028502211", - "0x2ac0a8e029c0221302aac0a1302a70229702aac0a970285c228f02aac0a3c", - "0x151e914704d2e13350451e05558151e05508452205558152205370451c05", - "0x1494050004422ab028440e1124015ca4a02aac0e46029bc224622a242cab", - "0x2ac0a4b02858221155814220708a1c0ae62701556074401576114412c0eab", - "0x455605420154e1108aac0a1103845040573a0d08075581d0a05098450a05", - "0x15560508a94227d02aac0a115184422ab029380a34088455605418154c11", - "0x278227802aac0a110c844f20555814fe7d03a80227f02aac0a7f02a84227f", - "0x1140a9c08a240aab02a240a17089600aab029700a9d089700aab029e4f007", - "0x44b00722a242e052c01556052c0153011038155605038153411228155605", - "0x1d80aab029d80a96089d80aab028452e1108aac0a8202a9c2211558142207", - "0x15560508af02211558142207089a8dc07741c0e4075581cec45448592a11", - "0x28422bc02aac0abb028b422115581400051a045760003aac0a4e028a4226f", - "0x3a55abd03aac0ebc3781ce0175e844e40555814e4050b844de0555814de05", - "0x457a05558157a054e044e40555814e4050b84422ab028440e11602fd7c16", - "0x155607620142a116230d84c10baac0aad5e9c82c9308ab40aab02ab40a9a", - "0x28022c802aac0ac50289822c702aac0a115184422ab028440e1163015d4c5", - "0x2b00a2d088455605650146811563280eab02b240a2908b240aab02b218e07", - "0x155605608142e11668155605660144611660155605658140c11658155605", - "0x5c0acd02aac0acd02a6022c302aac0ac302a6822c202aac0ac202a7022c1", - "0x4422ab02b380abe08b3d9c07558158c055684422ab028440e1166b0d84c1", - "0x33c0a6e08b480aab02b0c0a9a08b440aab02b080a9c08b400aab02b040a17", - "0x153811680155605390142e1108aac0a110384422eb028451e11698155605", - "0x1556050886422d302aac0ac0029b822d202aac0abf02a6822d102aac0abe", - "0x45a00555815a0050b845ac0555815aa054e845aa0555815a6d403a7822d4", - "0x345a01702b580aab02b580a9808b480aab02b480a9a08b440aab02b440a9c", - "0x2ac0a1117045ae055581422a308845560527014681108aac0a1103845acd2", - "0x45b40555814221908b640aab02b61ae0750045b00555815b00550845b005", - "0x153811370155605370142e117601556056d8153a116d81556056cb680e9e", - "0x3b00e6a3705c0aec02aac0aec02a60220702aac0a0702a68226a02aac0a6a", - "0x155605448142e1108aac0a4b028cc2211558150e052704422ab028440e11", - "0x2ac0a4802a74221155814220708845de0508a3c22ee02aac0a4502a7022ed", - "0x440e05558140e054d0448a05558148a054e04512055581512050b845e005", - "0x13822115581422460884556050881c22f003915121702bc00aab02bc00a98", - "0x1556050981538117681556054b8142e1108aac0a2e02a9c2211558147405", - "0x3c40ea008bc80aab02bc80aa108bc80aab028450a1178815560508a8c22ee", - "0x2ac0af502a7422f502aac0af37a01d3c117a01556050886422f302aac0af2", - "0x440e05558140e054d045dc0555815dc054e045da0555815da050b845ec05", - "0x29c22115581422460884556050881c22f603bb9da1702bd80aab02bd80a98", - "0x3e00aab02be00aa108be00aab0284508117b815560508a8c2211558144c05", - "0x27422fb02aac0af97d01d3c117d01556050886422f902aac0af87b81d4011", - "0x140e054d04426055581426054e0452e05558152e050b845f80555815f605", - "0x640aa70884556050881c22fc0384d2e1702bf00aab02bf00a980881c0aab", - "0x2600a4e0884556050881c22117f014228f08bf40aab02a540a17088455605", - "0x45461108aac0a1123045fa05558142e050b84422ab028640aa7088455605", - "0x155605803fc0ea008c000aab02c000aa108c000aab0284460117f8155605", - "0x5c230402aac0b0302a74230302aac0b018101d3c11810155605088642301", - "0x1608054c0440e05558140e054d04426055581426054e045fa0555815fa05", - "0x2ac0a115184422ab028580a330884556050881c23040384dfa1702c100aab", - "0x460c0555815650503a8022b202aac0ab202a8422b202aac0a11170460a05", - "0x500a1708c240aab02c200a9d08c200aab02c1a0e074f0460e05558142219", - "0x1556058481530110381556050381534111b81556051b81538110a0155605", - "0x45560508b00223702aac0a115f84426055581422bf08c240e370a05c0b09", - "0x4422ab028440e1151a980f0a538680eab0381422070284422ab028442211", - "0x2ac0ea50284c221a02aac0a1a0285c221155814223b08a940aab028580a16", - "0x1556054f0146c114f015560550014281108aac0a1103844320585a814207", - "0x23c229802aac0a9c02a08229a02aac0aa102868229c02aac0a9d02a0c229d", - "0x68229602aac0a97029f4229702aac0a111e04422ab028440e1108c300a11", - "0x1c229502c342e055581d30053f8453005558152c05410453405558143205", - "0x444c058705526075581c2e1a039e4221702aac0a170981d821108aac0a11", - "0x1c222d02c3c682903aac0e9a0284c229302aac0a930285c2211558142207", - "0x2ac0a14028d8221402aac0a141b81d82110a01556051a014281108aac0a11", - "0x2ac0a11038446005880b846075581c52050984452055581452050d0440c05", - "0x23c223b02aac0a3302960223602aac0a2302868223302aac0a2e029702211", - "0x68223c02aac0a3a029d8223a02aac0a111e04422ab028440e1108c440a11", - "0x1c228e02c4922055581c76053904476055581478052c0446c05558146005", - "0xb4228902aac0a11518451e055581522050a04422ab028448c1108aac0a11", - "0x154e054e04526055581526050b8448c05558151e051b0448a05558146c05", - "0x1180aab029180aa108a240aab02a240a6e089140aab029140a7008a9c0aab", - "0x1c224e02c4d10055581c9605378449648250595605232248aa74984cd411", - "0x440e1141816288402aac0e8502aec22854381d560544014001108aac0a11", - "0x142207089e40b153f9f40eab03a080a1308a080aab02a1c0a16088455605", - "0x180a3708845560542014681108aac0a7f02a98221155814fa055384422ab", - "0x1542112e015560508a94227802aac0a115184422ab028540a78088455605", - "0x14b07603a78227602aac0a110c844b00555814b87803a80225c02aac0a5c", - "0x1200aab029200a9c089280aab029280a17089c00aab029c80a9d089c80aab", - "0x2ac0a1103844e007241282e05380155605380153011038155605038153411", - "0x1282c95089b80aab029b80a96089b80aab028452e1108aac0a7902a9c2211", - "0x1586115e015560508b08221155814220708aec00078b1bcd4075581cdc48", - "0x2ac0a6f02a70226a02aac0a6a0285c2211558157a05620455abd03aac0abc", - "0x440c05558140c05508442a05558142a05628440e05558140e054d044de05", - "0x142a1160b017ebe0baac0a84030555a07379a86ec608a100aab02a100a6e", - "0x2ac0ac20289822c402aac0a115184422ab028440e11618162ec202aac0ec1", - "0x4556056381468116431c0eab02b180a2908b180aab02b158807500458a05", - "0x142e11560155605650144611650155605648140c11648155605640145a11", - "0x2ac0aac02a6022c002aac0ac002a6822bf02aac0abf02a7022be02aac0abe", - "0x157c050b84596055581586054e84422ab028440e11563017ebe0b8155805", - "0x32c0aab02b2c0a9808b000aab02b000a9a08afc0aab02afc0a9c08af80aab", - "0x4422ab028180a3708845560542014681108aac0a110384596c05faf82e05", - "0x155605668154211668155605088b822cc02aac0a115184422ab028540a78", - "0x45a005558159ccf03a7822cf02aac0a110c8459c05558159acc03a8022cd", - "0x1c0a9a08aec0aab02aec0a9c088000aab028000a1708b440aab02b400a9d", - "0x149c1108aac0a1103845a2075d8002e05688155605688153011038155605", - "0x5c2211558142a053c04422ab028180a3708845560543814661108aac0a83", - "0x4422ab028440e1108c600a1147845a6055581490054e045a405558149405", - "0x2ac0a4a0285c22d402aac0a4e02a742211558140c051b84422ab028540a78", - "0x15a80555815a8054c0440e05558140e054d04490055581490054e0449405", - "0x14f01108aac0a8e0293822115581422460884556050881c22d4039209417", - "0x45a4055581526050b84422ab028d80aa7088455605030146e1108aac0a15", - "0x2ac0ad602a8422d602aac0a1142845aa055581422a308b4c0aab02a9c0a9c", - "0x3640aab02b5db0074f045b00555814221908b5c0aab02b59aa0750045ac05", - "0x153411698155605698153811690155605690142e116d01556056c8153a11", - "0x118221155814220708b680ed36905c0ada02aac0ada02a60220702aac0a07", - "0x28c2211558146e056384422ab028540a78088455605168154e1108aac0a11", - "0x2ac0aec6d81d401176015560576015421176015560508a1022db02aac0a11", - "0x45e20555815e0054e845e00555815daee03a7822ee02aac0a110c845da05", - "0x3c40a980881c0aab0281c0a9a08a9c0aab02a9c0a9c08a4c0aab02a4c0a17", - "0x2680aa70884556051b8158e1108aac0a1103845e20753a4c2e05788155605", - "0x2540a4e0884556050881c22118c814228f08bc80aab028980a17088455605", - "0x142e1108aac0a1302b1c22115581534055384422ab028dc0ac7088455605", - "0x28422f402aac0a1118045e6055581422a30884556050891822f202aac0a1a", - "0x3d5ec074f045ec0555814221908bd40aab02bd1e60750045e80555815e805", - "0x155605538153811790155605790142e117c01556057b8153a117b8155605", - "0x14220708be00ea77905c0af802aac0af802a60220702aac0a0702a6822a7", - "0x1422a3088455605098158e1108aac0a3702b1c2211558142c051984422ab", - "0x3ec0aab02be9f20750045f40555815f40550845f40555814222e08be40aab", - "0x142e117f81556057e8153a117e81556057dbf00e9e08bf00aab028443211", - "0x2ac0aff02a60220702aac0a0702a6822a302aac0aa302a7022a602aac0aa6", - "0x500f1a0985c0eab0381422070284422ab0284422117f81d46a60b815fe05", - "0x680a130885c0aab0285c0a17088680aab028580a160884556050881c2237", - "0x2ac0aa602a982211558154e055384422ab028440e115181636a65381d5607", - "0x2940ea008a840aab02a840aa108a840aab028454a1152815560508a8c2211", - "0x2ac0a9e02a74229e02aac0aa00c81d3c110c81556050886422a002aac0aa1", - "0x440e05558140e054d04426055581426054e0442e05558142e050b8453a05", - "0x4422ab02a8c0aa70884556050881c229d0384c2e1702a740aab02a740a98", - "0x1e38984d01d56074e04c2e164a84538055581538054b0453805558142297", - "0x1468110aa4c0eab02a540a2908a540aab02845461108aac0a11038452c97", - "0x155605148144611148155605130140c111301556050a8145a1108aac0a93", - "0x260220702aac0a0702a68229802aac0a9802a70229a02aac0a9a0285c2234", - "0xb8222d02aac0a115184422ab028440e111a01d309a0b8146805558146805", - "0x2ac0a110c8444605558140c2d03a80220602aac0a0602a84220602aac0a11", - "0x25c0aab02a5c0a17088cc0aab028c00a9d088c00aab0288c5c074f0445c05", - "0x25c2e051981556051981530110381556050381534114b01556054b0153811", - "0x14222e088d80aab02845461108aac0a16028cc2211558142207088cc0e96", - "0xf00aab0284432111d01556051d8d80ea0088ec0aab028ec0aa1088ec0aab", - "0x270221402aac0a140285c228e02aac0a9102a74229102aac0a3a1e01d3c11", - "0x1c6e140b8151c05558151c054c0440e05558140e054d0446e05558146e05", - "0x4556050881c22370a01e3a130b81d5607028440e0508845560508844228e", - "0x163ca65381d56070d01426110b81556050b8142e110d01556050b0142c11", - "0x14223b08a840aab02a940a3608a940aab02a980a140884556050881c22a3", - "0x163e115581d42051d0454e05558154e050d04542055581542055084422ab", - "0x153c05470453c0555814320548844320555814223c0884556050881c22a0", - "0x2ac0a111e04422ab02a800a890884556050881c221190014228f08a740aab", - "0x25d30075581d4e05098453a05558153405470453405558153805228453805", - "0x152e055304422ab02a600aa708845560508918221155814220708a580b21", - "0x24c0aa108a4c0aab028454a114a815560508a8c2211558153a052504422ab", - "0x2ac0a151301d3c1113015560508864221502aac0a934a81d4011498155605", - "0x4426055581426054e0442e05558142e050b84468055581452054e8445205", - "0x4556050881c22340384c2e17028d00aab028d00a980881c0aab0281c0a9a", - "0x155605168152c1116815560508a5c2211558152c055384422ab028448c11", - "0x153a052404422ab028440e11180b80f22118180eab038b426170b254222d", - "0x44740555814223c0884556051b01494111d8d80eab028cc0a4b088cc0aab", - "0x2ac0a060285c223b02aac0a3b02a38221155814223b088f00aab028e80a91", - "0x4556050881c228e02c8d22055581c7605440447805558147805470440c05", - "0x14228f08a240aab02a3c0a8e08a3c0aab028f00a48088455605488149c11", - "0x2240a8808a240aab028f00a8e088455605470149c1108aac0a11038442324", - "0x4422ab029140a4e088455605089182211558142207089180b25228155607", - "0x14228f0892c0aab0281c0a9a089200aab0288c0a9c089280aab028180a17", - "0x2ac0a060285c2211558148c052704422ab028448c1108aac0a11038442326", - "0x5d56050388c0c16498440e05558140e054d04446055581446054e0440c05", - "0x2ac0a8402b20221155814220708a0c0b27420155607428142a1142a1c9c88", - "0x28c224b02aac0a8702a68224802aac0a4e02a70224a02aac0a880285c2211", - "0x2ac0a7f028b4221155814fa051a044fe7d03aac0a82028a4228202aac0a11", - "0x4494055581494050b844b80555814f00511844f00555814f20503044f205", - "0x1209417029700aab029700a980892c0aab0292c0a9a089200aab029200a9c", - "0x153811440155605440142e112c0155605418153a1108aac0a1103844b84b", - "0x1610e4e4405c0a5802aac0a5802a60228702aac0a8702a68224e02aac0a4e", - "0x1c80aab028445c113b015560508a8c2211558153a052504422ab028440e11", - "0x1d3c1137015560508864227002aac0a723b01d4011390155605390154211", - "0x1460054e0445c05558145c050b844de0555814d4054e844d40555814e06e", - "0x1c226f038c05c17029bc0aab029bc0a980881c0aab0281c0a9a088c00aab", - "0x28422bb02aac0a111804400055581422a3088455605518154e1108aac0a11", - "0x2f17a074f0457a0555814221908af00aab02aec0007500457605558157605", - "0x1556050981538110b81556050b8142e115f0155605568153a11568155605", - "0x14220708af80e130b85c0abe02aac0abe02a60220702aac0a0702a682213", - "0x3000aa108b000aab028445c115f815560508a8c2211558142c051984422ab", - "0x2ac0ac16101d3c116101556050886422c102aac0ac05f81d4011600155605", - "0x446e05558146e054e04428055581428050b84588055581586054e8458605", - "0x1c0e0503b2422c4038dc281702b100aab02b100a980881c0aab0281c0a9a", - "0x15581109815560509815941108aac0a110384434370a05a50130b8582cab", - "0x14f01108aac0aa602b3022a050a9546a609aac0aa702b2c22a702aac0a13", - "0x4546055581546056684422ab02a800a3708845560550814f01108aac0aa5", - "0xd052260aa4d2a964ba61349c4ea7942ab028640acf088640aab02a8c0ace", - "0x2ac0a98028dc22115581538056804422ab02a740a780884556054f0146e11", - "0x1526056804422ab02a540ad10884556054b0146e1108aac0a97028dc2211", - "0xd00a3308845560514815a41108aac0a2602b482211558142a051984422ab", - "0x15560511815a811118155605030142c11030b40eab02a680ad3088455605", - "0x1c0221702aac0a1702a68221602aac0a1602a70222e02aac0a2e02868222e", - "0x154e1108aac0a11038446c05948cc60075581c5c05098445a05558145a05", - "0x1556051d01542111d01556051d8146c111d815560519814281108aac0a30", - "0x4422ab028440e114881654115581c78051d044783a03aac0a3a02b54223a", - "0x15560547015ac1147015560508a1c22115581474051b84422ab028b40a33", - "0x268221602aac0a1602a70221102aac0a110285c228902aac0a8f02b5c228f", - "0x4422ab028440e114485c2c110b81512055581512056c0442e05558142e05", - "0x1148c076d0448c3a03aac0a3a02b54224502aac0a116c84422ab02a440a89", - "0x2ac0a11038449005958455607250147411250155605250154211250155605", - "0x2ac0a116c84496055581422bc0884556051d0146e1108aac0a2d028cc2211", - "0x1380aab029380aa1089380aab02a2096076d0449605558149605508451005", - "0x2140ad608a140aab02845b61108aac0a11038450e05960455607270147411", - "0x1556050b0153811088155605088142e1141815560542015ae11420155605", - "0x14220708a0c2e160885c0a8302aac0a8302b60221702aac0a1702a682216", - "0x1f40aa1089f40aab02845d81141015560508a8c2211558150e054484422ab", - "0x2ac0a7f3c81d3c113c815560508864227f02aac0a7d4101d40113e8155605", - "0x442c05558142c054e04422055581422050b844b80555814f00576844f005", - "0x4556050881c225c0b8582217029700aab029700ad80885c0aab0285c0a9a", - "0x1d80eda089d874075581474056a844b0055581422ee088455605240151211", - "0x142207089c00b2d08aac0e72028e8227202aac0a7202a84227202aac0a58", - "0x3c0221155814dc0519844d46e03aac0a2d02b4c22115581474051b84422ab", - "0x2ac0a6f02bc422bb02aac0a0002b50220002aac0a6a02858226f02aac0a11", - "0x157a057984422ab028440e11568165cbd5e01d560737aec221679044de05", - "0x458005558157c051b0457e055581422a308af80aab02af40a1408af40aab", - "0x4422ab028440e11618165ec26081d5607602f00e7908b000aab02b000aa1", - "0x158c051684422ab02b140a3408b198a07558157e051484588055581422f4", - "0x31d88c20b85826f508b040aab02b040a1708b100aab02b100aa108b1c0aab", - "0x450e1108aac0aca028cc221155814220708b3196ac0b4c194c9640595607", - "0x155605608142e1167815560567015ae1167015560566815ac11668155605", - "0x5c0acf02aac0acf02b6022c902aac0ac902a6822c802aac0ac802a7022c1", - "0x45a2055581598d003a7822d002aac0a110c84422ab028440e1167b2590c1", - "0x32c0a9a08ab00aab02ab00a9c08b040aab02b040a1708b480aab02b440aed", - "0x14681108aac0a1103845a4cb563042e0569015560569015b011658155605", - "0x45a80555815a80550845a8055581422f608b4c0aab02845461108aac0abf", - "0x15da116b81556056ab580e9e08b580aab0284432116a81556056a34c0ea0", - "0x2ac0a1702a68221602aac0a1602a7022c302aac0ac30285c22d802aac0ad7", - "0x2ac0a115184422ab028440e116c05c2cc30b815b00555815b0056c0442e05", - "0x45b60555815b4d903a8022da02aac0ada02a8422da02aac0a117b845b205", - "0x2b40a1708bb80aab02bb40aed08bb40aab02b6dd8074f045d805558142219", - "0x15560577015b0110b81556050b81534110b01556050b0153811568155605", - "0x3c00aab02845f01108aac0a7002a24221155814220708bb82e165685c0aee", - "0x45e40555815e40550845e40555815e0f103b6822f11d01d56051d015aa11", - "0x1474051b84422ab028b40a330884556050881c22f302cc422ab03bc80a3a", - "0x3d42cab03bd02e160b3ec22f402aac0af402be822f402aac0a117c84422ab", - "0x3ec0aab028450e1108aac0af7028dc221155814220708be9f2f80b4c9eef6", - "0x153811088155605088142e117e81556057e015ae117e01556057d815ac11", - "0x3f5ecf50885c0afd02aac0afd02b6022f602aac0af602a6822f502aac0af5", - "0x16000576846000555815f4ff03a7822ff02aac0a110c84422ab028440e11", - "0x3e40aab02be40a9a08be00aab02be00a9c088440aab028440a1708c040aab", - "0x45560579815121108aac0a110384602f97c0442e0580815560580815b011", - "0x284230402aac0b028181db411818e80eab028e80ad508c080aab02845f811", - "0x1474051b84422ab028440e118281666115581e08051d0460805558160805", - "0x41e0c075581d641103bfc22b202aac0ab202a8422b202aac0a117e84422ab", - "0x3c0221155816120519845670903aac0a2d02b4c221155814220708c200b34", - "0x2ac0b3502bc4233702aac0b3602b50233602aac0ab302858233502aac0a11", - "0x1672057984422ab028440e119d81675399c01d56079acde0c16790466a05", - "0x467c0555814230008cf40aab02cf00a3608cf00aab02ce40a1408ce40aab", - "0x58270108ce00aab02ce00a1708cf40aab02cf40aa108cf80aab02cf80af1", - "0x5100aab028450e1108aac0a110384687422f85a83409f81d56079ec1e7c17", - "0x1538119c01556059c0142e11a30155605a2815ae11a28155605a2015ac11", - "0x51a813f9c05c0b4602aac0b4602b60234002aac0b4002a68233f02aac0b3f", - "0x168e05768468e055581686b403a7822b402aac0a110c84422ab028440e11", - "0x5080aab02d080a9a0897c0aab0297c0a9c08ce00aab02ce00a1708d200aab", - "0x45560583816041108aac0a110384691422fce02e05a40155605a4015b011", - "0x52a92075004694055581694055084694055581422f708d240aab028454611", - "0x155605a6815da11a68155605a5d300e9e08d300aab028443211a58155605", - "0x360221702aac0a1702a68221602aac0a1602a70233b02aac0b3b0285c234e", - "0x28c2211558145a051984422ab028440e11a705c2d3b0b8169c05558169c05", - "0x2ac0b50a781d4011a80155605a80154211a8015560508bd8234f02aac0a11", - "0x46a80555816a60576846a60555816a35203a78235202aac0a110c846a205", - "0x5500ad80885c0aab0285c0a9a088580aab028580a9c08c200aab02c200a17", - "0x14230308845560582815121108aac0a1103846a8170b4202e05aa0155605", - "0x455607ab0147411ab0155605ab0154211ab0155605aa8e80eda08d540aab", - "0x58235b02aac0a1178046b55903aac0a2d02b4c221155814220708d600b57", - "0x2d8221679046b60555816b605788456c0555816b8056a046b80555816b405", - "0x5780a1408d780aab02d780af30884556050881c22b702d7ebd5d03aac0f5b", - "0x155605b10142c11b1815560508c102362b081d5605ac815a611b00155605", - "0x3c8236002aac0b6002a84236302aac0b6302bc4236502aac0b6402b502364", - "0x46ce0555816ce057984422ab028440e11b4816d167b301d5607b1d96ba16", - "0x142305088455605b50146611b5da80eab02d840ad308ae00aab02d9c0a14", - "0x5b00aab02db00af108db80aab02db40ad408db40aab02dac0a1608db00aab", - "0x2ac0a1103846e405b8dc2de075581ed96eb3059e4115c01556055c0154211", - "0x284236f02aac0b6f0285c237302aac0b7002850237002aac0b7002bcc2211", - "0x2ac0a1103846f2b9bc05aef76badd02cab0385c2c0764846e60555816e605", - "0x5f6f97b09aac0b7a02b2c237a02aac0b7602ab0237602aac0b7602b282211", - "0x5fc0a37088455605bf014f01108aac0b7d029e0221155816f80559046ff7e", - "0x6042cab02e000b0808e000aab02dec0b0708dec0aab02dec0b06088455605", - "0x45740555815740550847080555816c0051b0457405558170205848470782", - "0x153411ba0155605ba0153811c28155605c28154211c28155605c22e80eda", - "0x2ac0f85028e8238302aac0b8302b14238202aac0b8202be8237502aac0b75", - "0x4712055581570051b04710055581704058484422ab028440e11c38170c11", - "0x456a05c58455607c50147411c50155605c50154211c50155605c4e200eda", - "0x171b8c03b68238d02aac0b73028d8238c02aac0b8302acc2211558142207", - "0x4556050881c239002e3c22ab03e380a3a08e380aab02e380aa108e380aab", - "0x5bc0a1708e4c0aab02e480ad708e480aab02e440ad608e440aab028450e11", - "0x155605c9815b011ba8155605ba8153411ba0155605ba0153811b78155605", - "0x6500aab02845461108aac0b9002a24221155814220708e4eeb74b785c0b93", - "0x443211cb0155605cae500ea008e540aab02e540aa108e540aab028466a11", - "0x2ac0b6f0285c239902aac0b9802bb4239802aac0b96cb81d3c11cb8155605", - "0x1732055581732056c046ea0555816ea054d046e80555816e8054e046de05", - "0x1e0221155816e6051b84422ab02ad40a890884556050881c2399badd2de17", - "0x6680aab02e680aa108e680aab028466c1158815560508a8c2211558170605", - "0x3b4239d02aac0b9bce01d3c11ce015560508864239b02aac0b9a5881d4011", - "0x16ea054d046e80555816e8054e046de0555816de050b8473c05558173a05", - "0x61c0a890884556050881c239ebadd2de1702e780aab02e780ad808dd40aab", - "0x166e1108aac0ab8028dc22115581706053c04422ab02dcc0a37088455605", - "0x47400555817400550847400555814233808e7c0aab02845461108aac0b82", - "0x15da11d18155605d0e880e9e08e880aab028443211d08155605d067c0ea0", - "0x2ac0b7502a68237402aac0b7402a70236f02aac0b6f0285c23a402aac0ba3", - "0x1570051b84422ab028440e11d25d6e96f0b81748055581748056c046ea05", - "0x6940e9e08e940aab02844321108aac0b73028dc221155816c0051b84422ab", - "0x2ac0b7802a70236f02aac0b6f0285c22b002aac0ba602bb423a602aac0b79", - "0x440e11582e6f16f0b81560055581560056c04572055581572054d046f005", - "0x45ee11d3815560508a8c221155816c0051b84422ab02ae00a37088455605", - "0x1556050886423a902aac0ba8d381d4011d40155605d40154211d40155605", - "0x46e40555816e4050b84758055581756057684756055581753aa03a7823aa", - "0x5ae41702eb00aab02eb00ad80885c0aab0285c0a9a088580aab028580a9c", - "0x2ac0a115184422ab02d800a37088455605b0814661108aac0a11038475817", - "0x475e05558175dad03a8023ae02aac0bae02a8423ae02aac0a117b8475a05", - "0x5a40a1708ec80aab02ec40aed08ec40aab02ebf60074f0476005558142219", - "0x155605d9015b0110b81556050b81534110b01556050b0153811b48155605", - "0x6cc0aab02845461108aac0b59028cc221155814220708ec82e16b485c0bb2", - "0x443211da015560557ecc0ea008abc0aab02abc0aa108abc0aab02845ee11", - "0x2ac0ab70285c23b702aac0bb602bb423b602aac0bb4da81d3c11da8155605", - "0x176e05558176e056c0442e05558142e054d0442c05558142c054e0456e05", - "0x28c2211558145a051984422ab02d600a890884556050881c23b70b8596e17", - "0x2ac0bb9dc01d4011dc8155605dc8154211dc815560508ce423b802aac0a11", - "0x477a055581778057684778055581775bb03a7823bb02aac0a110c8477405", - "0x6f40ad80885c0aab0285c0a9a088580aab028580a9c088440aab028440a17", - "0xb40a330884556051b0154e1108aac0a11038477a170b0442e05de8155605", - "0x28023bf02aac0bbf02a8423bf02aac0a117b8477c055581422a3088455605", - "0x7040aed08f040aab02f015c074f0455c0555814221908f000aab02eff7c07", - "0x1556050b81534110b01556050b0153811088155605088142e11e10155605", - "0x15560508864221155814220708f082e160885c0bc202aac0bc202b602217", - "0x4422055581422050b8478a055581788057684788055581435c303a7823c3", - "0x50221702f140aab02f140ad8088dc0aab028dc0a9a088500aab028500a9c", - "0x2ac0a1103844343703f18281303aac0e050881c0a1108aac0a11230478a37", - "0x178e115581d4e051d04426055581426050b8454e1703aac0a1702b542211", - "0x28c0e079e0454605558142c059d84422ab0285c0a370884556050881c22a6", - "0x1556050a0153811098155605098142e11508155605528167a11528155605", - "0x45560553015121108aac0a11038454214098580aa102aac0aa102cf82214", - "0x453a05e427832075581d40050984422ab028447611500155605038142c11", - "0x2ac0a9a02a0c229a02aac0a9c028d8229c02aac0a9e028502211558142207", - "0x440e1108f240a11478452c05558153005410452e055581432050d0453005", - "0x452e05558153a050d0452605558152a053e8452a0555814223c088455605", - "0x445205e50980aab03a580a7f088540aab02a5c0a2d08a580aab02a4c0a82", - "0xb40aab02845b2111a0155605130580ea0088455605089182211558142207", - "0x1c0221402aac0a1402a70221302aac0a130285c220602aac0a2d0b81db411", - "0x502613350440c05558140c05508446805558146805370442a05558142a05", - "0x4422ab028448c1108aac0a1103844602e118580a301708c2cab028186815", - "0x14661503cf0223302aac0a2902cfc2211558142c051a04422ab0285c0a37", - "0x500aab028500a9c0884c0aab0284c0a17088ec0aab028d80b3d088d80aab", - "0x4422ab0285c0a370884556050881c223b0a04c2c051d81556051d8167c11", - "0xf00aab028445c111d015560508a8c2211558140e051984422ab028580a34", - "0x1d3c1147015560508864229102aac0a3c1d01d40111e01556051e0154211", - "0x1434054e0446e05558146e050b8451205558151e05a00451e0555815228e", - "0x5c0a780884556050b0158811448686e1602a240aab02a240b3e088680aab", - "0x454aa35305b96a70d0dc2cab0381c0a076484422ab0284c0a37088455605", - "0x2ac0aa102b2c22a102aac0aa702ab022a702aac0aa702b282211558142207", - "0x4556054e814f01108aac0a9e029e0221155815400566045389d4f0654013", - "0x2680acf08a680aab028640ace088640aab028640acd0884556054e0146e11", - "0x25c0a780884556054c0146e111708c0c2d1a0a44c1549a552c974c2855605", - "0x146e1108aac0a15028dc22115581526051b84422ab02a580ad0088455605", - "0x3482211558145a051984422ab028d00ad008845560514815a21108aac0a26", - "0xc00eab02a540ad308845560517014661108aac0a2302b482211558140c05", - "0x270223b02aac0a3b02868223b02aac0a3602b50223602aac0a33028582233", - "0x1c76050984460055581460053804434055581434054d0446e05558146e05", - "0x1556051e014281108aac0a3a02a9c221155814220708a440bcc1e0e80eab", - "0x1db41147815560547815421144815560508bf0228f02aac0a8e028d8228e", - "0x440e11230179a115581c8a051d0448a05558148a05508448a0555815128f", - "0x3fc224a02aac0a4a02a84224a02aac0a117e84422ab028500a34088455605", - "0x450e4e03aac0a3002b4c221155814220708a200bce259200eab039282207", - "0x2ac0a8402b50228402aac0a8702858228502aac0a118204422ab029380a33", - "0x440e113f8179e7d4101d560742a0c9016790450a05558150a05788450605", - "0x1e00aab029e40a36089e40aab029f40a14089f40aab029f40af3088455605", - "0x2080a17089e00aab029e00aa1089700aab029700af1089700aab028460011", - "0x2ac0a1103844dc703905ba0762c01d56073c12cb81a1b84e0211410155605", - "0x142e1100015560537815ae1137815560535015ac1135015560508a1c2211", - "0x2ac0a0002b60227602aac0a7602a68225802aac0a5802a70228202aac0a82", - "0x14dcbb03a7822bb02aac0a110c84422ab028440e11001d8b0820b8140005", - "0x1c80aab029c80a9c08a080aab02a080a1708af40aab02af00aed08af00aab", - "0x2ac0a11038457a70392082e055e81556055e815b011380155605380153411", - "0x157c05508457c055581422f708ab40aab02845461108aac0a4b02c082211", - "0x1556055fb000e9e08b000aab0284432115f81556055f2b40ea008af80aab", - "0x268223702aac0a3702a70227f02aac0a7f0285c22c202aac0ac102bb422c1", - "0x4422ab028440e11610686e7f0b81584055581584056c0443405558143405", - "0x15560562015421162015560508bd822c302aac0a115184422ab028c00a33", - "0x458e05558158ac603a7822c602aac0a110c8458a055581588c303a8022c4", - "0x680a9a088dc0aab028dc0a9c08a200aab02a200a1708b200aab02b1c0aed", - "0x15121108aac0a1103845901a1ba202e0564015560564015b0110d0155605", - "0x2b194075581428051484592055581422bc08845560518014661108aac0a46", - "0xdc2ebd08b240aab02b240aa108b2c0aab02ab00a2d088455605650146811", - "0x45a2055581422870884556050881c22d067b382dd166b300eab03b2d921a", - "0x3300a9c088440aab028440a1708b4c0aab02b480ad708b480aab02b440ad6", - "0x45a6cd660442e0569815560569815b011668155605668153411660155605", - "0x2ac0ad502bb422d502aac0ad06a01d3c116a0155605088642211558142207", - "0x459e05558159e054d0459c05558159c054e04422055581422050b845ac05", - "0x4422ab02a440aa70884556050881c22d667b38221702b580aab02b580ad8", - "0x3600aab02845ee116b815560508a8c22115581428051a04422ab028c00a33", - "0x1d3c116d01556050886422d902aac0ad86b81d40116c01556056c0154211", - "0x146e054e04422055581422050b845d80555815b60576845b60555815b2da", - "0x1c22ec0d0dc221702bb00aab02bb00ad8088680aab028680a9a088dc0aab", - "0x3b80aab02a95da074f045da055581422190884556050a014681108aac0a11", - "0x153411530155605530153811088155605088142e1178015560577015da11", - "0x442e33381bc221753bc146a60885c0af002aac0af002b6022a302aac0aa3", - "0x1c0de110bb602c0702844dc70378442e33381bc2217088580e05089b8e06f", - "0x5fa61603814226e381bc2217199c0de110bf482c0702844dc70378442e33", - "0x1c0a11371c0de110b8cce06f0885fa81603814226e381bc2217199c0de11", - "0x142288378442c06170ccde1109f580e05089d8e06f0885ce06f0885baa16", - "0x1d80a04c2e16038142276381bc221717018288e381bc2237eb85c2c07" + "0x121", + "0x122", + "0x123", + "0x124", + "0x125", + "0x126", + "0x127", + "0x128", + "0x129", + "0x12a", + "0x12b", + "0x12c", + "0x12e", + "0x12f", + "0x130", + "0x131", + "0x132", + "0x133", + "0x134", + "0x135", + "0x136", + "0x137", + "0x138", + "0x139", + "0x13a", + "0x13b", + "0x13d", + "0x13e", + "0x13f", + "0x140", + "0x141", + "0x142", + "0x143", + "0x144", + "0x145", + "0x6db", + "0x6a9", + "0x6b9", + "0x6c0", + "0x6cf", + "0x79d", + "0x78c", + "0x76b", + "0x75c", + "0x74d", + "0x742", + "0x781", + "0x14b", + "0x258", + "0x365", + "0x3ae", + "0x459", + "0x697", + "0x6eb", + "0x4014", + "0x60140400c0a01c060140400c0901c060140400c0801c060140400c0200400", + "0x5010030580705405010030500504c0504c05048110400f0340e0340c02c07", + "0x400c1901c060140400c0d0601101c150140400c1701c060140400c0701c15", + "0x50100307007018050100305807018050100306c0704c05010030680701805", + "0x60140400c0701c060140400c0501c150140400c1e01c060140400c1d01c06", + "0xf09c05098250900508c220342101407018050100308007018050100307c07", + "0x2609406014230882e01413014060142d0441003c0d0b00d0ac2a0142904428", + "0x501805018050d0050b80505005018050cc110c80f0c4050c0110a00f0bc05", + "0x3a0443903c38014260d837014260d8340141501415014340142e0143501406", + "0x50100301805104400fc110f80f0f405098360180505005050050f0050ec05", + "0x3e03c4701434014420444403c460142f014450444410c420443e03c1101c06", + "0x111344301805098361300512c0512811110430bc0512405108111100f12011", + "0x5201c060140400c5101c060140400c4601406014500444d10c460144f0144e", + "0x315807018050100301805098551180511805150111344314c070180501003", + "0x4c01459014580444410c06014420442803c34014420442803c5701c0601404", + "0x1118811184600085f178070180501003130051740517011110430085b0345a", + "0x6a0180501469018050146819c050146604405014660d005014650446404463", + "0x51986d014051b006014051ac4f014051a831014051a831014051980601405", + "0x661c80501466014071c40501c70130050146f124050146f018050146e01805", + "0x51e4590140519478014051dc14058051d8111d47401405198111cc7101405", + "0x6c1e8050146c044071c40501c70174050146f0d0050146f0bc050146a0bc05", + "0x501c7f014071c046014051bc111f8111f406014051f034014051a87b01405", + "0x79044831fc050146a04482044071fc0501c70204050146a044801fc0501466", + "0x71c086014051b085014051b084014051b046014051a87f014051dc7f01405", + "0x70050050146a0448821c05014770140721c0501c7021c05014660440721c05", + "0x5198340140519889014051dc0501c89014071c089014051981101c8901407", + "0x650448c22c050146c11c050147712c050146522805014770e016014760bc05", + "0x90014051e490014051bc060140523c11238060140523449014051a84c01405", + "0x50146604492164050146a244050146a06816014760500501466240050146a", + "0x370140519437014051a43c014051983b014051a83d014051943d014051a493", + "0x6f01805014940c4050147c0d00501479054050146a0d4050146a0b8050146a", + "0x51b097014051b01125895014051b078014051981101c78014071c05901405", + "0x66018050149b0540501466268050146c264050146c014071e00501c7026005", + "0x19014051b0a0014051b09f014051b09e014051b0112749c014051b04f01405", + "0x50146a044a6294050146c044a428c050146c288050146c044a104c0501466", + "0x38014051a43b014051983c014051a81a014051b0a9014051b0a8014051b0a7", + "0x6c01c050146c04c050146a058050146c05c050146c044ab044aa0e00501465", + "0x71c08a014051981101c8a014071c04b014051bc1101c47014071c00501405", + "0x72b4070141101c05044112b40504411044ac014072280501c700140711c05", + "0x50580505c11068052b40504c0505811044ad0141101c110e01401cae04c17", + "0xad01ca9014380441a014ad0141a0141404417014ad0141701413044a9014ad", + "0x5294050681128c052b4050680505811044ad0141101c1129c052bca52a007", + "0x52b40528c05050112a0052b4052a0052a011044ad014a2014a9044a2014ad", + "0xad01419014a5044112b405044070449f014242801901cad01ca801438044a3", + "0xa20449c014ad0141128c11278052b40528c0505811044ad014a0014a704411", + "0x1127c11264052b4052689c01ca00449a014ad0149a014190449a014ad01411", + "0x170141304495014ad014970149c04497014ad014992600727811260052b405", + "0x5254052641101c052b40501c0526811278052b405278050501105c052b405", + "0x505811044ad0149f014a5044112b405044070449501c9e05c1701495014ad", + "0x509c0525c11054052b405054050501109c052b4050449804415014ad014a3", + "0x11044ad0141101c110182e01cb00d42a01cad01c27054170589504427014ad", + "0x9a04424014ad01424014140442a014ad0142a0141304424014ad0143501416", + "0xad01c3701427044370d0310bc172b40501c240a8160541101c052b40501c05", + "0x52b405044a30443d014ad0143101416044112b405044070443b014590f005", + "0x72b405244050d411244052b4052409301ca004490014ad0143c0142a04493", + "0x4b014ad014470142404447014ad0144601406044112b40522c050b8111188b", + "0x110f4052b4050f405050110bc052b4050bc0504c11124052b40512c050bc11", + "0x504407044490d03d0bc1701449014ad014490149904434014ad014340149a", + "0x52b4050bc0504c11228052b4050ec0527011130052b4050c40505811044ad", + "0x8a014ad0148a0149904434014ad014340149a0444c014ad0144c014140442f", + "0xad0141128c1113c052b4050180505811044ad0141101c11228341302f05c05", + "0x52b40521c8901ca004487014ad014870141904487014ad014110c41122405", + "0x7f014ad014840149c04484014ad014862140727811214052b4050449f04486", + "0x1101c052b40501c052681113c052b40513c05050110b8052b4050b80504c11", + "0xad014a7014a5044112b405044070447f01c4f0b8170147f014ad0147f01499", + "0x190447a014ad014110d0111ec052b405044a304481014ad0141a0141604411", + "0x727811164052b4050449f0445d014ad0147a1ec07280111e8052b4051e805", + "0x50501105c052b40505c0504c111d0052b4051e005270111e0052b40517459", + "0x8105c1701474014ad014740149904407014ad014070149a04481014ad01481", + "0xa304472014ad0143801416044112b405058050dc11044ad0141101c111d007", + "0x6d1c407280111b4052b4051b405064111b4052b4050443104471014ad01411", + "0x52c005270112c0052b40519c0001c9e04400014ad0141127c1119c052b405", + "0xad014070149a04472014ad014720141404414014ad0141401413044b1014ad", + "0x701411044ad01411044112c4071c81405c052c4052b4052c4052641101c05", + "0x1a014ad0141301416044112b4050440704438050072c81305c072b40701411", + "0x11068052b405068050501105c052b40505c0504c112a4052b4050580505c11", + "0xa3014ad0141a01416044112b40504407044a7014b3294a801cad01ca901438", + "0x14044a8014ad014a8014a8044112b405288052a411288052b4052940506811", + "0x11044ad0141101c1127c052d0a0064072b4072a0050e01128c052b40528c05", + "0x52a011044ad0149c014a90449c014ad014a00141a0449e014ad014a301416", + "0x98014b52649a01cad01c19014380449e014ad0149e0141404419014ad01419", + "0x50f011254052b405264050681125c052b4052780505811044ad0141101c11", + "0xad0149a014a804415014ad0141501419044112b4050443b04415014ad01495", + "0xad0141101c1109c052d8112b407054050f41125c052b40525c050501126805", + "0x110b8052b4050d405240110d4052b405044930442a014ad014970141604411", + "0x504407044112dc050448b04424014ad0142e0149104406014ad0142a01414", + "0x110c4052b405044930442f014ad0149701416044112b40509c0511811044ad", + "0x3804424014ad014340149104406014ad0142f0141404434014ad0143101447", + "0x529411044ad0141112c11044ad0141101c110ec052e03c0dc072b40726805", + "0x52b4050180505811044ad0142401449044112b4050f00529c11044ad01437", + "0xa004490014ad014900141904490014ad014112881124c052b405044a30443d", + "0x9c04446014ad0149122c072781122c052b4050449f04491014ad0149024c07", + "0x5268110f4052b4050f4050501105c052b40505c0504c1111c052b40511805", + "0x112b405044070444701c3d05c1701447014ad014470149904407014ad01407", + "0x5044980444b014ad0140601416044112b4050ec0529411044ad0141112c11", + "0x4912c170589504449014ad01449014970444b014ad0144b0141404449014ad", + "0x4c04487014ad0148a01416044112b405044070448913c072e48a130072b407", + "0x1124c11044ad014850144904484214072b4052180522811218052b40509005", + "0x52b4052100524411044ad014110ec11204052b4051fc0511c111fc052b405", + "0x81014ad014810149104487014ad01487014140444c014ad0144c0141304484", + "0x11044ad0147b01489044112b405044070447a014ba1ec052b4072100513c11", + "0x9104478014ad0145d0141404459014ad014810144c0445d014ad0148701416", + "0x112b4051e80522411044ad0141101c11044bb0141122c111d0052b40516405", + "0x111d0052b40520405244111e0052b4051c805050111c8052b40521c0505811", + "0x522411044ad0141112c11044ad0141101c111b4052f071014ad01c740144f", + "0xad0144c0141304400014ad0141121c1119c052b4051e00505811044ad01471", + "0x52b40500005064112f4052b40501c05268112c4052b40519c05050112c005", + "0xad0146d01489044112b4050444b044112b40504407044112fc050448b044be", + "0xc0014ad014c0014140444c014ad0144c01413044c0014ad014780141604411", + "0xc401427044c430cc2304172b40501cc0130160541101c052b40501c0526811", + "0xc50142a044c8014ad014c201416044112b40504407044c7014c6314052b407", + "0x530c05268112c4052b40532005050112c0052b4053040504c11324052b405", + "0xad014be3280728011328052b405044a3044be014ad014c901419044bd014ad", + "0x52b4053300501811044ad014cb0142e044cc32c072b4052bc050d4112bc05", + "0xb0014ad014b001413044cf014ad014ce0142f044ce014ad014cd01424044cd", + "0x533c052b40533c05264112f4052b4052f405268112c4052b4052c40505011", + "0xad014c70149c044d0014ad014c201416044112b40504407044cf2f4b12c017", + "0x52b40530c0526811340052b4053400505011304052b4053040504c1134405", + "0x2401449044112b40504407044d130cd030417014d1014ad014d101499044c3", + "0xd4014ad014110c41134c052b405044a3044d2014ad0148901416044112b405", + "0x11358052b4050449f044d5014ad014d434c0728011350052b4053500506411", + "0x1113c052b40513c0504c11360052b40535c052701135c052b405354d601c9e", + "0x17014d8014ad014d80149904407014ad014070149a044d2014ad014d201414", + "0xae014ad0149e01416044112b4052600529411044ad0141101c11360073484f", + "0x728011368052b4053680506411368052b40504486044d9014ad0141128c11", + "0x527011374052b40536cdc01c9e044dc014ad0141127c1136c052b405368d9", + "0x70149a044ae014ad014ae0141404417014ad0141701413044de014ad014dd", + "0x11044ad0141101c11378072b81705c05378052b405378052641101c052b405", + "0x504485044e0014ad0141128c1137c052b40528c0505811044ad0149f014a5", + "0xad0141127c11388052b405384e001ca0044e1014ad014e101419044e1014ad", + "0xad0141701413044e5014ad014e40149c044e4014ad014e238c072781138c05", + "0x52b405394052641101c052b40501c052681137c052b40537c050501105c05", + "0x50680505811044ad014a7014a5044112b40504407044e501cdf05c17014e5", + "0xe8014ad014e801419044e8014ad014110d01139c052b405044a3044e6014ad", + "0xeb014ad014e93a807278113a8052b4050449f044e9014ad014e839c0728011", + "0x11398052b405398050501105c052b40505c0504c113b0052b4053ac0527011", + "0x504407044ec01ce605c17014ec014ad014ec0149904407014ad014070149a", + "0x113b8052b405044a3044ed014ad0143801416044112b405058050dc11044ad", + "0x9f044f0014ad014ef3b807280113bc052b4053bc05064113bc052b40504431", + "0x504c113cc052b4053c805270113c8052b4053c0f101c9e044f1014ad01411", + "0xf30149904407014ad014070149a044ed014ad014ed0141404414014ad01414", + "0x1701cad01c050440701411044ad01411044113cc073b41405c053cc052b405", + "0xad01416014170441a014ad0141301416044112b4050440704438050073d013", + "0x11068052b405068050501105c052b40505c0504c11044ad014110ec112a405", + "0xa3014ad0141a01416044112b40504407044a7014f5294a801cad01ca901438", + "0x11280052b4050640521011064052b405288050f011288052b4052940506811", + "0x8b0449c014ad014a00147f0449e014ad014a8014a80449f014ad014a301414", + "0x99014ad0141124c11268052b4050680505811044ad0141101c11044f601411", + "0x11278052b40529c052a01127c052b4052680505011260052b4052640520411", + "0x11044ad0141101c11254053dc97014ad01c9c0147b0449c014ad014980147f", + "0x1701c7a04415014ad014150141404415014ad0149f01416044112b4050444b", + "0x505811044ad0142a0145d044112b4050440704435014f80a82701cad01c97", + "0x9e014380442e014ad0142e0141404427014ad01427014130442e014ad01415", + "0x5068110c4052b4050b80505811044ad0141101c110bc053e424018072b407", + "0x52b405018052a011044ad014110ec11044ad01434014a904434014ad01424", + "0x5044070443b014fa0f03701cad01c060143804431014ad014310141404406", + "0x52b4050f4050501124c052b4050f005164110f4052b4050c40505811044ad", + "0x7044113ec050448b0448b014ad014930147804491014ad01437014a804490", + "0xad014470147404447014ad0141124c11118052b4050c40505811044ad01411", + "0x52b40512c051e011244052b4050ec052a011240052b405118050501112c05", + "0x11044ad0141112c11044ad0141101c11130053f049014ad01c8b014720448b", + "0x501811224052b405044a30444f014ad014490141a0448a014ad0149001416", + "0x8a0141404427014ad014270141304486014ad0144f0143c04487014ad01491", + "0x52180506411224052b405224051b41121c052b40521c051c411228052b405", + "0x81014ad01c7f014000447f21085058ad01486224872282704c6704486014ad", + "0x5d01cad01481014b00447a014ad0148401416044112b405044070447b014fd", + "0xad0141101c111d0053f878014ad01c59014b10447a014ad0147a0141404459", + "0x72014ad014720141404471014ad0145d0141704472014ad0147a0141604411", + "0x112b4051b40529411044ad0141101c11000053fc671b4072b4071c4050e011", + "0x1128c112c0052b4051c80505811044ad014780142e044112b40519c0529c11", + "0x52f4b101ca0044bd014ad014bd01419044bd014ad01411288112c4052b405", + "0xad014c10149c044c1014ad014be3000727811300052b4050449f044be014ad", + "0x52b40501c05268112c0052b4052c00505011214052b4052140504c1130805", + "0x14a5044112b40504407044c201cb021417014c2014ad014c20149904407", + "0x52b40530c0505011310052b40504498044c3014ad0147201416044112b405", + "0x11324c801d0031cc501cad01cc430c8505895044c4014ad014c401497044c3", + "0x51e0050d4112bc052b405044bd044ca014ad014c701416044112b40504407", + "0xad014ca01414044cd014ad014cc01406044112b40532c050b811330cb01cad", + "0xcd2bc07328172f811314052b4053140504c112bc052b4052bc050641132805", + "0x11338052b4053380505011044ad0141101c11348d134016404cf338072b407", + "0x9a044d3014ad014d301414044c5014ad014c501413044d3014ad014ce01416", + "0xad01cd701427044d7358d5350172b40533cd3314160541133c052b40533c05", + "0x52b405044a3044d9014ad014d501416044112b40504407044ae0150236005", + "0x72b405370050d411370052b40536cda01ca0044db014ad014d80142a044da", + "0xe0014ad014df01424044df014ad014de01406044112b405374050b811378dd", + "0x11364052b4053640505011350052b4053500504c11384052b405380050bc11", + "0x504407044e1358d935017014e1014ad014e101499044d6014ad014d60149a", + "0xad014e3014c1044e438c072b4052b80530011388052b4053540505811044ad", + "0xe7014ad014d60149a044e6014ad014e201414044e5014ad014d40141304411", + "0x53400505011044ad0141101c11045030141122c113a0052b405390051b411", + "0xad014e901414044e5014ad014c501413044e9014ad014d001416044d0014ad", + "0xea014ad0141127c113a0052b405348051b41139c052b405344052681139805", + "0xe5014ad014e501413044ec014ad014eb0149c044eb014ad014e83a80727811", + "0x53b0052b4053b0052641139c052b40539c0526811398052b4053980505011", + "0x52b4053240505811044ad014780142e044112b40504407044ec39ce639417", + "0xa0044ef014ad014ef01419044ef014ad014110c4113b8052b405044a3044ed", + "0x9c044f2014ad014f03c407278113c4052b4050449f044f0014ad014ef3b807", + "0x5268113b4052b4053b40505011320052b4053200504c113cc052b4053c805", + "0x112b40504407044f301ced32017014f3014ad014f30149904407014ad01407", + "0x504c11410052b4051e80505811044ad0145d01437044112b4051d00522411", + "0x112b405044070441141c050448b04506014ad015040141404505014ad01485", + "0x11214052b4052140504c11424052b4051ec0527011420052b4052100505811", + "0x1701509014ad015090149904407014ad014070149a04508014ad0150801414", + "0xa5044112b4051300522411044ad0141112c11044ad0141101c114240742085", + "0x10a0141404505014ad01427014130450a014ad0149001416044112b40524405", + "0x52b4054300506411430052b405044860450b014ad0141128c11418052b405", + "0x52b4054350e01c9e0450e014ad0141127c11434052b4054310b01ca00450c", + "0x106014ad015060141404505014ad015050141304510014ad0150f0149c0450f", + "0x1101c11440074190505c05440052b405440052641101c052b40501c0526811", + "0x112014ad0141128c11444052b4050b80505811044ad0142f014a5044112b405", + "0x11450052b40544d1201ca004513014ad015130141904513014ad0141121411", + "0x1304517014ad015160149c04516014ad015144540727811454052b4050449f", + "0x52641101c052b40501c0526811444052b405444050501109c052b40509c05", + "0x11044ad0149e014a5044112b405044070451701d1109c1701517014ad01517", + "0x8b04519014ad015180141404460014ad014350141304518014ad0141501416", + "0xa5044112b4052540522411044ad0141112c11044ad0141101c110451a01411", + "0x11b0141404460014ad01417014130451b014ad0149f01416044112b40527805", + "0x52b4054740506411474052b405044340451c014ad0141128c11464052b405", + "0x52b4052d91e01c9e0451e014ad0141127c112d8052b4054751c01ca00451d", + "0x119014ad015190141404460014ad014600141304520014ad0151f0149c0451f", + "0x1101c11480074646005c05480052b405480052641101c052b40501c0526811", + "0x122014ad0141128c11484052b4050e00505811044ad0141601437044112b405", + "0x112dc052b40548d2201ca004523014ad015230141904523014ad014110c411", + "0x1304526014ad015250149c04525014ad014b74900727811490052b4050449f", + "0x52641101c052b40501c0526811484052b4054840505011050052b40505005", + "0x38014ad014113081104c052b405044c20452601d210501701526014ad01526", + "0xa801d272a41a01cad01c050440701411044ad0141104411044ad0141130c11", + "0x3b044a3014ad0141601417044a7014ad014a901416044112b40504407044a5", + "0x728c050e01129c052b40529c0505011068052b4050680504c11044ad01411", + "0x190141a0449f014ad014a701416044112b40504407044a001528064a201cad", + "0x527c0505011268052b4052700521011270052b405278050f011278052b405", + "0x114a4050448b04497014ad0149a0147f04498014ad014a2014a804499014ad", + "0x150148104415014ad0141124c11254052b40529c0505811044ad0141101c11", + "0x509c051fc11260052b405280052a011264052b405254050501109c052b405", + "0xad0141112c11044ad0141101c110a8054a814014ad01c970147b04497014ad", + "0x52b4050d40505011050052b4050503801cc404435014ad014990141604411", + "0x50d40505811044ad0141101c11090054ac060b8072b4070501a01c7a04435", + "0xad01c98014380442f014ad0142f014140442e014ad0142e014130442f014ad", + "0x50d005068110f0052b4050bc0505811044ad0141101c110dc054b0340c407", + "0xad014110ec110ec052b40505c050f01105c052b40505c1301cc404417014ad", + "0x3d01cad01c31014380443c014ad0143c0141404431014ad01431014a804411", + "0x52b40524c0516411244052b4050f00505811044ad0141101c11240054b493", + "0x4b014ad0148b0147804447014ad0143d014a804446014ad01491014140448b", + "0xad0141124c11124052b4050f00505811044ad0141101c110452e0141122c11", + "0x52b405240052a011118052b4051240505011228052b405130051d01113005", + "0xad0141101c11224054bc4f014ad01c4b014720444b014ad0148a0147804447", + "0xa304486014ad0144f0141a04487014ad0144601416044112b4050444b04411", + "0x2e014130447f014ad014860143c04484014ad014470140604485014ad01411", + "0x5214051b411210052b405210051c41121c052b40521c05050110b8052b405", + "0x7a1ec81058ad0147f2148421c2e04c670447f014ad0147f0141904485014ad", + "0x78014ad0147b01416044112b405044070445901530174052b4071e80500011", + "0x71014ad01c72014b104478014ad0147801414044721d0072b405174052c011", + "0x14ad014740141704467014ad0147801416044112b405044070446d01531", + "0xad0141101c112f4054c8b12c0072b407000050e01119c052b40519c0505011", + "0x52a411044ad014710142e044112b4052c40529c11044ad014b0014a504411", + "0x52b405044a3044be014ad0146701416044112b4050180517411044ad0143b", + "0xc2014ad014c13000728011304052b4053040506411304052b405044a2044c0", + "0x11314052b4053100527011310052b405308c301c9e044c3014ad0141127c11", + "0x9904407014ad014070149a044be014ad014be0141404481014ad0148101413", + "0x112b4052f40529411044ad0141101c11314072f88105c05314052b40531405", + "0x97044c7014ad014c701414044c8014ad014112601131c052b40519c0505811", + "0x504407044cb2bc074ccca324072b407320c72041625411320052b40532005", + "0xce01cad014cd014c7044cd014ad0141131411330052b4053280505811044ad", + "0x11330052b4053300505011324052b4053240504c11044ad014ce014c8044cf", + "0x6d0443b014ad0143b0141904406014ad01406014c904407014ad014070149a", + "0x27044d3348d1340172b4051c43b018cf01ccc32438328111c4052b4051c405", + "0xa3044d6014ad014d101416044112b40504407044d501534350052b40734c05", + "0x50d4112b8052b405360d701ca0044d8014ad014d40142a044d7014ad01411", + "0xdb01424044db014ad014da01406044112b405364050b811368d901cad014ae", + "0x53580505011340052b4053400504c11374052b405370050bc11370052b405", + "0xdd348d634017014dd014ad014dd01499044d2014ad014d20149a044d6014ad", + "0x504c1137c052b4053540527011378052b4053440505811044ad0141101c11", + "0xdf01499044d2014ad014d20149a044de014ad014de01414044d0014ad014d0", + "0xa9044112b4051c4050b811044ad0141101c1137cd2378d005c0537c052b405", + "0xad0141128c11380052b40532c0505811044ad014060145d044112b4050ec05", + "0x52b405388e101ca0044e2014ad014e201419044e2014ad014110c41138405", + "0xe6014ad014e50149c044e5014ad014e33900727811390052b4050449f044e3", + "0x1101c052b40501c0526811380052b40538005050112bc052b4052bc0504c11", + "0xad0146d01489044112b40504407044e601ce02bc17014e6014ad014e601499", + "0x505811044ad014060145d044112b4050ec052a411044ad014740143704411", + "0x50448b044e9014ad014e701414044e8014ad0148101413044e7014ad01478", + "0x505811044ad0143b014a9044112b4050180517411044ad0141101c1104535", + "0xea0141404481014ad0148101413044eb014ad014590149c044ea014ad0147b", + "0x73a88105c053ac052b4053ac052641101c052b40501c05268113a8052b405", + "0x50ec052a411044ad0148901489044112b4050444b044112b40504407044eb", + "0x113b0052b4051180505811044ad01447014a5044112b4050180517411044ad", + "0x11218113b4052b405044a3044e9014ad014ec01414044e8014ad0142e01413", + "0x50449f044ef014ad014ee3b407280113b8052b4053b805064113b8052b405", + "0x53a00504c113c8052b4053c405270113c4052b4053bcf001c9e044f0014ad", + "0xad014f20149904407014ad014070149a044e9014ad014e901414044e8014ad", + "0x60145d044112b4050dc0529411044ad0141101c113c8073a4e805c053c805", + "0x104014ad0141128c113cc052b4050bc0505811044ad01413014af044112b405", + "0x11418052b4054150401ca004505014ad015050141904505014ad0141121411", + "0x130450a014ad015090149c04509014ad015064200727811420052b4050449f", + "0x52641101c052b40501c05268113cc052b4053cc05050110b8052b4050b805", + "0x11044ad01498014a5044112b405044070450a01cf30b8170150a014ad0150a", + "0x505011430052b4050900504c1142c052b4050d40505811044ad01413014af", + "0x89044112b4050444b044112b40504407044114d8050448b0450d014ad0150b", + "0xad01438014af044112b40504c052bc11044ad01498014a5044112b4050a805", + "0x10d014ad0150e014140450c014ad0141a014130450e014ad014990141604411", + "0x728011440052b4054400506411440052b405044340450f014ad0141128c11", + "0x52701144c052b4054451201c9e04512014ad0141127c11444052b4054410f", + "0x70149a0450d014ad0150d014140450c014ad0150c0141304514014ad01513", + "0x11044ad0141101c11450074350c05c05450052b405450052641101c052b405", + "0x52940505811044ad0141601437044112b40504c052bc11044ad01438014af", + "0x117014ad015170141904517014ad014110c411458052b405044a304515014ad", + "0x119014ad015181800727811180052b4050449f04518014ad015174580728011", + "0x11454052b40545405050112a0052b4052a00504c1146c052b4054640527011", + "0x5044110451b01d152a0170151b014ad0151b0149904407014ad014070149a", + "0x505811044ad0141101c110e01401d3704c1701cad01c050440701411044ad", + "0x1a0141404417014ad0141701413044a9014ad01416014170441a014ad01413", + "0x529411044ad0141101c1129c054e0a52a0072b4072a4050e011068052b405", + "0x52b405044a3044a3014ad0141a01416044112b4052940529c11044ad014a8", + "0xa0014ad014192880728011064052b4050640506411064052b405044a2044a2", + "0x11270052b4052780527011278052b4052809f01c9e0449f014ad0141127c11", + "0x9904407014ad014070149a044a3014ad014a30141404417014ad0141701413", + "0x112b40529c0529411044ad0141101c112700728c1705c05270052b40527005", + "0x970449a014ad0149a0141404499014ad0141126011268052b4050680505811", + "0x50440704415254074e497260072b4072649a05c1625411264052b40526405", + "0x3501cad0142a014350442a014ad0141128c1109c052b40525c0505811044ad", + "0x11090052b4050180509011018052b4050b80501811044ad014350142e0442e", + "0x9a04427014ad014270141404498014ad01498014130442f014ad014240142f", + "0xad0141101c110bc0709c9805c050bc052b4050bc052641101c052b40501c05", + "0x1904437014ad014110c4110d0052b405044a304431014ad014150141604411", + "0x7278110ec052b4050449f0443c014ad014370d007280110dc052b4050dc05", + "0x505011254052b4052540504c1124c052b4050f405270110f4052b4050f03b", + "0x312541701493014ad014930149904407014ad014070149a04431014ad01431", + "0xa304490014ad0143801416044112b405058050dc11044ad0141101c1124c07", + "0x8b244072801122c052b40522c050641122c052b4050443104491014ad01411", + "0x512c052701112c052b4051184701c9e04447014ad0141127c11118052b405", + "0xad014070149a04490014ad014900141404414014ad014140141304449014ad", + "0x701411044ad0141104411124072401405c05124052b405124052641101c05", + "0x1a014ad0141301416044112b4050440704438050074e81305c072b40701411", + "0x11068052b405068050501105c052b40505c0504c112a4052b4050580505c11", + "0xa3014ad0141a01416044112b40504407044a70153b294a801cad01ca901438", + "0x506411044ad014110ec11064052b405288050f011288052b4052940506811", + "0x190143d044a3014ad014a301414044a8014ad014a8014a804419014ad01419", + "0xad0141124c1127c052b40528c0505811044ad0141101c11280054f0112b407", + "0x52b4052700524411268052b40527c0505011270052b405278052401127805", + "0x528c0505811044ad014a001446044112b40504407044114f4050448b04499", + "0x52b4052600505011254052b40525c0511c1125c052b4050449304498014ad", + "0x5044070442a0153e09c1501cad01ca80143804499014ad01495014910449a", + "0x512411044ad01427014a7044112b4050540529411044ad0141112c11044ad", + "0x52b405044a20442e014ad0141128c110d4052b4052680505811044ad01499", + "0x2f014ad0141127c11090052b4050182e01ca004406014ad014060141904406", + "0x17014ad014170141304434014ad014310149c04431014ad014240bc0727811", + "0x50d0052b4050d0052641101c052b40501c05268110d4052b4050d40505011", + "0x11044ad0142a014a5044112b4050444b044112b405044070443401c3505c17", + "0x525c110dc052b4050dc05050110f0052b4050449804437014ad0149a01416", + "0xad0141101c112409301d3f0f43b01cad01c3c0dc17058950443c014ad0143c", + "0x4601cad0148b0148a0448b014ad014990144c04491014ad0143d0141604411", + "0x3b04449014ad0144b014900444b014ad0141124c11044ad014460144904447", + "0x524405050110ec052b4050ec0504c1111c052b40511c0524411044ad01411", + "0x1101c11228055004c014ad01c470144f04449014ad014490149104491014ad", + "0x52b405124051301113c052b4052440505811044ad0144c01489044112b405", + "0x704411504050448b04486014ad014890149104487014ad0144f0141404489", + "0xad014850141404485014ad0149101416044112b4052280522411044ad01411", + "0x5044070447f01542210052b4072180513c11218052b405124052441121c05", + "0x1304481014ad0148701416044112b4052100522411044ad0141112c11044ad", + "0x1122c11174052b40501c05268111e8052b40520405050111ec052b4050ec05", + "0x505811044ad0147f01489044112b4050444b044112b405044070441150c05", + "0x70149a04459014ad01459014140443b014ad0143b0141304459014ad01487", + "0x6d014ad01c7101427044711c8741e0172b40501c590ec160541101c052b405", + "0x11000052b4051d00505811044ad0146d014cb044112b405044070446701544", + "0xa30445d014ad014720149a0447a014ad01400014140447b014ad0147801413", + "0xbd01406044112b4052c4050b8112f4b101cad014b001435044b0014ad01411", + "0x51ec0504c11304052b405300050bc11300052b4052f805090112f8052b405", + "0xad014c1014990445d014ad0145d0149a0447a014ad0147a014140447b014ad", + "0x527011308052b4051d00505811044ad0141101c113045d1e87b05c0530405", + "0x720149a044c2014ad014c20141404478014ad0147801413044c3014ad01467", + "0x11044ad0141101c1130c723087805c0530c052b40530c05264111c8052b405", + "0x504431044c5014ad0141128c11310052b4052400505811044ad0149901449", + "0xad0141127c11320052b40531cc501ca0044c7014ad014c701419044c7014ad", + "0xad0149301413044af014ad014ca0149c044ca014ad014c8324072781132405", + "0x52b4052bc052641101c052b40501c0526811310052b405310050501124c05", + "0x50680505811044ad014a7014a5044112b40504407044af01cc424c17014af", + "0xcd014ad014cd01419044cd014ad014110d011330052b405044a3044cb014ad", + "0xd0014ad014ce33c072781133c052b4050449f044ce014ad014cd3300728011", + "0x1132c052b40532c050501105c052b40505c0504c11344052b4053400527011", + "0x504407044d101ccb05c17014d1014ad014d10149904407014ad014070149a", + "0x1134c052b405044a3044d2014ad0143801416044112b405058050dc11044ad", + "0x9f044d5014ad014d434c0728011350052b4053500506411350052b40504431", + "0x504c11360052b40535c052701135c052b405354d601c9e044d6014ad01411", + "0xd80149904407014ad014070149a044d2014ad014d20141404414014ad01414", + "0x38050165141305c16058ad01c070140733011360073481405c05360052b405", + "0xcd044a9014ad014160141604416014ad0141601414044112b405044070441a", + "0xa228ca7294132b4052a00533c112a0052b40504c053381104c052b40504c05", + "0x52a411044ad014a20145d044112b40528c0517411044ad014a5014d004419", + "0x52800534c11280052b40529c053481129c052b40529c0534411044ad01419", + "0x517411044ad0149f014a90442e0d42a09c1525497260992689c2789f28cad", + "0x112b405260052a411044ad01499014a9044112b4052700535011044ad0149e", + "0x2701437044112b4050540535011044ad01495014d5044112b40525c052a411", + "0x11044ad0142e01437044112b4050d40535811044ad0142a014d6044112b405", + "0x110c4052b4050bc05360110bc052b4050900505c110900601cad0149a014d7", + "0x71044a9014ad014a90141404417014ad014170149a04431014ad01431014a8", + "0x11044ad0141101c110f005518370d0072b4070c4050e011018052b40501805", + "0x50f0110f4052b4050dc05068110ec052b4052a40505811044ad01434014a5", + "0x5050112409301cad01493014ae04493014ad014930141904493014ad0143d", + "0x93014a9044112b405044070449101547044ad01c900143d0443b014ad0143b", + "0x46014ad0141121c1122c052b4050ec0505811044ad0140601437044112b405", + "0x11044052b4050440504c1112c052b40511c053681111c052b4051180536411", + "0x170144b014ad0144b014db04417014ad014170149a0448b014ad0148b01414", + "0x49014ad0143b01416044112b4052440511811044ad0141101c1112c1722c11", + "0x4f014ad0144c22807374112289301cad01493014ae0444c014ad0141137011", + "0x5520112b40713c050f411124052b405124050501113c052b40513c0506411", + "0x4901416044112b40524c052a411044ad0140601437044112b4050440704489", + "0x52b4052180506411214052b405044dc04486014ad014112f41121c052b405", + "0x52b40521c0505011210052b4052100506411210052b4052148601cdd04486", + "0x81014ad0148701416044112b405044070447f01549044ad01c840143d04487", + "0x130445d014ad0147a014da0447a014ad0147b014d90447b014ad0141137811", + "0x536c1105c052b40505c0526811204052b4052040505011044052b40504405", + "0x11044ad0147f01446044112b405044070445d05c81044170145d014ad0145d", + "0x740141904474014ad0141137c111e0052b405044a304459014ad0148701416", + "0x721c407278111c4052b4050449f04472014ad014741e007280111d0052b405", + "0x51640505011044052b4050440504c1119c052b4051b405380111b4052b405", + "0x6705c590441701467014ad01467014db04417014ad014170149a04459014ad", + "0x5044e104400014ad0144901416044112b4052240511811044ad0141101c11", + "0xbd01419044bd014ad014b02c407374112c49301cad01493014ae044b0014ad", + "0x1101c112f805528112b4072f4050f411000052b40500005050112f4052b405", + "0x72b4050180535c11300052b4050000505811044ad01493014a9044112b405", + "0x11310052b4053080505c1130c052b405044e2044112b405304050dc11308c1", + "0xe4044c0014ad014c001414044c3014ad014c3014e3044c5014ad014c4014d8", + "0x52b4053000505811044ad0141101c113240552cc831c072b40730cc504416", + "0x1132c052b405044a3044af014ad014c80141a044c8014ad014c8014e5044ca", + "0x7a044ca014ad014ca01414044cc014ad014cc01419044cc014ad014af0143c", + "0xd0014ad014ca01416044112b40504407044cf0154c338cd01cad01ccc31c07", + "0x6044112b405348050b81134cd201cad014cb01435044d1014ad0141139811", + "0x504c11344052b4053440506411340052b4053400505011350052b40534c05", + "0x11364ae36016534d7358d5058ad01cd4344ce05cd004ce7044cd014ad014cd", + "0x53540505811354052b4053540505011044ad014d701437044112b40504407", + "0x52b4053700536811370052b40536c053641136c052b40504487044da014ad", + "0xd6014ad014d60149a044da014ad014da01414044cd014ad014cd01413044dd", + "0x53600505011044ad0141101c11374d6368cd05c05374052b4053740536c11", + "0xad014d937c072781137c052b4050449f044de014ad014d801416044d8014ad", + "0x52b4053780505011334052b4053340504c11384052b405380053801138005", + "0x7044e12b8de33417014e1014ad014e1014db044ae014ad014ae0149a044de", + "0x52b405044a3044e2014ad014ca01416044112b40532c050b811044ad01411", + "0xe5014ad014e438c0728011390052b4053900506411390052b405044e8044e3", + "0x113a0052b40539c053801139c052b405394e601c9e044e6014ad0141127c11", + "0xdb04417014ad014170149a044e2014ad014e201414044cf014ad014cf01413", + "0x52b4053000505811044ad0141101c113a017388cf05c053a0052b4053a005", + "0xa0044eb014ad014eb01419044eb014ad014113a4113a8052b405044a3044e9", + "0xe0044ee014ad014ec3b407278113b4052b4050449f044ec014ad014eb3a807", + "0x5268113a4052b4053a40505011324052b4053240504c113bc052b4053b805", + "0x112b40504407044ef05ce932417014ef014ad014ef014db04417014ad01417", + "0x52b8113c4052b405044ea044f0014ad0140001416044112b4052f80511811", + "0x14044f3014ad014f301419044f3014ad014f13c807374113c89301cad01493", + "0x50dc11044ad0141101c1141005538112b4073cc050f4113c0052b4053c005", + "0x52b405044eb04505014ad014f001416044112b40524c052a411044ad01406", + "0xad01d0605d05058ed04506014ad01506014ec04505014ad015050141404506", + "0x505011044ad0150a014a9044112b405044070450d4310b0594f4290942016", + "0x543c053641143c052b405044870450e014ad015080141604508014ad01508", + "0xad0150e0141404411014ad014110141304511014ad01510014da04510014ad", + "0x11445094381105c05444052b4054440536c11424052b405424052681143805", + "0x50449f04512014ad0150b014160450b014ad0150b01414044112b40504407", + "0x50440504c11454052b4054500538011450052b4054351301c9e04513014ad", + "0xad01515014db0450c014ad0150c0149a04512014ad015120141404411014ad", + "0xf001416044112b4054100511811044ad0141101c114550c4481105c0545405", + "0x11746007374114609301cad01493014ae04517014ad014113b811458052b405", + "0x7180050f411458052b4054580505011180052b4051800506411180052b405", + "0x52b4054580505811044ad01493014a9044112b405044070451901550044ad", + "0x1146c052b40546c0505011470052b4054700506411470052b405044ef0451b", + "0x52b40546c0505811044ad0141101c1147805544b6474072b4074701101cf0", + "0x11488052b405044e2044112b405480050dc114852001cad01406014d70451f", + "0x1404522014ad01522014e3044b7014ad01523014d804523014ad0152101417", + "0xad0141101c114980554925490072b407488b7474163901147c052b40547c05", + "0x154014ad015250141a04525014ad01525014e504553014ad0151f0141604411", + "0xe304553014ad015530141404556014ad014113c411554052b405550050f011", + "0x133c811490052b4054900504c11554052b4055540506411558052b40555805", + "0x15701414044112b405044070455c56d5a059595615701cad01d552d95605d53", + "0xad0155e014d90455e014ad0141121c11574052b40555c050581155c052b405", + "0x52b4055740505011490052b4054900504c11580052b40557c053681157c05", + "0x7045605615d4901701560014ad01560014db04558014ad015580149a0455d", + "0xad0141127c11584052b4055680505811568052b4055680505011044ad01411", + "0xad015240141304563014ad014b8014e0044b8014ad0155c588072781158805", + "0x52b40558c0536c1156c052b40556c0526811584052b405584050501149005", + "0x547c0505811044ad014b6014f3044112b405044070456356d614901701563", + "0x166014ad015660141904566014ad014113a411594052b405044a304564014ad", + "0x169014ad015675a007278115a0052b4050449f04567014ad015665940728011", + "0x11590052b4055900505011498052b4054980504c115a8052b4055a40538011", + "0x5044070456a05d64498170156a014ad0156a014db04417014ad014170149a", + "0x115b0052b405044a30456b014ad0151b01416044112b405018050dc11044ad", + "0x9f0456e014ad0156d5b007280115b4052b4055b405064115b4052b405044e8", + "0x504c115c4052b4055c005380115c0052b4055b96f01c9e0456f014ad01411", + "0x171014db04417014ad014170149a0456b014ad0156b014140451e014ad0151e", + "0x16044112b4054640511811044ad0141101c115c4175ad1e05c055c4052b405", + "0x5064115d0052b4055cc9301cdd04573014ad01411410115c8052b40545805", + "0x70457601575044ad01d740143d04572014ad015720141404574014ad01574", + "0x5044e2045795e0072b4050180535c115dc052b4055c80505811044ad01411", + "0xad0157a014e30457c014ad0157b014d80457b014ad01579014170457a014ad", + "0x112e8055fd7e5f4072b4075e97c04416390115dc052b4055dc05050115e805", + "0x17e0141a0457e014ad0157e014e504580014ad0157701416044112b40504407", + "0x560c0505c112ec052b4050450504583608072b4055e00535c11604052b405", + "0xad0158001414044bb014ad014bb014e304585014ad01584014d804584014ad", + "0x116240562187618072b4072ed855f41639011604052b405604050641160005", + "0x1870141a04587014ad01587014e50458a014ad0158001416044112b40504407", + "0xad0141141811044ad0158c014370458d630072b4056080535c1162c052b405", + "0x52b4056380538c1163c052b4052f005360112f0052b4056340505c1163805", + "0xad01d8e63d86058e40458b014ad0158b014190458a014ad0158a014140458e", + "0x56440539411650052b4056280505811044ad0141101c1164c056499164007", + "0xad015900141304594014ad015940141404595014ad015910141a04591014ad", + "0x19b668166659865d96058ad01c176500733011654052b405654050641164005", + "0xcd0459d014ad015960141604596014ad0159601414044112b405044070459c", + "0x1a1680bf67c132b4056780533c11678052b4056600533811660052b40566005", + "0x52a411044ad015a10145d044112b4056800517411044ad014bf01508045a2", + "0x568c0542c1168c052b40567c054281167c052b40567c0542411044ad015a2", + "0x1a701419045a8014ad015810143c045a7014ad015a40150c045a6695a4058ad", + "0x1970149a045a9014ad015a901419045a9014ad015a869c073741169c052b405", + "0x56980532411694052b405694053b011674052b405674050501165c052b405", + "0xad0159d01416044112b40504407045ab015aa044ad01da90143d045a6014ad", + "0xad015ad6b007374116b4052b40562c050f0116b0052b405694054301131805", + "0x112b4076b8050f411318052b40531805050116b8052b4056b805064116b805", + "0x1b2014ad015a60150d045b1014ad014c601416044112b40504407045b0015af", + "0xb9014ad014b901419044b9014ad015b36c807374116cc052b405654050f011", + "0x11044ad0141101c116d4056d0112b4072e4050f4116c4052b4056c40505011", + "0x5368116e0052b4056dc05364116dc052b40504487045b6014ad015b101416", + "0x1970149a045b6014ad015b60141404590014ad0159001413045b9014ad015b8", + "0x11044ad0141101c116e5976d99005c056e4052b4056e40536c1165c052b405", + "0x50450e045bb014ad0141128c116e8052b4056c40505811044ad015b501446", + "0xad0141127c116f4052b4056f1bb01ca0045bc014ad015bc01419045bc014ad", + "0xad0159001413045c0014ad015bf014e0045bf014ad015bd6f807278116f805", + "0x52b4057000536c1165c052b40565c05268116e8052b4056e8050501164005", + "0x56980517411044ad015b001446044112b40504407045c065dba64017015c0", + "0x11708052b405044a3045c1014ad014c601416044112b405654052a411044ad", + "0x9f045c3014ad014b570807280112d4052b4052d405064112d4052b4050450f", + "0x504c11718052b4057140538011714052b40570dc401c9e045c4014ad01411", + "0x1c6014db04597014ad015970149a045c1014ad015c10141404590014ad01590", + "0x5d044112b4056ac0511811044ad0141101c11719977059005c05718052b405", + "0xad0158b014a9044112b4056940544011044ad01595014a9044112b40569805", + "0x19045c9014ad0141144411720052b405044a3045c7014ad0159d0141604411", + "0x72781172c052b4050449f045ca014ad015c97200728011724052b40572405", + "0x505011640052b4056400504c11734052b4057300538011730052b405729cb", + "0x1c764017015cd014ad015cd014db04597014ad015970149a045c7014ad015c7", + "0x52a411044ad01581014a9044112b40562c052a411044ad0141101c1173597", + "0xad0141127c11738052b4056680505811668052b4056680505011044ad01595", + "0xad0159001413044b4014ad015d0014e0045d0014ad0159c73c072781173c05", + "0x52b4052d00536c1166c052b40566c0526811738052b405738050501164005", + "0x5604052a411044ad0158b014a9044112b40504407044b466dce64017014b4", + "0x1174c052b405044e9045d2014ad0141128c11744052b4056280505811044ad", + "0x9e045d5014ad0141127c11750052b40574dd201ca0045d3014ad015d301419", + "0x1404593014ad0159301413045d7014ad015d6014e0045d6014ad015d475407", + "0x19305c0575c052b40575c0536c1105c052b40505c0526811744052b40574405", + "0x16044112b405604052a411044ad0158201437044112b40504407045d705dd1", + "0x57680506411768052b405044e9045d9014ad0141128c11760052b40560005", + "0x576ddc01c9e045dc014ad0141127c1176c052b405769d901ca0045da014ad", + "0xad015d80141404589014ad0158901413045de014ad015dd014e0045dd014ad", + "0x11778177618905c05778052b4057780536c1105c052b40505c052681176005", + "0xad0141128c112cc052b4055dc0505811044ad0157801437044112b40504407", + "0x52b405781df01ca0045e0014ad015e001419045e0014ad014113a41177c05", + "0x1e4014ad015e3014e0045e3014ad015e17880727811788052b4050449f045e1", + "0x1105c052b40505c05268112cc052b4052cc05050112e8052b4052e80504c11", + "0xad0157601446044112b40504407045e405cb32e817015e4014ad015e4014db", + "0x112045e6014ad0141128c11794052b4055c80505811044ad014060143704411", + "0x1127c117a0052b40579de601ca0045e7014ad015e701419045e7014ad01411", + "0x1101413045eb014ad015ea014e0045ea014ad015e87a407278117a4052b405", + "0x57ac0536c1105c052b40505c0526811794052b4057940505011044052b405", + "0x50dc11044ad0143c014a5044112b40504407045eb05de504417015eb014ad", + "0x52b405044e9044b2014ad0141128c117b0052b4052a40505811044ad01406", + "0x1ef014ad0141127c117b8052b4057b4b201ca0045ed014ad015ed01419045ed", + "0x11014ad0141101413045f1014ad015f0014e0045f0014ad015ee7bc0727811", + "0x57c4052b4057c40536c1105c052b40505c05268117b0052b4057b00505011", + "0xad014140141604414014ad0141401414044112b40504407045f105dec04417", + "0x52b4057d005380117d0052b405069f301c9e045f3014ad0141127c117c805", + "0x38014ad014380149a045f2014ad015f20141404411014ad0141101413045f5", + "0x50440701411044ad0141112c117d4387c81105c057d4052b4057d40536c11", + "0xae044a9014ad0141401416044112b405044070441a0e0077d81404c072b407", + "0x3d044a9014ad014a90141404413014ad0141301413044a805c072b40505c05", + "0xa901416044112b40505c052a411044ad0141101c11294057dc112b4072a005", + "0xa201515044a2014ad014a301c074501128c052b4050580544c1129c052b405", + "0x5064054581129c052b40529c050501104c052b40504c0504c11064052b405", + "0xa901416044112b4052940511811044ad0141101c11064a704c1601419014ad", + "0x52b4052800505011044ad014110ec1127c052b40501c0505c11280052b405", + "0xad014a001416044112b405044070449a015f82709e01cad01c9f01438044a0", + "0x52b40525c052101125c052b405260050f011260052b405270050681126405", + "0x2a014ad014950147f04427014ad0149e014a804415014ad014990141404495", + "0xad0141124c110d4052b4052800505811044ad0141101c11045f90141122c11", + "0x52b405268052a011054052b4050d40505011018052b4050b805204110b805", + "0x2f014ad01c2a0147b04424014ad01427014060442a014ad014060147f04427", + "0xa004434014ad0141501416044112b4050444b044112b4050440704431015fa", + "0x130443b014ad0143c05c07374110f0052b405044dc04437014ad0142f05807", + "0x51b411090052b405090051c4110d0052b4050d0050501104c052b40504c05", + "0x3d058ad0143b0dc240d01304c670443b014ad0143b0141904437014ad01437", + "0xad01417014a9044112b4050444b044112b405044070449024c3d0580524093", + "0x1122c052b4050c40545c11244052b4050540505811044ad014160142e04411", + "0x1104c052b40504c0504c1111c052b4051180545411118052b40522c2401d14", + "0xad0141101c1111c9104c1601447014ad014470151604491014ad0149101414", + "0x505811044ad0140701437044112b405058050b811044ad01417014a904411", + "0xad0144c014190444c014ad014110c411124052b405044a30444b014ad0141a", + "0xad0148a13c072781113c052b4050449f0448a014ad0144c124072801113005", + "0x52b40512c05050110e0052b4050e00504c1121c052b405224054601122405", + "0x170145d044112b405058053201121c4b0e01601487014ad01487015160444b", + "0xa52a0167eca906838058ad01c070140733011044ad01413014a9044112b405", + "0xcd044a3014ad014380141604438014ad0143801414044112b40504407044a7", + "0x9e27ca0064132b4052880533c11288052b4052a405338112a4052b4052a405", + "0x52a411044ad0149e0145d044112b40527c0517411044ad01419014d00449c", + "0x52680534c11268052b4052800534811280052b4052800534411044ad0149c", + "0x517411044ad01499014a9044310bc240182e0d42a09c15254972609928cad", + "0x112b40509c052a411044ad01415014a9044112b40525c0535011044ad01498", + "0x601437044112b4050b80535011044ad01435014d5044112b4050a8052a411", + "0x11044ad0143101437044112b4050bc0535811044ad01424014d6044112b405", + "0x110ec052b4050f005360110f0052b4050dc0505c110dc3401cad01495014d7", + "0x71044a3014ad014a3014140441a014ad0141a0149a0443b014ad0143b014a8", + "0x11044ad0141101c11240057f0930f4072b4070ec050e0110d0052b4050d005", + "0x50f01122c052b40524c0506811244052b40528c0505811044ad0143d014a5", + "0x471180737411118052b405118050641111c052b405044ee04446014ad0148b", + "0x712c050f411244052b405244050501112c052b40512c050641112c052b405", + "0x52b4052440505811044ad014140142e044112b4050440704449015fd044ad", + "0x11130052b4051300505011228052b4052280506411228052b405044ef0444c", + "0x52b4051300505811044ad0141101c1121c057f88913c072b4072281101cf0", + "0x111fc052b40504505044112b405214050dc112108501cad01434014d704486", + "0x140447f014ad0147f014e30447b014ad01481014d804481014ad0148401417", + "0xad0141101c11164057fc5d1e8072b4071fc7b13c1639011218052b40521805", + "0x74014ad0145d0141a0445d014ad0145d014e504478014ad014860141604411", + "0xe304478014ad014780141404471014ad014113c4111c8052b4051d0050f011", + "0x133c8111e8052b4051e80504c111c8052b4051c805064111c4052b4051c405", + "0x6d01414044112b40504407044b12c00005a0019c6d01cad01c722247106878", + "0xad014be014d9044be014ad0141121c112f4052b4051b405058111b4052b405", + "0x52b4052f405050111e8052b4051e80504c11304052b405300053681130005", + "0x7044c119cbd1e817014c1014ad014c1014db04467014ad014670149a044bd", + "0xad0141127c11308052b4050000505811000052b4050000505011044ad01411", + "0xad0147a01413044c5014ad014c4014e0044c4014ad014b130c072781130c05", + "0x52b4053140536c112c0052b4052c00526811308052b40530805050111e805", + "0x52180505811044ad01489014f3044112b40504407044c52c0c21e817014c5", + "0xc9014ad014c901419044c9014ad014113a411320052b405044a3044c7014ad", + "0xcb014ad014ca2bc07278112bc052b4050449f044ca014ad014c93200728011", + "0x1131c052b40531c0505011164052b4051640504c11330052b40532c0538011", + "0x504407044cc068c716417014cc014ad014cc014db0441a014ad0141a0149a", + "0x11338052b405044a3044cd014ad0144c01416044112b4050d0050dc11044ad", + "0x9f044d0014ad014cf338072801133c052b40533c050641133c052b405044e8", + "0x504c1134c052b4053480538011348052b405340d101c9e044d1014ad01411", + "0xd3014db0441a014ad0141a0149a044cd014ad014cd0141404487014ad01487", + "0x37044112b4051240511811044ad0141101c1134c1a3348705c0534c052b405", + "0x5050050d411354052b405044bd044d4014ad0149101416044112b4050d005", + "0xad014d401414044d8014ad014d701406044112b405358050b81135cd601cad", + "0xda05a01364ae01cad01cd83541a350172f811354052b405354050641135005", + "0x11374052b4052b805058112b8052b4052b80505011044ad0141101c11370db", + "0x504c11380052b40537c053681137c052b4053780536411378052b40504487", + "0xe0014db044d9014ad014d90149a044dd014ad014dd0141404411014ad01411", + "0x11368052b4053680505011044ad0141101c11380d93741105c05380052b405", + "0xe0044e3014ad014dc3880727811388052b4050449f044e1014ad014da01416", + "0x526811384052b4053840505011044052b4050440504c11390052b40538c05", + "0x112b40504407044e436ce104417014e4014ad014e4014db044db014ad014db", + "0xa301416044112b405050050b811044ad0143401437044112b4052400529411", + "0x52b40539c050641139c052b405044e9044e6014ad0141128c11394052b405", + "0x52b4053a0e901c9e044e9014ad0141127c113a0052b40539ce601ca0044e7", + "0xe5014ad014e50141404411014ad0141101413044eb014ad014ea014e0044ea", + "0x1101c113ac1a3941105c053ac052b4053ac0536c11068052b4050680526811", + "0x52b4052a005058112a0052b4052a00505011044ad014140142e044112b405", + "0xef014ad014ee014e0044ee014ad014a73b407278113b4052b4050449f044ec", + "0x11294052b40529405268113b0052b4053b00505011044052b4050440504c11", + "0x111c47219c1105c341c867044172a4ef294ec04417014ef014ad014ef014db", + "0x170d07219c1105ce705807014111c47219c1105c341c867044170441601c05", + "0x1780c1601c05044711c867044170d07219c1105e0205807014111c47219c11", + "0x111c47219c1105c341c867044178101601c05044711c867044170d07219c11", + "0x11058060bc3419c1104e0601c05044781c867044171c867044168141601c05", + "0x1601c05044781c867044170bc06050901c8670443881c17058070141122867", + "0x8201404c17" ], "sierra_program_debug_info": { "type_names": [], diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/account_with_dummy_validate.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/account_with_dummy_validate.sierra.json index 1f7a1e5f630..3e3bb549dd8 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/account_with_dummy_validate.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/account_with_dummy_validate.sierra.json @@ -1,13 +1,13 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", - "0x121", - "0xdf", + "0xa", + "0x0", + "0x141", + "0xbf", "0x2d", "0x52616e6765436865636b", "0x800000000000000100000000000000000000000000000000", @@ -87,12 +87,14 @@ "0x26", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x4761734275696c74696e", - "0x56", + "0x57", "0x7265766f6b655f61705f747261636b696e67", "0x77697468647261775f676173", "0x6272616e63685f616c69676e", + "0x72656465706f7369745f676173", "0x7374727563745f6465636f6e737472756374", "0x73746f72655f74656d70", + "0x2c", "0x61727261795f736e617073686f745f706f705f66726f6e74", "0x756e626f78", "0x64726f70", @@ -103,7 +105,6 @@ "0x7374727563745f636f6e737472756374", "0x656e756d5f696e6974", "0x2a", - "0x2c", "0x29", "0x6765745f6275696c74696e5f636f737473", "0x28", @@ -118,9 +119,9 @@ "0x22", "0x6a756d70", "0x656e756d5f6d61746368", + "0x64697361626c655f61705f747261636b696e67", "0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371", "0x21", - "0x64697361626c655f61705f747261636b696e67", "0x66756e6374696f6e5f63616c6c", "0x3", "0x5", @@ -141,17 +142,18 @@ "0x6465706c6f795f73797363616c6c", "0x647570", "0x66656c743235325f737562", - "0x3b9", + "0x45b", "0xffffffffffffffff", - "0x5c", - "0x4e", - "0x40", - "0x33", + "0x69", + "0x5a", + "0x4b", + "0x3d", "0x2e", "0x2f", "0x30", "0x31", "0x32", + "0x33", "0x34", "0x35", "0x36", @@ -161,26 +163,9 @@ "0x3a", "0x3b", "0x3c", - "0x3d", "0x3e", - "0xb3", - "0xa5", - "0x84", - "0x98", - "0x172", - "0xcf", - "0xd4", - "0x161", - "0x15d", - "0x14e", - "0xe5", - "0xea", - "0x13c", - "0x135", - "0x12f", - "0x10e", "0x3f", - "0x122", + "0x40", "0x41", "0x42", "0x43", @@ -189,68 +174,67 @@ "0x46", "0x47", "0x48", + "0xcb", + "0xbc", + "0x97", + "0xae", + "0x1ae", + "0xec", + "0xf3", + "0x19b", + "0x195", + "0x186", + "0x10e", + "0x115", + "0x173", + "0x16b", + "0x164", + "0x13f", "0x49", "0x4a", - "0x4b", "0x4c", "0x4d", + "0x4e", + "0x156", "0x4f", "0x50", "0x51", - "0x142", "0x52", "0x53", "0x54", "0x55", - "0x57", + "0x56", "0x58", "0x59", - "0x5a", "0x5b", + "0x5c", "0x5d", "0x5e", "0x5f", - "0x165", "0x60", "0x61", "0x62", "0x63", + "0x17a", "0x64", "0x65", "0x66", "0x67", "0x68", - "0x69", "0x6a", "0x6b", - "0x279", - "0x191", - "0x196", - "0x266", - "0x261", - "0x250", - "0x1a8", - "0x1ad", - "0x23c", - "0x233", - "0x22b", - "0x1d3", - "0x21b", - "0x20f", - "0x1fe", - "0x1f5", "0x6c", "0x6d", "0x6e", "0x6f", "0x70", "0x71", - "0x244", "0x72", "0x73", "0x74", "0x75", "0x76", + "0x1a2", "0x77", "0x78", "0x79", @@ -260,44 +244,92 @@ "0x7d", "0x7e", "0x7f", - "0x26c", "0x80", "0x81", "0x82", "0x83", + "0x84", + "0x2e5", + "0x1d2", + "0x1d9", + "0x2d0", + "0x2c9", + "0x2b8", + "0x1f5", + "0x1fc", + "0x2a3", + "0x299", + "0x290", + "0x228", + "0x27f", + "0x271", + "0x25f", + "0x254", "0x85", "0x86", "0x87", "0x88", "0x89", + "0x2ac", "0x8a", "0x8b", - "0x361", - "0x29a", - "0x29f", - "0x34e", - "0x349", - "0x338", - "0x2b1", - "0x2b6", - "0x324", - "0x31b", - "0x313", - "0x2dc", - "0x303", - "0x2fa", - "0x32c", - "0x354", + "0x8c", + "0x8d", + "0x8e", + "0x8f", + "0x90", + "0x91", + "0x92", + "0x93", + "0x94", + "0x95", + "0x96", + "0x98", + "0x99", + "0x9a", + "0x9b", + "0x9c", + "0x2d9", + "0x9d", + "0x9e", + "0x9f", + "0xa0", + "0xa1", + "0xa2", + "0xa3", + "0xa4", + "0xa5", + "0xa6", + "0xa7", + "0xa8", + "0xa9", + "0xaa", + "0x3f6", + "0x30b", + "0x312", + "0x3e1", + "0x3da", + "0x3c9", + "0x32e", + "0x335", + "0x3b4", "0x3aa", - "0x380", - "0x38c", - "0x391", - "0x39f", - "0xc1", - "0x180", - "0x289", - "0x371", - "0x1f77", + "0x3a1", + "0x361", + "0x390", + "0x385", + "0x3bd", + "0x3ea", + "0x44b", + "0x419", + "0x429", + "0x430", + "0x43f", + "0xda", + "0x1bd", + "0x2f6", + "0x407", + "0x2483", "0x180a04018401e070281c0a0e05034180b050241005038180a04018080200", "0x14281c03014361a0806420180b81428150b0142815030142813080482207", "0x9c1426040404a240288c141e040880a140e0840a1b0d0800a1f05078101d", @@ -308,295 +340,343 @@ "0x140803038140c05220281a0c038148605210281a0c030142815208148005", "0x1200e0602810062a0282c141e0411c0e06028100646038180a04019140e06", "0x28a40a28828a04f011389a0703014080320814980525828740c011282049", - "0x140a57100140a54030140a57030140a56030140a55050140a54150140a53", - "0x14b83e02814b80602814b60602814a85a02814b20602814b04302814ae20", - "0x18cc4050295014612f0140a54300140a542f8140a540281cbc05039748205", - "0x280e5e0281cba4c02814b82a02814b81d02814ae1d02814ca6402814b20a", - "0x1cd605039740c05029a81469150140a57340140a59338140a59330140a59", - "0xa00a052b828dc6b02814da05039ac0a072e81c0a052e028d86b02814a80a", - "0x1505405029501470378140a6d0281cde0503974de05029501407378140e5d", - "0x1d40a052c81c0a052b8f00a05369000a05299d00a05369cce405388740a05", - "0x140a571b0140a531b0140a563d0140a54051e40c05029e01477030140a76", - "0x14ae0a401fc0a052b9cc0a052c9f80a052b828fa0a3e028f63502814ae34", - "0x140a5c0501c7805039740c0502a0c1482390140a540501ce405039750205", - "0x1d00a072e8140e3c0281cba0a420140a052c9d00a052a0280e740281cba40", - "0x141407051f80c07439cd02074301c0a0a03814140a43014140a052140a07", - "0xa068074301c6a05398290205430150205408286a0543014e405390281486", - "0x146a0a052180a1d029f8141d02a180a2802818140a430141407050a40a88", - "0xa80a06050290c050501c142202a24542003a180e34029cc143402a180a34", - "0xac0e86038800a73050800a86028800a35050290c0512014fc0a120150c05", - "0x28520a052180a2c028a0140a4301456051a0281486028280e0a0b014e82c", - "0x150c050b8c00e2a0505c0a860285c0a200505c0a86028283a0a180150c05", - "0x204147f02a180a7a028ac147a02a180a211b01c480a1b0150c05050881421", - "0x14fe05180280e05430140e050b028e60543014e605160290205430150205", - "0x2180a0a0b8281486028580a34050290c050501c147f039cd0281029fc0a86", - "0x1c14411f01d14401e01d0c073a9cd02721b028ea0543014ea0510828ea05", - "0x28860543014860510028860543014147a051d00a8602828520a052180a0a", - "0x14780a052180a6b029d414683581d0c0537814fe0a378150c05219d00e2a", - "0x2180a3c02a04144c02a180a66028f8146602a180a6702900146702a180a68", - "0x149805430149805180280e05430140e050b0288005430148005160287805", - "0x80146202a180a0a20828c805430141429050290c050501c144c039007881", - "0x180bc0712028bc05430141422051800a8602988c80715028c40543014c405", - "0x150c0520814580a1f0150c051f015020a2f8150c052d014560a2d0150c05", - "0x1414070517c0e411f2040a5f02a180a5f028c0140702a180a07028581441", - "0x22c0a200522c0a8602828e80a000150c05050a4140a4301444051a0281486", - "0x2180a8c4681c480a468150c0505088148c02a180a8b0001c540a458150c05", - "0x28e60543014e605160290205430150205408291e05430151c05158291c05", - "0x290c050501c148f039cd028102a3c0a8602a3c0a300501c0a860281c0a16", - "0x2180a9002880149002a180a0a218291405430141429050290c0514814680a", - "0x24c0a8602a452407120292405430141422052440a8602a411407150292005", - "0x142c0a398150c0539814580a408150c0540815020a4a0150c0549814560a", - "0x1bc140a430141407052500e7340a040a9402a180a94028c0140702a180a07", - "0x2580a8602a580a20052580a8602828820a4a8150c05050a4140a43014e405", - "0xac149902a180a974c01c480a4c0150c0505088149702a180a964a81c540a", - "0x140e050b028fc0543014fc05160280c05430140c05408293405430153205", - "0x280e05050290c0505028149a039f80c8102a680a8602a680a300501c0a86", - "0x15020a1a8150c0539014e40a052180a0a03828fc0603a6ce68103a180e05", - "0xa00a06050290c050501c142902a70503403a180e35029cc148102a180a81", - "0x800e86038d00a73050d00a86028d00a35050290c050e814fc0a0e8150c05", - "0x28520a052180a2a028a0140a4301440051a0281486028280e0a110153a2a", - "0x150c05158900e2a050ac0a86028ac0a20050ac0a86028283a0a120150c05", - "0x204141702a180a30028ac143002a180a2c0b01c480a0b0150c0505088142c", - "0x142e05180280e05430140e050b028e60543014e605160290205430150205", - "0x2180a0a0b8281486028880a34050290c050501c1417039cd02810285c0a86", - "0x1c14753f81d3c7a1b01d0c07109cd02721b0284205430144205108284205", - "0x28800543014800510028800543014147a050f00a8602828520a052180a0a", - "0x14780a052180a41029d414742081d0c051f014fe0a1f0150c05200f00e2a", - "0x2180a3602a04146b02a180a6f028f8146f02a180a4302900144302a180a74", - "0x14d60543014d605180280e05430140e050b028f40543014f405160286c05", - "0x80146702a180a0a20828d005430141429050290c050501c146b039e86c81", - "0x1989807120289805430141422051980a860299cd00715028ce0543014ce05", - "0x150c053a814580a3f8150c053f815020a310150c0532014560a320150c05", - "0x141407051880e753fa040a6202a180a62028c0140702a180a07028581475", - "0x1780a20051780a8602828860a300150c05050a4140a4301452051a0281486", - "0x2180a5a2f81c480a2f8150c0505088145a02a180a5e3001c540a2f0150c05", - "0x28e60543014e605160290205430150205408291605430140005158280005", - "0x290c050501c148b039cd028102a2c0a8602a2c0a300501c0a860281c0a16", - "0x2180a8d02880148d02a180a0a208291805430141429050290c0539014de0a", - "0x2280a8602a391e07120291e05430141422052380a8602a351807150291a05", - "0x142c0a3f0150c053f014580a030150c0503015020a480150c0545014560a", - "0x14140a43014140a052400e7e032040a9002a180a90028c0140702a180a07", - "0x286a0543014e405390281486028280e0a3f0180e9f39a040e86038141407", - "0x1c142902a80503403a180e35029cc148102a180a8102a04140a43014146b", - "0x150c0510014ce0a100150c050e814d00a0e8150c05140140c0a052180a0a", - "0x14140705029420505130142402a180a2a02998142202a180a34028d4142a", - "0x198142202a180a29028d4142c02a180a2b02988142b02a180a0a320281486", - "0x2040e5e050290c050501c143002a882c054301c4805300284805430145805", - "0x142e05408281486028840a5a050290c050501c143602a8c421703a180e16", - "0x2180a7f02818140a430141407051d40aa43f9e80e86038880a730505c0a86", - "0x2947c4003a180e7a029cc147a02a180a7a028d4140a4301478053f0287805", - "0x14000a218150c05200146a0a3a0150c051f014be0a052180a0a038288205", - "0x15160a358150c0505190140a430141407050294c0505130146f02a180a74", - "0x2180e6f02a30146f02a180a6802800144302a180a41028d4146802a180a6b", - "0xa4144c02a180a6702818140a43014148d050290c050501c146602a9cce05", - "0x2180a1702a04146002a180a4c029a0146202a180a43028f0146402a180a0a", - "0x28c80543014c80547828c40543014c40547028e60543014e605160282e05", - "0x2180e5f02a40145f2d178e48602980c8623985ce68a051800a86029800a20", - "0x150c0746815240a46a300e86028000a91050290c050501c148b02aa00005", - "0x1cc148a02a180a8c029c8140a430151c053a8281486028280e0a47815528e", - "0x2440a28050290c0548014680a052180a0a0382924055524520074301d1405", - "0xa8149402a180a9402880149402a180a0a0e8292605430141429050290c05", - "0x25c0a2b0525c0a8602a552c07120292c05430141422052540a8602a512607", - "0x150c05038142c0a2d0150c052d014580a2f0150c052f015020a4c0150c05", - "0x2180a92028d0140a430141407052600e5a2f2040a9802a180a98028c01407", - "0x2ad34074301d325a2f1c86c0a4c8150c054c814420a4c8150c050505c140a", - "0x14400a578150c05051e814ae02a180a0a148281486028280e0a56a240eac", - "0x2c40a75052c962074301560053f8296005430155eae038a814af02a180aaf", - "0x2d40a8602ad00a3e052d00a8602acc0a40052cc0a8602ac80a3c050290c05", - "0x14600a038150c05038142c0a558150c0555814580a4d0150c054d015020a", - "0x28820a5b0150c05050a4140a430141407052d40eab4d2040ab502a180ab5", - "0x150c050508814b802a180ab75b01c540a5b8150c055b814400a5b8150c05", - "0x2912054301512054082974054301510051582910054301570b90389014b9", - "0x2b5128102ae80a8602ae80a300501c0a860281c0a16052b40a8602ab40a2c", - "0x14bc0540828148602a300a6f050290c0547815260a052180a0a038297407", - "0x22c0a2b050290c050501c140a5e814144c052f00a86029680a2c052ec0a86", - "0x150c05038142c0a2d0150c052d014580a2f0150c052f015020a5f0150c05", - "0x290c0505234140a430141407052f80e5a2f2040abe02a180abe028c01407", - "0x14e605160297605430142e054082814860290c0a34050290c0533015260a", - "0xa814c002a180ac00288014c002a180a0a4a0297e05430141429052f00a86", - "0x3080a2b053080a8602b049e07120289e05430141422053040a8602b017e07", - "0x150c05038142c0a5e0150c055e014580a5d8150c055d815020a618150c05", - "0x290c0505234140a4301414070530c0ebc5da040ac302a180ac3028c01407", - "0x2180ac50288014c502a180a0a3a0298805430141429050290c053a814680a", - "0x31c0a8602b190e07120290e05430141422053180a8602b158807150298a05", - "0x142c0a398150c0539814580a0b8150c050b815020a640150c0563814560a", - "0xd0140a430141407053200e730ba040ac802a180ac8028c0140702a180a07", - "0x24c140a4301414070502994050513014c902a180a3602a04140a430144405", - "0x281486028291a0a648150c0540815020a052180a22028d0140a430146005", - "0x1598cb038a814cc02a180acc0288014cc02a180a0a218299605430141429", - "0x3400a8602b3c0a2b0533c0a8602b359c07120299c05430141422053340a86", - "0x14600a038150c05038142c0a398150c0539814580a648150c0564815020a", - "0x28520a052180a72029bc140a430141407053400e7364a040ad002a180ad0", - "0x150c05693440e2a053480a8602b480a20053480a8602828820a688150c05", - "0x20414d602a180ad5028ac14d502a180ad36a01c480a6a0150c050508814d3", - "0x15ac05180280e05430140e050b028fc0543014fc05160280c05430140c05", - "0x141496051f80a86028292a0a398150c050525414d6039f80c8102b580a86", - "0x2180a0a03828522803b5c683503a180e050501c0a0a052180a0a050281486", - "0x740a73050d40a86028d40a81050290c05051ac141d02a180a72029c8140a", - "0x144805340284805430145405030281486028280e0a11015b02a1001d0c07", - "0xc00a86028b00a66050580a86028800a35050b00a86028ac0a67050ac0a86", - "0x840a860285c0a620505c0a8602828c80a052180a0a0382814d902828980a", - "0xd80ada408150c0718014c00a180150c0510814cc0a0b0150c05110146a0a", - "0x15b67f3d01d0c07408d40e5e052040a8602a04e6074b8281486028280e0a", - "0xf80adc200f00e86038580a73051e80a86029e80a81050290c050501c1475", - "0x180a68050180a8602818fc074b8280c05430148005030281486028280e0a", - "0x280e0a37815ba433a01d0c071e014e60a1e0150c051e0146a0a208150c05", - "0x19c0a86029ac0a00051a00a86029d00a35051ac0a860290c0a5f050290c05", - "0x1300a86029980a8b051980a8602828c80a052180a0a0382814de02828980a", - "0x1880adf320150c0733815180a338150c0526014000a340150c05378146a0a", - "0x1780a8602828520a300150c05320140c0a052180a0a468281486028280e0a", - "0x14580a3d0150c053d015020a2f8150c0530014d00a2d0150c0534014780a", - "0x2180a5f02880145e02a180a5e02a3c145a02a180a5a02a38143402a180a34", - "0x2380ae0468150c0746015200a4622c007243014be5e2d0d0f47345028be05", - "0x29220570a400a8603a280a92052291e07430151a05488281486028280e0a", - "0x1c149502b89289303a180e92029cc149202a180a8f029c8140a430141407", - "0x1f8140a4301520053a828148602a500a28050290c0549814680a052180a0a", - "0x292e0543014141d052580a8602828520a052180a7f02968140a430148205", - "0x2640e24052640a8602828440a4c0150c054ba580e2a0525c0a8602a5c0a20", - "0x2180a8b028b0140002a180a0002a0414ab02a180a9a028ac149a02a180a98", - "0x280e0a5581d1600408155605430155605180280e05430140e050b0291605", - "0xd8148902a180a8902884148902a180a0a0b828148602a540a34050290c05", - "0x2b40a8602ab40a81050290c050501c14b05781dc6ae5681d0c0744a2c0072", - "0x1566054c8281486028280e0a5b2d56872722cd64b1392180e075701d300a", - "0x2e00a89052ed74885cae0e68602adc0aab052dc0a8602acc0a9a052cc0a86", - "0x155c0a052180abb029f8140a4301574052d028148602ae40aad050290c05", - "0x2180ab20285814b102a180ab1028b014bc02a180abc0288014bc02a180a88", - "0x3017e074301520053f8281486028280e0a5f015ca0a4301d7805578296405", - "0x13ce48603b04827f592c4e6b0053040a8602b000a3c050290c055f814ea0a", - "0x2180a87028f8148702a180ac302900140a430141407053198ac43939986c2", - "0x2984054301584050b0289e05430149e05160295a05430155a05408298e05", - "0x299005430141422050290c050501c14c76113d5a8102b1c0a8602b1c0a30", - "0x14580a568150c0556815020a658150c0564814560a648150c05633200e24", - "0x32d8ac456a040acb02a180acb028c014c502a180ac50285814c402a180ac4", - "0x290c053f814b40a052180a41029f8140a430157c05588281486028280e0a", - "0x2180acd0288014cd02a180a0a590299805430141429050290c0548014ea0a", - "0x3400a8602b399e07120299e05430141422053380a8602b359807150299a05", - "0x142c0a588150c0558814580a568150c0556815020a688150c0568014560a", - "0x1d4140a4301414070534564b156a040ad102a180ad1028c014b202a180ab2", - "0x29a405430141422050290c053f814b40a052180a41029f8140a430152005", - "0x14580a568150c0556815020a6a0150c0569814560a698150c055b3480e24", - "0x3516ab456a040ad402a180ad4028c014b502a180ab50285814b402a180ab4", - "0x290c053f814b40a052180a41029f8140a4301520053a8281486028280e0a", - "0x359aa0715029ac0543015ac0510029ac05430141441053540a8602828520a", - "0x150c0574814560a748150c0573ba00e24053a00a8602828440a738150c05", - "0xc0140702a180a070285814b002a180ab0028b014af02a180aaf02a0414ea", - "0x1bc140a430152205498281486028280e0a7501d60af40815d40543015d405", - "0x3ac0a86028000a81050290c053f814b40a052180a41029f8140a430151e05", - "0x290c053f814b40a052180a0a0382814ed02828980a760150c0545814580a", - "0x22c0a2c050000a86028000a81053b80a8602a380a2b050290c0520814fc0a", - "0x29dc07458010205770150c0577014600a038150c05038142c0a458150c05", - "0x1f8140a43014fe052d0281486029880a93050290c0505234140a430141407", - "0x150c051a014580a758150c053d015020a052180a68028d0140a430148205", - "0x3bc0e2a053c00a8602bc00a20053c00a8602829280a778150c05050a414ec", - "0x2180af3028ac14f302a180af17901c480a790150c050508814f102a180af0", - "0x280e05430140e050b029d80543015d80516029d60543015d60540829e805", - "0xd0140a43014148d050290c050501c14f403bb1d68102bd00a8602bd00a30", - "0x29ea05430141429050290c053f015660a052180a7f02968140a430147c05", - "0x141422053dc0a8602bd9ea0715029ec0543015ec0510029ec05430141474", - "0x150c053d015020a7d0150c057c814560a7c8150c057bbe00e24053e00a86", - "0x2040afa02a180afa028c0140702a180a0702858143402a180a34028b0147a", - "0x15020a052180a16028d0140a43014fc05598281486028280e0a7d01c687a", - "0x15660a052180a3602a4c140a43014140705029f8050513014fb02a180a75", - "0x29f605430146a05408281486029cc0ab3050290c050b014680a052180a7e", - "0x3f80a8602bf80a20053f80a8602828860a7e8150c05050a4140a43014148d", - "0xac149d02a180aff8001c480a800150c050508814ff02a180afe7e81c540a", - "0x140e050b028680543014680516029f60543015f6054082a0205430153a05", - "0x1c80a6f050290c050501c1501038d1f68102c040a8602c040a300501c0a86", - "0x28820a810150c05050a4140a43014e605598281486029f80ab3050290c05", - "0x150c0505088150402a180b038101c540a818150c0581814400a818150c05", - "0x2850054301450054082a0e05430160c051582a0c05430160905038901505", - "0xa4508102c1c0a8602c1c0a300501c0a860281c0a16050a40a86028a40a2c", - "0x2180a0a050281486028292c0a3f0150c0505254147302a180a0a4a82a0e07", - "0x2180a72029c8140a430141407050a45007840d06a074301c0a0a03814140a", - "0x16122a1001d0c070e814e60a1a8150c051a815020a052180a0a358283a05", - "0xac0a67050ac0a86028900a68050900a86028a80a06050290c050501c1422", - "0x28150a02828980a180150c0516014cc0a0b0150c05100146a0a160150c05", - "0x150c05110146a0a108150c050b814c40a0b8150c0505190140a430141407", - "0x281486028280e0a1b016160602a180e3002980143002a180a21029981416", - "0x290c050501c147502c30fe7a03a180e061a81d680a030150c05031f80e97", - "0x281486028280e0a1f0161a401e01d0c070b014e60a3d0150c053d015020a", - "0x146a0a208150c0540814d00a408150c05409cc0e97052040a86029000a06", - "0x10c0a5f050290c050501c146f02c38867403a180e3c029cc143c02a180a3c", - "0x28150f02828980a338150c0535814000a340150c053a0146a0a358150c05", - "0x150c05378146a0a260150c0533015160a330150c0505190140a430141407", - "0x281486028280e0a31016206402a180e6702a30146702a180a4c028001468", - "0x150c0534014780a2f0150c05050a4146002a180a6402818140a43014148d", - "0x238143402a180a34028b0147a02a180a7a02a04145f02a180a60029a0145a", - "0xd0f47345028be0543014be0510028bc0543014bc0547828b40543014b405", - "0x281486028280e0a47016228d02a180e8c02a40148c45800e4860297cbc5a", - "0x1c8140a430141407052440b12480150c0745015240a4523c0e8602a340a91", - "0x14680a052180a0a038292a0589a5126074301d2405398292405430151e05", - "0x1f8140a43014fe055a828148602a400a75050290c054a014500a052180a93", - "0x25c0a8602a5c0a200525c0a86028283a0a4b0150c05050a4140a430148205", - "0xac149a02a180a984c81c480a4c8150c0505088149802a180a974b01c540a", - "0x140e050b0291605430151605160280005430140005408295605430153405", - "0x2540a34050290c050501c14ab03a2c008102aac0a8602aac0a300501c0a86", - "0x1d0c0744a2c00721b0291205430151205108291205430141417050290c05", - "0x2180ab1029d414b25881d0c0548014fe0a052180a0a0382960af03c515cad", - "0x156e0a5a8150c0559014780a5a0150c05598156c0a598150c0505190140a", - "0x2dd6c814301d68b5209fc0eae032e014ad02a180aad02a0414b402a180ab4", - "0x2f00a8602828520a052180ab9029bc140a430141407052ed74883945572b8", - "0x1fc14bf02a180abe5e01c540a5f0150c055f014400a5f0150c055c0155c0a", - "0x149e05200289e054301582051e028148602b000a75053058007430157e05", - "0x2d80a8602ad80a2c052b40a8602ab40a810530c0a8602b080a3e053080a86", - "0x2180a0a0382986b75b2b50205618150c0561814600a5b8150c055b8142c0a", - "0x20414c602a180ac5028ac14c502a180abb6201c480a620150c0505088140a", - "0x158c051802974054301574050b0291005430151005160295a05430155a05", - "0x14fe055a828148602a400a75050290c050501c14c65d2215a8102b180a86", - "0x31c0a200531c0a8602828820a438150c05050a4140a4301482053f0281486", - "0x2180ac86481c480a648150c050508814c802a180ac74381c540a638150c05", - "0x296005430156005160295e05430155e05408299805430159605158299605", - "0x290c050501c14cc03ac15e8102b300a8602b300a300501c0a860281c0a16", - "0x2180a41029f8140a43014fe055a828148602a3c0a6f050290c0548815260a", - "0x1414070502a2c050513014ce02a180a8b028b014cd02a180a0002a04140a", - "0x15020a678150c0547014560a052180a7f02ad4140a4301482053f0281486", - "0x2180acf028c0140702a180a0702858148b02a180a8b028b0140002a180a00", - "0x290c0531015260a052180a0a468281486028280e0a6781d1600408159e05", - "0x2180a7a02a04140a43014d0051a0281486029fc0ab5050290c0520814fc0a", - "0x14400a688150c050525014d002a180a0a148299c05430146805160299a05", - "0x15a4d30389014d302a180a0a11029a40543015a2d0038a814d102a180ad1", - "0x3380a8602b380a2c053340a8602b340a81053540a8602b500a2b053500a86", - "0x2180a0a03829aa076733502056a8150c056a814600a038150c05038142c0a", - "0x2180a7f02ad4140a43014e605598281486028f80a34050290c0505234140a", - "0x3580e2a0539c0a8602b9c0a200539c0a8602828e80a6b0150c05050a4140a", - "0x2180aea028ac14ea02a180ae87481c480a748150c050508814e802a180ae7", - "0x280e05430140e050b028680543014680516028f40543014f40540829d605", - "0x281486029cc0ab3050290c050501c14eb038d0f48102bac0a8602bac0a30", - "0x281486028280e0a0545c0a0a26029d80543014ea05408281486028580a34", - "0x290c053f015660a052180a16028d0140a43014e605598281486028d80a93", - "0x150c050510c14ee02a180a0a148281486028291a0a760150c051a815020a", - "0x9014f102a180a0a11029e00543015deee038a814ef02a180aef0288014ef", - "0xd00a2c053b00a8602bb00a81053cc0a8602bc80a2b053c80a8602bc1e207", - "0x29e6071a3b10205798150c0579814600a038150c05038142c0a1a0150c05", - "0x281486029f80ab3050290c0539014de0a052180a7302acc140a430141407", - "0x15eaf4038a814f502a180af50288014f502a180a0a20829e805430141429", - "0x3e40a8602be00a2b053e00a8602bd9ee0712029ee05430141422053d80a86", - "0x14600a038150c05038142c0a148150c0514814580a140150c0514015020a", - "0x18e6074301c0a0a03814140a43014148d053e40e29142040af902a180af9", - "0x1cc0a86029cc0a81050d102074301502055c8281486028280e0a1a9f80f18", - "0x1c80a88050290c0540814fc0a052180a0a0382850058c8290c071a0155e0a", - "0x2180a7302a04142002a180a1d02aec141d02a180a290381d740a148150c05", - "0x141407050800c733901440054301440055e0280c05430140c0516028e605", - "0xa80a73050290c05051ac142a02a180a07029c8140a430145005588281486", - "0x145805340285805430144805030281486028280e0a1581634241101d0c07", - "0x840a86028c00a660505c0a86028880a35050c00a86028580a67050580a86", - "0x1e80a86028d80a62050d80a8602828c80a052180a0a03828151b02828980a", - "0x14c00a3f8150c050b814780a108150c053d014cc0a0b8150c05158146a0a", - "0x2180a753901c540a052180a0a468281486028280e0a1e016387502a180e21", - "0x28e60543014e605408288205430147c8103afc143e02a180a0a5f0288005", - "0x1040a20051000a86029000a8f051fc0a86029fc0a8e050180a86028180a2c", - "0x141407051bc867439014de433a1c90c0520900fe06399cd140a208150c05", - "0x147805600281486029c80a75050290c0540814fc0a052180a0a468281486", - "0x150c0539815020a338150c0534015760a340150c05359fc0eba051ac0a86", - "0x2180a0a03828ce06399c80a6702a180a6702af0140602a180a06028b01473", - "0x2180a0a1482814860281c0a6f050290c0539014ea0a052180a81029f8140a", - "0x28c805430149866038a8144c02a180a4c02880144c02a180a0a20828cc05", - "0x1f80a81051780a86029800ac1051800a8602990c40712028c405430141422", - "0x2040c5e1a9f8e4052f0150c052f015780a1a8150c051a814580a3f0150c05", - "0x1c0a0a2f180be0a408a8c05f05204147203814145e3017c148115180be0a", - "0x178c05f0520454602f829031d3901c0a0a2f180be0a408a8c05f05205aa72", - "0x1c80c1d1517c14738f9c80e0505178c05f0520454602f829031e3901c0a0a", - "0x120409c80e05051d0be0a" + "0x1540c05029640c05029600c050295cac05029541405029545405029501453", + "0x180a052e8180a052a9700a052d8180a052d10c0a052c8800a052c8800a05", + "0x140a5505188c00502954c205029540a07300140e5f208140a5e1f0140a5e", + "0x1800a072f9300a052f0a80a052f0740a052c8740a05331940a052d828c863", + "0x140e5f030140a6b051a8540502964d2050296cd0050296cce050296c1407", + "0x28e00a379b00a05370140e6c0281cbe0702814bc0a369b00a052a8280e6c", + "0x140a55388140a6e0281ce2050397ce205029541407388140e5f140140a59", + "0x14b60702814b23c02814dc4002814a87502814dc7439814e41d02814aa2a", + "0x1646c05029506c0502960f60502954147a030140a79051e00c05029dcec05", + "0x29028002814b27402814b67f02814b20a3f028fa0a3e0d40a052c8d00a05", + "0x17814071e0140e5f030140a840520ce605029541407398140e5f410140a59", + "0x1cbe05038f00a072f8290a0502814b67502814aa0a039d40a072f9000a05", + "0x1c147f0301d10744101d0e07028280e05050290e050502814860281cea05", + "0x150e0541014e80a1a0150e0539815040a1a8150e053a014e60a0521c0a0a", + "0x290e050501c141d02a24522803a1c0e34029fc143502a1c0a35028181482", + "0xa00a28050290e0515014680a150150e05148146a0a100150e051a814e60a", + "0x280e0a1581514241101d0e0714014fe0a100150e05100140c0a140150e05", + "0x281487028580a34050580a87028900a35050b00a87028800a73050290e05", + "0x840a4c0b8c00e87038880a7f050b00a87028b00a06050880a87028880a28", + "0x150e0516014e60a0521c0a1702874140a438146005148281487028280e0a", + "0x1ec0e24052000a8702a000a22052000a8702828540a3d8150e05050801436", + "0x21c0a4002858144002a1c0a761e01c580a1e0150e05050ac147602a1c0a80", + "0x280e05438140e05180286c05438146c050302904054381504053a0287c05", + "0x281487028840a29050290e050501c143e038d90482028f80a87028f80a17", + "0x14ea051b028820543814820503028ea05438141421051040a87028b00a73", + "0x14e60a0521c0a0a03828d26c03a2ce24303a1c0e7520a08e67b051d40a87", + "0x1300a87029300a22051300a8702829000a338150e0505080146802a1c0a71", + "0x100140a43814c6051e028c26303a1c0a65029d8146502a1c0a4c3381c480a", + "0x1486053a028ac0543814b80520828b80543814c0051f028c00543814c205", + "0x1580a87029580a170501c0a870281c0a30051a00a87029a00a060510c0a87", + "0x2300a8702828400a000150e0534814e60a0521c0a0a03828ac073410d0405", + "0x28560a470150e0546a300e24052340a8702a340a22052340a8702828ea0a", + "0x21c0a6c029d0149102a1c0a9002858149002a1c0a8e4781c580a478150e05", + "0x1522054381522050b8280e05438140e0518028000543814000503028d805", + "0x292405438144005398281487028ac0a29050290e050501c149103800d882", + "0x15289303890149402a1c0a9402888149402a1c0a0a218292605438141420", + "0x2600a8702a5c0a160525c0a8702a552c07160292c0543814142b052540a87", + "0x142e0a038150e0503814600a490150e05490140c0a410150e0541014e80a", + "0x14e60a0521c0a1d028a4140a438141407052600e92412080a9802a1c0a98", + "0x22c0a8702a2c0a220522c0a8702828e20a4d0150e0505080149902a1c0a35", + "0x58149d02a1c0a9b4e01c580a4e0150e05050ac149b02a1c0a8b4d01c480a", + "0x140e051802932054381532050302904054381504053a0293c05438153a05", + "0x1cc0a6c050290e050501c149e03a65048202a780a8702a780a170501c0a87", + "0x8814a102a1c0a0a3a82940054381414200527c0a87029fc0a73050290e05", + "0x289460716029460543814142b052880a8702a854007120294205438154205", + "0x150e054f8140c0a030150e0503014e80a528150e05520142c0a520150e05", + "0x14140a052940e9f032080aa502a1c0aa50285c140702a1c0a07028c0149f", + "0x14e805398281487028280e0a3f8180ea63a2080e87038141407028281487", + "0xd40a87028d40a06052080a8702a080a74050d00a87029cc0a82050d40a87", + "0x284005438146a05398281487028280e0a0e8154e291401d0e071a014fe0a", + "0x144005030285005438145005140281487028a80a34050a80a87028a40a35", + "0x21c0a22028a4140a438141407050ac0aa8120880e87038a00a7f050800a87", + "0x14142a050580a8702828400a160150e0510014e60a0521c0a2402874140a", + "0x840a8702828560a0b8150e05180580e24050c00a87028c00a22050c00a87", + "0x18148202a1c0a82029d0147b02a1c0a3602858143602a1c0a171081c580a", + "0x1c588241014f60543814f6050b8280e05438140e05180285805438145805", + "0x21c0a0a108290005438144005398281487028ac0a29050290e050501c147b", + "0x1d0e073b20104733d828ec0543814ec051b029000543815000503028ec05", + "0x10c0a8702828400a3a8150e0520014e60a0521c0a0a03828823e03aa4803c", + "0x14ec0a360150e053890c0e24051c40a87029c40a22051c40a8702829000a", + "0x21c0a67028f8146702a1c0a6802900140a43814d2051e028d06903a1c0a6c", + "0x28ea0543814ea050302878054381478053a028ca05438149805208289805", + "0x290e050501c1465039d47882029940a87029940a170501c0a870281c0a30", + "0x14c00511028c005438141475051840a8702828400a318150e0520814e60a", + "0x150e052e1580e2c051580a8702828560a2e0150e05301840e24051800a87", + "0xc0146302a1c0a6302818143e02a1c0a3e029d0148c02a1c0a00028581400", + "0x281487028280e0a4601cc63e4101518054381518050b8280e05438140e05", + "0x150e05051c4148e02a1c0a0a100291a05438146a05398281487028740a29", + "0xb0149102a1c0a0a158292005438151e8e03890148f02a1c0a8f02888148f", + "0x2340a06052080a8702a080a740524c0a8702a480a16052480a8702a412207", + "0x29260746a090405498150e05498142e0a038150e0503814600a468150e05", + "0x2540a8702828400a4a0150e053f814e60a0521c0a73029b0140a438141407", + "0x28560a4b8150e054b2540e24052580a8702a580a22052580a8702828ea0a", + "0x21c0a06029d0149a02a1c0a9902858149902a1c0a974c01c580a4c0150e05", + "0x1534054381534050b8280e05438140e05180292805438152805030280c05", + "0x1c147f0301d54744101d0e07028280e05050290e0505028149a03a500c82", + "0x28148702828d20a1a0150e0539815040a1a8150e053a014e60a0521c0a0a", + "0x740aab148a00e87038d00a7f050d40a87028d40a06052080a8702a080a74", + "0x1454053402854054381452051a8284005438146a05398281487028280e0a", + "0xb00a87028a00a28050ac0a87028800a06050900a87028880a67050880a87", + "0x150e051a814e60a0521c0a0a0382814ac02828ca0a0b0150e0512014980a", + "0x14500a158150e05180140c0a108150e050b814c20a0b8150e050518c1430", + "0x280e0a3d8155a3602a1c0e1602980141602a1c0a2102930142c02a1c0a1d", + "0x158148002a1c0a8002818148002a1c0a2b029cc140a43814145c050290e05", + "0x14e60a0521c0a3c02800140a438141407051000aae1e1d80e87038d90407", + "0x21c0e2c029fc143e02a1c0a3e02818147602a1c0a76029d0143e02a1c0a80", + "0x150e053a8146a0a388150e051f014e60a0521c0a0a038288605579d48207", + "0x14e20503028820543814820514028148702828d20a0521c0a6c028d0146c", + "0x21c0a71029cc140a4381414070519c0ab0341a40e87039040a7f051c40a87", + "0x28c20543814d20514028c60543814980503028ca0543814d005460289805", + "0x1700a87029c40a73050290e050501c140a588141465051800a87029940a8d", + "0x19c0a280518c0a87029700a06050000a87029580a8e051580a8702828c60a", + "0x141407052340ab2460150e07300151e0a300150e05000151a0a308150e05", + "0x28400a478150e05460146a0a470150e0531814e60a0521c0a0a2e0281487", + "0x150e053b014e80a490150e0547814d00a488150e0530814800a480150e05", + "0x88149002a1c0a9002a44149102a1c0a9102a40148e02a1c0a8e028181476", + "0x150e074a815260a4aa51267343815249048a38ec74490292405438152405", + "0x2693207438152c054a0293005438152805398281487028280e0a4b8156696", + "0xf0140a4381414070526c0ab4458150e074d0152a0a4c0150e054c0140c0a", + "0x21c0a9c02818149d02a1c0a9902a08149c02a1c0a98029cc140a438151605", + "0x290e054f014520a0521c0a0a0382940055aa7d3c074381d3a053f8293805", + "0x21c0a0a150294405438141420052840a8702a700a73050290e054f8143a0a", + "0x294a0543814142b052900a8702a8d4407120294605438154605110294605", + "0x140c0a498150e0549814e80a5b8150e055b0142c0a5b0150e05522940e2c", + "0x2dc0ea149a080ab702a1c0ab70285c140702a1c0a07028c014a102a1c0aa1", + "0x150e0505084148a02a1c0a9c029cc140a438154005148281487028280e0a", + "0x2e40e8703ae11493399ec14b802a1c0ab8028d8148a02a1c0a8a0281814b8", + "0x297e05438141420052f80a8702ae80a73050290e050501c14bd5e01d76ba", + "0x3040a76053040a8702b017e07120298005438158005110298005438141480", + "0x150e05278147c0a278150e0561814800a0521c0ac2028f014c36101d0e05", + "0xc014be02a1c0abe0281814b902a1c0ab9029d014c502a1c0ac40290414c4", + "0x281487028280e0a6281d7cb9410158a05438158a050b8280e05438140e05", + "0x21c0ac70288814c702a1c0a0a3a8298c05438141420052240a8702af40a73", + "0x3280a8702b21920716029920543814142b053200a8702b1d8c07120298e05", + "0x14600a448150e05448140c0a5e0150e055e014e80a658150e05650142c0a", + "0x258140a4381414070532c0e895e2080acb02a1c0acb0285c140702a1c0a07", + "0x150e0549814e80a660150e054c014e60a0521c0a99029b0140a438153605", + "0x21c0a94029cc140a438141407050299e050519414ce02a1c0acc0281814cd", + "0x29a00543815a0050302926054381526053a029a205438152e050b029a005", + "0x290e050501c14d103b41268202b440a8702b440a170501c0a870281c0a30", + "0x150e0531814e60a0521c0a61028a4140a438151a054b028148702828b80a", + "0x292e0a698150e050508014ce02a1c0ad20281814cd02a1c0a76029d014d2", + "0x150e05050ac148802a1c0ad46981c480a6a0150e056a014440a6a0150e05", + "0x299a05438159a053a029ae0543815ac050b029ac054381510d5038b014d5", + "0x3399a8202b5c0a8702b5c0a170501c0a870281c0a30053380a8702b380a06", + "0x141420053600a87028f80a73050290e0521814520a0521c0a0a03829ae07", + "0x36c0a8702b69b20712029b40543815b40511029b405438141443053640a87", + "0x14e80a6f0150e056e8142c0a6e8150e056db700e2c053700a8702828560a", + "0x21c0ade0285c140702a1c0a07028c014d802a1c0ad802818147602a1c0a76", + "0x21c0a80029cc140a438145805148281487028280e0a6f01db07641015bc05", + "0x280e0a053880a0a32829c20543815be0503029c0054381480053a029be05", + "0xac0a73050290e0516014520a0521c0a7b02a58140a43814145c050290e05", + "0x3900a8702828400a708150e05718140c0a700150e0541014e80a718150e05", + "0x28560a730150e0572b900e24053940a8702b940a22053940a8702828e20a", + "0x21c0ae0029d014e902a1c0ae80285814e802a1c0ae67381c580a738150e05", + "0x15d20543815d2050b8280e05438140e0518029c20543815c20503029c005", + "0x29d40543814fe05398281487029cc0a6c050290e050501c14e903b85c082", + "0x15d8eb0389014ec02a1c0aec0288814ec02a1c0a0a3a829d605438141420", + "0x3c00a8702bbc0a16053bc0a8702bb5dc0716029dc0543814142b053b40a87", + "0x142e0a038150e0503814600a750150e05750140c0a030150e0503014e80a", + "0x264147f02a1c0a0a4c028e805438141498053c00eea032080af002a1c0af0", + "0x280e0a148a00ef11a0d40e8703814140702828148702828140a0521c0a0a", + "0x1d0140a438141469050800a87029cc0a82050740a87028d00a73050290e05", + "0x2848057908854074381c40053f8283a05438143a05030286a05438146a05", + "0x21c0a2c029a0142c02a1c0a22028d4142b02a1c0a1d029cc140a438141407", + "0x284205438145405140282e05438145605030286005438142c05338282c05", + "0x1ec0a87028740a73050290e050501c140a798141465050d80a87028c00a4c", + "0x900a280505c0a87029ec0a06051d80a8702a000a61052000a8702828c60a", + "0x141407050f00af4030150e071b014c00a1b0150e053b014980a108150e05", + "0x18140602a1c0a063f81d340a200150e050b814e60a0521c0a0a2e0281487", + "0x1cc140a438141407051d40af5208f80e87038186a072b0288005438148005", + "0x1c42053f8288605438148605030287c05438147c053a0288605438148005", + "0x21c0a6c028d4146802a1c0a43029cc140a438141407051a40af6361c40e87", + "0xa0140a4381414690519c0a8702a080a68052080a8702a08e8074d0290405", + "0x28c6057b99498074381ce2053f828d00543814d00503028e20543814e205", + "0x21c0a6102818146002a1c0a6502a30146102a1c0a68029cc140a438141407", + "0x280e0a053e00a0a32828000543814c00546828ac0543814980514028b805", + "0x291c05438151a05470291a05438141463052300a87029a00a73050290e05", + "0xa8f050000a8702a380a8d051580a870298c0a28051700a8702a300a06", + "0x2440a87029700a73050290e0505170140a438141407052400af9478150e07", + "0x2480a68052500a87029580a400524c0a8702828400a490150e05478146a0a", + "0x150e054a015200a488150e05488140c0a1f0150e051f014e80a4a8150e05", + "0x21c0a9549a51223e3a248149502a1c0a9502888149302a1c0a9302a441494", + "0x21c0a97029cc140a438141407052680afa4c8150e074c015260a4c25d2c73", + "0x2740a8703a700a950522c0a8702a2c0a060527136074381532054a0291605", + "0x1814a002a1c0a9b02a08149f02a1c0a8b029cc140a438141407052780afb", + "0x14520a0521c0a0a0382946057e28942074381d40053f8293e05438153e05", + "0x140a43814ce051a028148702a740a3c050290e05510143a0a0521c0aa1", + "0x2d80a8702828540a528150e050508014a402a1c0a9f029cc140a438148205", + "0x1c580a450150e05050ac14b702a1c0ab65281c480a5b0150e055b014440a", + "0x154805030292c05438152c053a02972054381570050b0297005438156e8a", + "0x1c14b903a912c8202ae40a8702ae40a170501c0a870281c0a30052900a87", + "0x297805438141421052e80a8702a7c0a73050290e0551814520a0521c0a0a", + "0x3f57cbd03a1c0ebc5d258e67b052f00a8702af00a36052e80a8702ae80a06", + "0x1d014c102a1c0ac10281814c102a1c0abe029cc140a438141407053017e07", + "0x21c0a0a0382912c5621cdfc4f61b08e6870381d8207458297a05438157a05", + "0x270144f02a1c0a4f02a6c14c602a1c0ac2029cc14c202a1c0ac202818140a", + "0x27c140a4381590054f02998cb653259074438158e054e8298e05438149e05", + "0x3340a8702b280aa0050290e0566014680a0521c0acb02800140a438159205", + "0x15420a630150e05630140c0a618150e0561814600a668150e0566814440a", + "0x21c0a9d029d814d002a1c0ac6029cc140a438141407053380aff0521c0ecd", + "0x29a00543815a00503029a60543815a40520028148702b440a3c05349a207", + "0x140c0a0521c0a0a03829b0d76b1ce00d544350e68703b4cce4161b40e8a2", + "0x21c0ada0290414da02a1c0ad5028f814d902a1c0ad4029cc14d402a1c0ad4", + "0x29100543815100518029b20543815b205030297a05438157a053a029b605", + "0x3580a8702b580a06050290e050501c14db443657a8202b6c0a8702b6c0a17", + "0x142c0a6f0150e056c3740e2c053740a8702828560a6e0150e056b014e60a", + "0x21c0ad7028c014dc02a1c0adc0281814bd02a1c0abd029d014df02a1c0ade", + "0x159c05518281487028280e0a6fb5db8bd41015be0543815be050b829ae05", + "0x3180a73050290e0520814000a0521c0a67028d0140a438153a051e0281487", + "0x29c60543815c60511029c6054381414a4053840a8702828400a700150e05", + "0x142c0a730150e05723940e2c053940a8702828560a720150e0571b840e24", + "0x21c0ac3028c014e002a1c0ae00281814bd02a1c0abd029d014e702a1c0ae6", + "0x153a051e0281487028280e0a73b0dc0bd41015ce0543815ce050b8298605", + "0x14e60a620150e05620140c0a0521c0a4102800140a43814ce051a0281487", + "0x21c0aea0285814ea02a1c0a897481c580a748150e05050ac14e802a1c0ac4", + "0x298a05438158a0518029d00543815d005030297a05438157a053a029d605", + "0x28148702a740a3c050290e050501c14eb62ba17a8202bac0a8702bac0a17", + "0x150e050508014ec02a1c0ac0029cc140a4381482050002814870299c0a34", + "0xac14ef02a1c0aee7681c480a770150e0577014440a770150e05051d414ed", + "0x157e053a02a04054381602050b02a020543815def0038b014f002a1c0a0a", + "0x4080a8702c080a170501c0a870281c0a30053b00a8702bb00a06052fc0a87", + "0x28148702a6c0a6c050290e054f0152c0a0521c0a0a0382a0407762fd0405", + "0x21c0a96029d0150302a1c0a8b029cc140a4381482050002814870299c0a34", + "0x148205000281487028280e0a054180a0a3282a0a054381606050302a0805", + "0x1d0150802a1c0a9a02858150702a1c0a97029cc140a43814ce051a0281487", + "0x1610050b8280e05438140e051802a0e05438160e05030292c05438152c05", + "0x21c0a9002a58140a43814145c050290e050501c150803c1d2c8202c200a87", + "0x14b805398281487029580a29050290e0520814000a0521c0a67028d0140a", + "0x2a1405438141420054140a8702c240a06054100a87028f80a74054240a87", + "0x14142b054300a8702c2e14071202a16054381616051102a1605438141497", + "0x150e0582014e80a878150e05870142c0a870150e05864340e2c054340a87", + "0x2080b0f02a1c0b0f0285c140702a1c0a07028c0150502a1c0b05028181504", + "0x154a0a0521c0a4102800140a43814d205148281487028280e0a8781e0b04", + "0x2a2405438141443054440a8702828400a880150e0521814e60a0521c0a74", + "0x2a00e2c052a00a8702828560a898150e05894440e24054480a8702c480a22", + "0x21c0b1002818143e02a1c0a3e029d0151502a1c0b1402858151402a1c0b13", + "0x280e0a8a81e203e410162a05438162a050b8280e05438140e051802a2005", + "0x1d0151602a1c0a40029cc140a43814e805528281487028840a29050290e05", + "0x281487028280e0a054640a0a3282a3005438162c050302a2e0543814ea05", + "0x281487029d00aa5050290e0510814520a0521c0a3c02a58140a43814145c", + "0x1634050302a2e05438146a053a02a3405438142e05398281487029fc0aa5", + "0x90151c02a1c0b1c02888151c02a1c0a0a3882a3605438141420054600a87", + "0x47c0a160547c0a8702c763c071602a3c0543814142b054740a8702c723607", + "0x150e0503814600a8c0150e058c0140c0a8b8150e058b814e80a900150e05", + "0x21c0a7f02a94140a438141407054800f188ba080b2002a1c0b200285c1407", + "0x141420054840a87028a40a73050290e0539814d80a0521c0a7402a94140a", + "0x4900a8702c8e44071202a46054381646051102a4605438141475054880a87", + "0x14e80a938150e05930142c0a930150e05924940e2c054940a8702828560a", + "0x21c0b270285c140702a1c0a07028c0152102a1c0b2102818142802a1c0a28", + "0x21c0a0a4c828fe05438141498051d00a8702829300a9381e4228410164e05", + "0x290e050501c14291401e50341a81d0e07028280e05050290e0505028140a", + "0x146a053a028148702828d20a100150e0539815040a0e8150e051a014e60a", + "0x141407050900b29110a80e87038800a7f050740a87028740a06050d40a87", + "0x282c054381458053402858054381444051a8285605438143a05398281487", + "0xc00a4c050840a87028a80a280505c0a87028ac0a06050c00a87028580a67", + "0x28c60a3d8150e050e814e60a0521c0a0a03828152a02828ca0a1b0150e05", + "0x150e0512014500a0b8150e053d8140c0a3b0150e0540014c20a400150e05", + "0x281487028280e0a1e016568202a1c0e3602980143602a1c0a76029301421", + "0x14800503029040543815047403a68144002a1c0a17029cc140a43814145c", + "0x148005398281487028280e0a3a81658411f01d0e07410d40eb6051000a87", + "0x1c40e87038840a7f0510c0a870290c0a06050f80a87028f80a740510c0a87", + "0x280c0543814d8051a828d005438148605398281487028280e0a348165a6c", + "0x14e20514028148702828d20a338150e0503014d00a030150e05031fc0e9a", + "0x1414070518c0b2e329300e87039c40a7f051a00a87029a00a06051c40a87", + "0x28b80543814c20503028c00543814ca0546028c20543814d005398281487", + "0x290e050501c140a978141465050000a87029800a8d051580a87029300a28", + "0x2300a06052380a8702a340a8e052340a8702828c60a460150e0534014e60a", + "0x150e07000151e0a000150e05470151a0a2b0150e0531814500a2e0150e05", + "0x146a0a488150e052e014e60a0521c0a0a2e0281487028280e0a48016608f", + "0x150e0549014d00a4a0150e052b014800a498150e0505080149202a1c0a8f", + "0x244149402a1c0a9402a40149102a1c0a9102818143e02a1c0a3e029d01495", + "0x25d2c73438152a934a2447c74490292a05438152a05110292605438152605", + "0x291605438152e05398281487028280e0a4d016629902a1c0e9802a4c1498", + "0x2780b324e8150e074e0152a0a458150e05458140c0a4e26c0e8702a640a94", + "0x153e05030294005438153605410293e05438151605398281487028280e0a", + "0x21c0aa1028a4140a4381414070528c0b33512840e8703a800a7f0527c0a87", + "0x14ce051a028148702a740a3c050290e05208156e0a0521c0aa202874140a", + "0x14440a5b0150e05050a814a502a1c0a0a100294805438153e05398281487", + "0x156e8a038b0148a02a1c0a0a158296e05438156ca50389014b602a1c0ab6", + "0x2900a8702a900a06052580a8702a580a74052e40a8702ae00a16052e00a87", + "0x21c0a0a0382972075225904055c8150e055c8142e0a038150e0503814600a", + "0x2e80a06052f00a8702828420a5d0150e054f814e60a0521c0aa3028a4140a", + "0x3017e079a2f97a074381d78ba4b1ccf60a5e0150e055e0146c0a5d0150e05", + "0x3080a3c0530d8407438153a053b0298205438157c05398281487028280e0a", + "0x298a05438158605200298805438149e05450289e05438141463050290e05", + "0x3040cb9052f40a8702af40a74053100a8702b100ab8053040a8702b040a06", + "0x3200a6c050290e050501c14cb65324e7356431d8c894121c0ec46299c8207", + "0x299a05438141420053300a8702a240a73052240a8702a240a06050290e05", + "0x14ec0a680150e05673340e24053380a8702b380a22053380a8702b1c0aa0", + "0x21c0ad3028f814d302a1c0ad202900140a43815a2051e029a4d103a1c0ad0", + "0x299805438159805030297a05438157a053a029100543815a80520829a805", + "0x290e050501c1488633317a8202a200a8702a200a17053180a8702b180a30", + "0x3580e2c053580a8702828560a6a8150e0564814e60a648150e05648140c0a", + "0x21c0ad50281814bd02a1c0abd029d014d802a1c0ad70285814d702a1c0acb", + "0x280e0a6c329aabd41015b00543815b0050b829940543815940518029aa05", + "0x14e60a0521c0a67028d0140a438153a051e0281487029040ab7050290e05", + "0x36c0a8702b6c0a220536c0a8702828ea0a6d0150e050508014d902a1c0ac0", + "0x5814de02a1c0adc6e81c580a6e8150e05050ac14dc02a1c0adb6d01c480a", + "0x140e0518029b20543815b205030297e05438157e053a029be0543815bc05", + "0x2780a96050290e050501c14df03b657e8202b7c0a8702b7c0a170501c0a87", + "0x14e60a0521c0a67028d0140a4381482055b828148702a6c0a6c050290e05", + "0x2a6c050519414e302a1c0ae00281814e102a1c0a96029d014e002a1c0a8b", + "0x150e054b814e60a0521c0a4102adc140a43814ce051a0281487028280e0a", + "0xc014e402a1c0ae402818149602a1c0a96029d014e502a1c0a9a0285814e4", + "0x281487028280e0a7281dc89641015ca0543815ca050b8280e05438140e05", + "0x2814870299c0a34050290e05208156e0a0521c0a9002a58140a43814145c", + "0x15cc0503029c205438147c053a029cc0543814b805398281487029580a29", + "0x9014e802a1c0ae80288814e802a1c0a0a4b829ce054381414200538c0a87", + "0x3ac0a16053ac0a8702ba5d40716029d40543814142b053a40a8702ba1ce07", + "0x150e0503814600a718150e05718140c0a708150e0570814e80a760150e05", + "0x21c0a69028a4140a438141407053b00ee370a080aec02a1c0aec0285c1407", + "0x141420053b40a870290c0a73050290e053f8154a0a0521c0a4102adc140a", + "0x3c00a8702bbddc0712029de0543815de0511029de05438141443053b80a87", + "0x14e80a818150e05810142c0a810150e05784040e2c054040a8702828560a", + "0x21c0b030285c140702a1c0a07028c014ed02a1c0aed02818143e02a1c0a3e", + "0x21c0a21028a4140a43814fe05528281487028280e0a8181dda3e410160605", + "0x194150702a1c0b0402818150502a1c0a75029d0150402a1c0a40029cc140a", + "0x1fc0aa5050290e051e0152c0a0521c0a0a2e0281487028280e0a054dc0a0a", + "0x1d0150802a1c0a17029cc140a43814e805528281487028840a29050290e05", + "0x150e05051c4150902a1c0a0a1002a0e054381610050302a0a05438146a05", + "0xb0150c02a1c0a0a1582a160543816150903890150a02a1c0b0a02888150a", + "0x41c0a06054140a8702c140a74054380a8702c340a16054340a8702c2e1807", + "0x2a1c0783c150405870150e05870142e0a038150e0503814600a838150e05", + "0x281487029cc0a6c050290e053a0154a0a0521c0a7f02a94140a438141407", + "0x21c0b1102888151102a1c0a0a3a82a20054381414200543c0a87028a40a73", + "0x2a00a8702c4a26071602a260543814142b054480a8702c4620071202a2205", + "0x14600a878150e05878140c0a140150e0514014e80a8a0150e05540142c0a", + "0x14140a43814145c054500f0f142080b1402a1c0b140285c140702a1c0a07", + "0x286805438140c05398281487028280e0a1a9fc0f38031d00e87038141407", + "0x15420a1a0150e051a0140c0a3a0150e053a014e80a142080e8702a080aba", + "0x150e051a014e60a0521c0a82028d0140a438141407050a40b390521c0e28", + "0x2844054381454055f028540543814400703af4142002a1c0a7302af0141d", + "0x74e873028880a87028880abf050740a87028740a06051d00a87029d00a74", + "0x140e05410284805438146805398281487028a40aa3050290e050501c1422", + "0x4e82c2c03a1c0e2b029fc142402a1c0a2402818140a438141469050ac0a87", + "0x14d00a108150e050b0146a0a0b8150e0512014e60a0521c0a0a038286005", + "0x21c0a2c028a0148002a1c0a1702818147b02a1c0a360299c143602a1c0a21", + "0x144805398281487028280e0a054ec0a0a32828780543814f60526028ec05", + "0x290005438148005030288205438147c05308287c05438141463051000a87", + "0xf00a60051d40a87029d80a40050f00a87029040a4c051d80a87028c00a28", + "0x1b00a8702a000a73050290e0505170140a438141407051c40b3c218150e07", + "0x1d0146702a1c0a684101d820a340150e0505300146902a1c0a433981c480a", + "0x14d20548828ea0543814ea0548028d80543814d80503028e80543814e805", + "0x1cc0a6332930e6870299cd275361d0e8920519c0a870299c0a22051a40a87", + "0x14e6051e028148702a080a34050290e0505170140a4381414070518cca4c", + "0x1700a8702980ea075e828c00543814e20561028c205438150005398281487", + "0x157e0a308150e05308140c0a3a0150e053a014e80a2b0150e052e0157c0a", + "0x1cc0a3c050290e0541014680a0521c0a0a03828ac613a1cc0a5602a1c0a56", + "0x1d4148c02a1c0a0a100280005438146a053982814870281c0a6c050290e05", + "0x21c0a0a158291c05438151a8c03890148d02a1c0a8d02888148d02a1c0a0a", + "0x1fc0a87029fc0a74052440a8702a400ac3052400a8702a391e07160291e05", + "0xa8c256052080c91001fce605488150e05488157e0a000150e05000140c0a", + "0x2904e43981c0a0a30184ac0a410a8c256052081473038141460309581482", + "0x1cc0e0505180c2560520854612b029053d3981c0a0a30184ac0a410a8c256", + "0x28ea56051cc0c1d1515814749f9cc0e0505180c2560520854612b029053e", + "0x140411cc0e05" ], "sierra_program_debug_info": { "type_names": [], diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/account_with_long_validate.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/account_with_long_validate.sierra.json index 0fe2e52abc2..132bd2951cd 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/account_with_long_validate.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/account_with_long_validate.sierra.json @@ -1,13 +1,13 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", - "0x12d", - "0xd3", + "0xa", + "0x0", + "0x14c", + "0xb4", "0x34", "0x52616e6765436865636b", "0x800000000000000100000000000000000000000000000000", @@ -95,12 +95,14 @@ "0x29", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x4761734275696c74696e", - "0x64", + "0x65", "0x7265766f6b655f61705f747261636b696e67", "0x77697468647261775f676173", "0x6272616e63685f616c69676e", + "0x72656465706f7369745f676173", "0x7374727563745f6465636f6e737472756374", "0x73746f72655f74656d70", + "0x33", "0x61727261795f736e617073686f745f706f705f66726f6e74", "0x756e626f78", "0x64726f70", @@ -111,7 +113,6 @@ "0x7374727563745f636f6e737472756374", "0x656e756d5f696e6974", "0x31", - "0x33", "0x30", "0x6765745f6275696c74696e5f636f737473", "0x2f", @@ -134,9 +135,9 @@ "0x24", "0x656e61626c655f61705f747261636b696e67", "0x23", + "0x64697361626c655f61705f747261636b696e67", "0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371", "0x22", - "0x64697361626c655f61705f747261636b696e67", "0x6", "0x20", "0x1a", @@ -156,21 +157,22 @@ "0x73746f726167655f77726974655f73797363616c6c", "0x647570", "0x66656c743235325f737562", - "0x3f0", + "0x493", "0xffffffffffffffff", - "0x9f", - "0x91", - "0x83", - "0x75", - "0x66", - "0x58", - "0x37", - "0x43", - "0x51", + "0xb7", + "0xa8", + "0x99", + "0x8a", + "0x7a", "0x35", + "0x6b", + "0x47", + "0x55", "0x36", + "0x37", "0x38", "0x39", + "0x63", "0x3a", "0x3b", "0x3c", @@ -180,10 +182,10 @@ "0x40", "0x41", "0x42", + "0x43", "0x44", "0x45", "0x46", - "0x47", "0x48", "0x49", "0x4a", @@ -193,123 +195,152 @@ "0x4e", "0x4f", "0x50", + "0x51", "0x52", "0x53", "0x54", - "0x55", "0x56", "0x57", + "0x58", "0x59", "0x5a", "0x5b", "0x5c", "0x5d", - "0x105", - "0xf7", - "0xc7", - "0xea", - "0xe3", - "0x1ec", - "0x121", - "0x126", - "0x1db", - "0x1d7", - "0x1c8", - "0x137", - "0x13c", - "0x1b6", - "0x1af", - "0x1a9", - "0x160", - "0x19b", - "0x18a", - "0x183", - "0x193", "0x5e", "0x5f", "0x60", "0x61", "0x62", - "0x63", - "0x65", + "0x64", + "0x66", "0x67", "0x68", - "0x1bc", "0x69", "0x6a", - "0x6b", "0x6c", "0x6d", "0x6e", "0x6f", + "0x12a", + "0x11b", + "0xe5", + "0x10d", + "0x105", + "0x23a", + "0x14b", + "0x152", + "0x227", + "0x221", + "0x212", + "0x16d", + "0x174", + "0x1ff", + "0x1f7", + "0x1f0", + "0x19e", + "0x1e1", + "0x1cf", + "0x1c7", + "0x1d9", "0x70", "0x71", "0x72", "0x73", "0x74", + "0x75", "0x76", - "0x1df", "0x77", "0x78", "0x79", - "0x7a", "0x7b", "0x7c", "0x7d", "0x7e", + "0x206", "0x7f", "0x80", "0x81", "0x82", - "0x2f8", - "0x20b", - "0x210", - "0x2e5", - "0x2e0", - "0x2cf", - "0x222", - "0x227", - "0x2bb", - "0x2b2", - "0x2aa", - "0x24d", - "0x29a", - "0x28e", - "0x27d", - "0x26f", - "0x2c3", - "0x2eb", + "0x83", "0x84", "0x85", "0x86", "0x87", "0x88", "0x89", - "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", - "0x375", - "0x367", - "0x359", - "0x328", - "0x34b", - "0x342", - "0x39b", - "0x392", - "0x3e1", - "0x3b7", - "0x3c3", - "0x3c8", - "0x3d6", + "0x8f", + "0x90", + "0x91", + "0x22e", + "0x92", + "0x93", + "0x94", + "0x95", + "0x96", + "0x97", + "0x98", + "0x9a", + "0x9b", + "0x9c", + "0x9d", + "0x9e", + "0x9f", + "0x376", + "0x25e", + "0x265", + "0x361", + "0x35a", + "0x349", + "0x281", + "0x288", + "0x334", + "0x32a", + "0x321", + "0x2b4", + "0x310", + "0x302", + "0x2f0", + "0x2e0", + "0x33d", + "0x36a", + "0xa0", + "0xa1", + "0xa2", + "0xa3", + "0xa4", + "0xa5", + "0xa6", + "0xa7", + "0xa9", + "0xaa", + "0xab", + "0xac", "0xad", - "0x113", - "0x1fa", - "0x308", - "0x383", - "0x3a8", - "0x219f", + "0x406", + "0x3f7", + "0x3e8", + "0x3ae", + "0x3d9", + "0x3ce", + "0x431", + "0x427", + "0x483", + "0x451", + "0x461", + "0x468", + "0x477", + "0xc6", + "0x139", + "0x249", + "0x387", + "0x415", + "0x43f", + "0x26b5", "0x380e0602810060b0682c180b050240e08028100605038180a04018080200", "0x142219030143017058581615058502605088402405088401e07030140803", "0x180a240488c362202884121c0d8800a110c87c0a180b8780a1d04870361a", @@ -321,314 +352,362 @@ "0x180a04019240e06028100648038180a040191c0e06028100646038180a04", "0x149c052682472381d8146e092606c9607030140803138146e090e06c9407", "0x180a04019040a540294c12391c008a40b288180a112813c0e06028100641", - "0x180a052f0180a052e8240a052e09c0a052d824b4092c824b05701158aa07", - "0x140a61030140a60220140a5f0f0140a5f030140a5c0f0140a5c030140a5f", - "0x1a00a052e19c0a052e0140e660281cca4102814c83e02814c80602814c662", - "0x140a61378140a5f049b8126d030140a6c049acd405029701269330140a5c", - "0x14c81a02814be1a02814ec7502814c24e02814be7402814e67204014e270", - "0x140a613c8140a613c0140a613b8140a610481ccc0503994a805029904e05", - "0x1cca3b02814c87d02814b809039f40a0732824f82702814be7b02814c27a", - "0x140e653f8140a5c0481cfe05039944a050297c127e3e8140a730281cfa05", - "0x14b68202814e68104014e21a02814b82702814b809401fc0a05398140e7f", - "0x2140c0502a1076050297d0605029847c050297c82050296c7805029cc8005", - "0xc40a052f8c00a052f8c80a052d8c80a052f2200a052e0250e06028150c09", - "0x1700e0502984128f4701c0a8d460140a5f408140a61458140a6104a281289", - "0x1d00a052e0240e740281cca4e02814c80602815240948a400a052e0200a05", - "0x1d04050399480050299012071e0140e650281ce805039941293028140a61", - "0x1c0a0904a540a0904825280503a080a07328140e3c0281cca8202814b809", - "0x240123102a540a080282012094a814120704a2d02074b1c920074a81c0a09", - "0x15020904a540a09038244a054b81860074a81c62053902520054a8152005", - "0x1d2a0718014e409180152a0518014620904a540a2602a2c122602a540a06", - "0x241295028800a8b048800a95028780a81048252a050481c122702a603c1a", - "0x20412094a8141207048480a99140880e95038680a72048680a95028680a31", - "0x1c44053902458054a81458051802444054a81444051882458054a8145005", - "0x2540a8802a2c128802a540a1f02a0412094a8141207048c80a9a0f84c0e95", - "0x252a050481c123b029d5068c03a540e13029c8121302a540a13028c41209", - "0x152a050489812094a814580545824129502a0c0a25048252a05460140c09", - "0x9c123e02a540a401e01c3c09200152a05200146009200152a0504868123c", - "0x1520054802488054a81504051102504054a8147c4103880124102a540a09", - "0x1100a95029100a2c0481c0a950281c0a12049c80a95029c80a2804a400a95", - "0x24fe054a8141213048252a051d8140c0904a540a09038248807392412005", - "0x2540a0903824f27a03a6cf67d03a540e7f392401032049fc0a95029fc0a1f", - "0x1dc0a9c04a540e7802a30127d02a540a7d02a40127802a540a2c02a201209", - "0x2740a0941824ea054a814f60514024a8054a814fa05480241295028240e09", - "0x2540a7d02a40124e02a540a091e0241295029dc0a3b048252a050481c1209", - "0x212a05271ecfa08200249c054a8149c0518024f6054a814f60514024fa05", - "0x252a0535014820904a540a0903824d0054f1a80a95039bc0a3e049bce074", - "0x141282049980a95028244c093a8152a053801450092a0152a053a0152009", - "0x1d2a05338148809338152a05311980e1e049880a95029880a30049880a95", - "0x1e8129c02a540aa0029ec12a002a540a9f029f412094a81400053f8253e00", - "0x140e0509024ea054a814ea0514024a8054a814a8054802542054a8153805", - "0x1a00a22048252a050481c12a1039d4a89002a840a9502a840a2c0481c0a95", - "0x152a05038142409380152a053801450093a0152a053a0152009510152a05", - "0x2540a2c02a2c12094a814120704a880e703a2400aa202a540aa2028b01207", - "0x28c0e1e04a900a9502a900a3004a900a9502824f209518152a05048981209", - "0x2540aa70288812a702a540aa55301c4009530152a050489c12a502a540aa4", - "0x240e054a8140e0509024f2054a814f20514024f4054a814f405480255005", - "0x241295028c80a06048252a050481c12a8039e4f49002aa00a9502aa00a2c", - "0x152a05550146009550152a05049e012a902a540a09130241295028b00a8b", - "0x2558054a815569d03880129d02a540a091382556054a81554a90387812aa", - "0x1c0a12049c80a95029c80a2804a400a9502a400a9004ab40a9502ab00a22", - "0x140c0904a540a09038255a07392412005568152a05568145809038152a05", - "0x255e054a8155e05180255e054a814127704ab80a95028244c0904a540a12", - "0x144409590152a05582c40e2004ac40a95028244e09580152a0557ab80e1e", - "0x2540a0702848127202a540a72028a0129002a540a9002a4012b302a540ab2", - "0x144e05030241295028240e095981ce4904801566054a8156605160240e05", - "0x1c3c095a8152a055a81460095a8152a050495012b402a540a09130241295", - "0x1570051102570054a8156cb70388012b702a540a09138256c054a8156ab4", - "0x1c0a950281c0a12049c80a95029c80a2804a400a9502a400a9004a780a95", - "0x252a05128140c0904a540a09038253c073924120054f0152a054f0145809", - "0x2e972070f02574054a81574051802574054a814127504ae40a95028244c09", - "0x152a055e81444095e8152a055daf00e2004af00a95028244e095d8152a05", - "0xb0120702a540a0702848127202a540a72028a0129002a540a9002a4012be", - "0x9812094a8141005270241295028240e095f01ce490480157c054a8157c05", - "0x2540abf4d81c3c095f8152a055f81460095f8152a05049e4129b02a540a09", - "0x2586054a81584051102584054a81580c10388012c102a540a09138258005", - "0x30c0a2c0481c0a950281c0a1204a2c0a9502a2c0a2804a040a9502a040a90", - "0x310e49003a540e050481c0a0904a540a0904825860745a052005618152a05", - "0x1c8129002a540a9002a40123102a540a080282012094a814120704a2d0207", - "0x151609130152a0503015020904a540a09038244a056281860074a81c6205", - "0x240e09138158c1e0d01d2a0718014e409180152a0518014620904a540a26", - "0x243409100152a050489812094a8143c05128241295028680a06048252a05", - "0x152a050489c122802a540a221001c3c09110152a05110146009110152a05", - "0x2520054a81520054802426054a81458051102458054a8145012038801212", - "0x1c920900284c0a950284c0a2c0481c0a950281c0a12049c80a95029c80a28", - "0x143e050f8243e054a8141213048252a05138140c0904a540a09038242607", - "0x24780904a540a0903825068c03b1d103203a540e1f3924010320487c0a95", - "0x152a051d8146009440152a05440145009190152a051901520091d8152a05", - "0x240e0941015904102a540e3e028f8123e200f01095028ed103204100123b", - "0x1460093f8152a0504a08124402a540a09130241295029040a41048252a05", - "0x1ec0a7f049e8f6074a814fa0522024fa054a814fe4403878127f02a540a7f", - "0x1dc0a95029e00a7a049e00a95029e40a7b049e40a95029e80a7d048252a05", - "0x145809038152a05038142409200152a052001450091e0152a051e0152009", - "0x240125402a540a820288812094a8141207049dc0e401e2400a7702a540a77", - "0x14a805160240e054a8140e050902480054a81480051402478054a8147805", - "0x2540a093c824ea054a8141226048252a050481c1254039007890029500a95", - "0x24e0054a8141227049d00a9502938ea070f0249c054a8149c05180249c05", - "0x145009460152a05460152009350152a05378144409378152a053a1c00e20", - "0x1a80e83462400a6a02a540a6a028b0120702a540a0702848128302a540a83", - "0x1980a9502824ea09340152a050489812094a8144a05030241295028240e09", - "0x1c4009338152a050489c126202a540a663401c3c09330152a05330146009", - "0x14e4051402520054a8152005480253e054a81400051102400054a814c467", - "0x1c129f039c9209002a7c0a9502a7c0a2c0481c0a950281c0a12049c80a95", - "0xc0129c02a540a093c82540054a8141226048252a05040149c0904a540a09", - "0x28544071002544054a814122704a840a9502a7140070f02538054a8153805", - "0x152a05458145009408152a05408152009520152a05518144409518152a05", - "0x14120904a900e8b40a400aa402a540aa4028b0120702a540a0702848128b", - "0x141005040241295028240e0945a040ec9392400e95038141207028241295", - "0x3280c3003a540e31029c8129002a540a9002a4012094a8141274048c40a95", - "0x14e0090d0152a05130151009130152a0503015020904a540a09038244a05", - "0x25960504a0c122002a540a1e029bc122702a540a30028c4121e02a540a1a", - "0x2540a25028c4122802a540a22029a0122202a540a09350241295028240e09", - "0x252a050481c122c02b3024054a81c40053302440054a8145005378244e05", - "0x2412950287c0a67048252a050481c123202b343e1303a540e124801cc409", - "0x20412094a814120704a0c0ace462200e950389c0a720484c0a950284c0a90", - "0x2540e88029c8128802a540a88028c412094a81476054582476054a8151805", - "0x152a051e0146209208152a0520014000904a540a09038247c05679007807", - "0x152a05049a812094a814120704825a00504a0c124402a540a4102a7c1282", - "0x270124402a540a7d02a7c128202a540a3e028c4127d02a540a7f02a80127f", - "0x2540a7b02a0412094a81412a1048252a050481c127a02b44f6054a81c8805", - "0x240125402a540a7902a20127702a540a82029f4127802a540a0913024f205", - "0x14f00551824ee054a814ee0551024e4054a814e4051402426054a8142605", - "0x2941274271d4109502950f0773904ce4a4049500a95029500a30049e00a95", - "0x154e09341a80e95029c00aa6048252a050481c126f02b48e0054a81ce805", - "0x1cce0539024ce054a814d405040241295028240e0931015a66602a540e68", - "0x252a054f8144a0904a540a000281812094a814120704a800ad44f8000e95", - "0x2540aa1028c012a102a540a090d02538054a8141226048252a0533014fe09", - "0x2900a9502a8946071002546054a814122704a880a9502a8538070f0254205", - "0x142409270152a052701450093a8152a053a8152009528152a05520144409", - "0x1812094a814120704a940e4e3aa400aa502a540aa5028b0120702a540a07", - "0x1d4c4e3a8206409530152a05530143e09530152a050484c12094a8154005", - "0x2ac0a7f04a7556074a814cc05220241295028240e09552a40ed55429c0e95", - "0x14120704ab80ad656ab00e9503a740a7204a9c0a9502a9c0a90048252a05", - "0x24012b002a540aaf02a2012af02a540aad02a0412094a8155805030241295", - "0x2a14e082002560054a81560051802550054a8155005140254e054a8154e05", - "0x14820904a540a09038256a056bad00a9503acc0a3e04acd64b1042540ab0", - "0x256e054a8156e05180256e054a814128204ad80a95028244c0904a540ab4", - "0x14fa0904a540a9e029fc12b94f01d2a055c01488095c0152a055bad80e1e", - "0x2540ab102a4012bc02a540abb029e812bb02a540aba029ec12ba02a540ab9", - "0x1578054a8157805160240e054a8140e050902564054a8156405140256205", - "0x252a055e81552095f2f40e9502ad40aa8048252a050481c12bc03ac96290", - "0x250609600152a055f01546095f8152a055901450094d8152a05588152009", - "0x1412aa04b040a95028244c0904a540aae0281812094a814120704825b005", - "0x152a05538152009618152a05613040e1e04b080a9502b080a3004b080a95", - "0x1c40096c8152a050489c12c002a540ac302a8c12bf02a540aa8028a0129b", - "0x157e051402536054a815360548025b6054a815b40511025b4054a81580d9", - "0x1c12db03afd369002b6c0a9502b6c0a2c0481c0a950281c0a1204afc0a95", - "0xc012dd02a540a093c825b8054a8141226048252a0533014fe0904a540a09", - "0x378ae0710024ae054a814122704b780a9502b75b8070f025ba054a815ba05", - "0x152a05550145009548152a055481520094d0152a056f81444096f8152a05", - "0x14120704a680eaa54a400a9a02a540a9a028b0120702a540a070284812aa", - "0x145009700152a053a815200904a540a6a0293812094a814c405558241295", - "0x24012e302a540a6f0288812094a814120704825c40504a0c12e102a540a4e", - "0x15c605160240e054a8140e05090249c054a8149c0514024ea054a814ea05", - "0x2540a7a02aac12094a81412a1048252a050481c12e303938ea9002b8c0a95", - "0x244c09708152a05390145009700152a0509815200904a540a82028181209", - "0x152a0572b900e1e04b940a9502b940a3004b940a9502824ee09720152a05", - "0x24012e902a540ae80288812e802a540ae67381c4009738152a050489c12e6", - "0x15d205160240e054a8140e0509025c2054a815c20514025c0054a815c005", - "0x2540a830281812094a81412a1048252a050481c12e903b85c09002ba40a95", - "0x3a80e1e04bac0a9502bac0a3004bac0a9502824a809750152a05048981209", - "0x2540aee0288812ee02a540aec7681c4009768152a050489c12ec02a540aeb", - "0x240e054a8140e0509024e4054a814e4051402426054a8142605480253205", - "0x2412950289c0a06048252a050481c1299039c8269002a640a9502a640a2c", - "0x241295028b00aab048252a050481c120978014128304bbc0a95028c80a90", - "0x3c40a95028244c0904a540a0950825de054a81520054802412950289c0a06", - "0x244e09798152a05793c40e1e04bc80a9502bc80a3004bc80a9502824ea09", - "0x2540aef02a4012f602a540af50288812f502a540af37a01c40097a0152a05", - "0x15ec054a815ec05160240e054a8140e0509024e4054a814e40514025de05", - "0x1e412f702a540a09130241295028200a4e048252a050481c12f6039c9de90", - "0x2540a0913825f2054a815f0f70387812f802a540af8028c012f802a540a09", - "0x2040a9502a040a9004bf00a9502bec0a2204bec0a9502be5f40710025f405", - "0x20520057e0152a057e0145809038152a05038142409458152a05458145009", - "0x141209048252a0504ab0128b02a540a094e824e4054a814129d04bf00e8b", - "0x141005040241295028240e09128180efd180c40e95038141207028241295", - "0x3f83c1a03a540e26029c8123102a540a3102a4012094a8141274048980a95", - "0x14e009110152a05100151009100152a050f015020904a540a09038244e05", - "0x25fe0504a0c122c02a540a28029bc121202a540a1a028c4122802a540a22", - "0x2540a27028c4121f02a540a13029a0121302a540a09350241295028240e09", - "0x252a050481c123202c0120054a81c58053302458054a8143e05378242405", - "0x2540a0903825060580a3110074a81d203103988129002a540a903901d5a09", - "0x252a050481c124002c08783b03a540e12029c8128802a540a8802a401209", - "0xc4123e02a540a8102a20128102a540a814581d5a09408152a051e0150209", - "0x14000904a540a0903824880581a0882074a81c76053902476054a8147605", - "0x26080504a0c127b02a540a7f02a7c127d02a540a41028c4127f02a540a82", - "0x2540a44028c4127902a540a7a02a80127a02a540a09350241295028240e09", - "0x252a050481c127702c14f0054a81cf6054e024f6054a814f2054f824fa05", - "0x2540a7d029f4127502a540a0913024a8054a814f005408241295028254209", - "0x2460054a81460051402510054a815100548024e8054a814a805440249c05", - "0x220e4a4049d00a95029d00a30049d40a95029d40aa3049380a95029380aa2", - "0x252a050481c126602c18d0054a81cd40552824d46f380212a053a1d49c30", - "0x241295028240e094f8160e0002a540e6702a9c12673101d2a05340154c09", - "0x1812094a814120704a880b0850a700e9503a800a7204a800a95029880a08", - "0x241295028f80a8b048252a0500014fe0904a540aa10289412094a8153805", - "0x152a05520146009520152a050486812a302a540a0913024129502a300a67", - "0x254e054a8154aa60388012a602a540a09138254a054a81548a30387812a4", - "0x1c0a12049bc0a95029bc0a28049c00a95029c00a9004aa00a9502a9c0a22", - "0x140c0904a540a09038255007379c12005540152a05540145809038152a05", - "0x2540ea9379c0103204aa40a9502aa40a1f04aa40a9502824260904a540aa2", - "0x1c0eab03ab812aa02a540aaa02a4012094a814120704ab13a0784aad5407", - "0x156009578152a05578155e0904a540a090382564b15802214af572b41095", - "0x15660904a540ab402ac812b85bad96ab4392540ab302ac412b302a540aaf", - "0x253c054a8156c055a024129502ae00a8b048252a055b814ce0904a540ab5", - "0x2780a8c04ab80a9502ab80a1204ab40a9502ab40a2804a780a9502a780a30", - "0x2540aba029fc12bb5d01d2a0500014880904a540a09038257205858252a07", - "0x3017e088626d7cbd042540ebc1f2315cad392d412bc02a540abb029f41209", - "0x2a80a9004b0c0a9502b080a7a04b080a9502a6c0a7b048252a050481c12c1", - "0x152a056181458095f0152a055f01424095e8152a055e8145009550152a05", - "0x3640a95028244c0904a540ac1029fc12094a814120704b0d7cbd552400ac3", - "0x244e096d8152a056d3640e1e04b680a9502b680a3004b680a95028256c09", - "0x2540aaa02a4012de02a540add0288812dd02a540adb6e01c40096e0152a05", - "0x15bc054a815bc051602580054a8158005090257e054a8157e05140255405", - "0x19c12094a8147c0545824129502ae40a3b048252a050481c12de602fd5490", - "0x25be054a81412b70495c0a95028244c0904a540a00029fc12094a8151805", - "0x3800e2004b800a95028244e094d0152a056f95c0e1e04b7c0a9502b7c0a30", - "0x2540aad028a012aa02a540aaa02a4012e302a540ae10288812e102a540a9a", - "0x240e0971ab95aaa48015c6054a815c605160255c054a8155c05090255a05", - "0x244e0904a540a8c0299c12094a8147c05458241295028000a7f048252a05", - "0x2540aaa02a4012e602a540ae50288812e502a540ab27201c4009720152a05", - "0x15cc054a815cc051602562054a81562050902560054a8156005140255405", - "0x19c12094a8147c05458241295028000a7f048252a050481c12e658ac15490", - "0x3a00a9502ba00a3004ba00a9502824f209738152a050489812094a8151805", - "0x8812eb02a540ae97501c4009750152a050489c12e902a540ae87381c3c09", - "0x140e050902558054a8155805140253a054a8153a0548025d8054a815d605", - "0x27c0aab048252a050481c12ec03ab13a9002bb00a9502bb00a2c0481c0a95", - "0x15200904a540a8c0299c12094a8147c05458241295029880a4e048252a05", - "0x19c12094a8141207048261a0504a0c12ee02a540a6f028a012ed02a540a70", - "0x152a053801520094c8152a0533014440904a540a3e02a2c12094a8151805", - "0x2400a9902a540a99028b0120702a540a0702848126f02a540a6f028a01270", - "0x2300a67048252a053b815560904a540a09508241295028240e094c81cde70", - "0xa012ed02a540a8802a4012094a814fa05030241295028f80a8b048252a05", - "0x152a05788146009788152a05049dc12ef02a540a0913025dc054a8146005", - "0x25e8054a815e4f30388012f302a540a0913825e4054a815e2ef0387812f1", - "0x1c0a1204bb80a9502bb80a2804bb40a9502bb40a9004bd40a9502bd00a22", - "0x25420904a540a0903825ea07773b520057a8152a057a8145809038152a05", - "0x244c0904a540a8b02ae012094a8151805338241295029000a06048252a05", - "0x152a057bbd80e1e04bdc0a9502bdc0a3004bdc0a9502824a8097b0152a05", - "0x24012fb02a540afa0288812fa02a540af87c81c40097c8152a050489c12f8", - "0x15f605160240e054a8140e050902460054a81460051402510054a8151005", - "0x14240503024129502a2c0ab8048252a050481c12fb038c1109002bec0a95", - "0x146405558241295028240e0904c380a0941825f8054a8150605480241295", - "0xc40a90048252a0539015700904a540a120281812094a81516055c0241295", - "0x146009878152a05049d4129802a540a091302412950282542097e0152a05", - "0x16211103880131102a540a091382620054a8161e9803878130f02a540b0f", - "0xc00a95028c00a2804bf00a9502bf00a9004c4c0a9502c480a2204c480a95", - "0x2540a09038262607183f12005898152a05898145809038152a05038142409", - "0x2540a09130241295029c80ab8048252a0545815700904a540a08029381209", - "0x262c054a8162b1403878131502a540b15028c0131502a540a093c8262805", - "0x180a9004c640a9502c600a2204c600a9502c5a2e07100262e054a8141227", - "0x152a058c8145809038152a05038142409128152a05128145009030152a05", - "0x22d02078d1c920074a81c0a090381412094a814120904c640e25032400b19", - "0x1c62053902520054a81520054802462054a8141005040241295028240e09", - "0x2540a2602a2c122602a540a0602a0412094a8141207048940b1b030c00e95", - "0x252a050481c122702c703c1a03a540e30029c8123002a540a30028c41209", - "0x14e409100152a051001460090d0152a050d0146209100152a050f0150209", - "0x145005128241295028880a06048252a050481c121202c74502203a540e1a", - "0x4c0a300484c0a95028243409160152a050489812094a8144005458241295", - "0x2540a1f1901c4009190152a050489c121f02a540a131601c3c09098152a05", - "0x24e4054a814e4051402520054a81520054802518054a8151005110251005", - "0x252a050481c128c039c9209002a300a9502a300a2c0481c0a950281c0a12", - "0x1c920081902506054a81506050f82506054a8141213048252a05090140c09", - "0x1040ab9049040a95028253c0904a540a09038247c4003c78783b03a540e83", - "0x1fc0a95029fc0abb049fc0a95028257409220152a05100151009410152a05", - "0x1d2a0722208fe071e1c97a091d8152a051d8152009410152a05410157809", - "0x1d2a053b81488093b8152a050489812094a8141207049e0f27a0447cf67d", - "0x1e8127402a540a4e029ec124e02a540a75029f412094a814a8053f824ea54", - "0x14f60509024fa054a814fa051402476054a814760548024e0054a814e805", - "0x141227048252a050481c12703d9f47690029c00a95029c00a2c049ec0a95", - "0x152a051d8152009340152a05350144409350152a053c1bc0e20049bc0a95", - "0x2400a6802a540a68028b0127902a540a7902848127a02a540a7a028a0123b", - "0x24f209330152a050489812094a8144005458241295028240e09341e4f43b", - "0x152a050489c126702a540a623301c3c09310152a05310146009310152a05", - "0x2480054a81480054802540054a8153e05110253e054a814ce00038801200", - "0xf8809002a800a9502a800a2c0481c0a950281c0a12048f80a95028f80a28", - "0x2540a092a02538054a8141226048252a05138140c0904a540a09038254007", - "0x2546054a814122704a880a9502a8538070f02542054a8154205180254205", - "0x145009480152a05480152009528152a05520144409520152a055128c0e20", - "0x2940e72482400aa502a540aa5028b0120702a540a0702848127202a540a72", - "0x29c0a9502824ea09530152a050489812094a8144a05030241295028240e09", - "0x1c4009548152a050489c12a802a540aa75301c3c09538152a05538146009", - "0x14e4051402520054a81520054802556054a81554051102554054a81550a9", - "0x1c12ab039c9209002aac0a9502aac0a2c0481c0a950281c0a12049c80a95", - "0xc012ac02a540a093c8253a054a8141226048252a05040149c0904a540a09", - "0x2b55c07100255c054a814122704ab40a9502ab13a070f02558054a8155805", - "0x152a05458145009408152a05408152009580152a05578144409578152a05", - "0x1412a104ac00e8b40a400ab002a540ab0028b0120702a540a0702848128b", - "0x140e055f0241295028240e09409c80f20480200e95038141207028241295", - "0x2540a09038246205908252a07458151809040152a050401520094581c0e95", - "0x180abf048180a95028c00a9b048c00a9502824d40904a540a0702a2c1209", - "0x152a05128158009480152a05480145009040152a05040152009128152a05", - "0x244c054a81412c1048252a0518814760904a540a09038244a90040200a25", - "0x146009480152a05480145009040152a050401520090d0152a051301c0ec2", - "0x2540a090382440270f0200a2013878109502869200804100121a02a540a1a", - "0x1450051802450054a8141279048880a95028244c0904a540a0702a2c1209", - "0x152a05090b00e20048b00a95028244e09090152a05140880e1e048a00a95", - "0x300128102a540a81028a0127202a540a7202a40121f02a540a1302b0c1213", - "0x204e4074a81c0a090381412094a81412a10487d0272040143e054a8143e05", - "0x1c80a95029c80a90048c120074a81520055f0241295028240e0918a2c0f22", - "0x200ad9048252a0548015160904a540a09038240c05918252a07180151809", - "0x2540a7202a40121a02a540a2602b6c122602a540a250381db409128152a05", - "0x1412070486902720401434054a81434056e02502054a815020514024e405", - "0x780a72048252a05049d0121e02a540a070282012094a8140c051d8241295", - "0x1450054402450054a8144005408241295028240e091101648201381d2a07", - "0x7c0a95028b00a6f0484c0a950289c0a31048b00a95028480a70048480a95", - "0x2200a95028c80a68048c80a9502824d40904a540a09038241325028250609", - "0x14cc09460152a0509814fa090f8152a0544014de09098152a05110146209", - "0x2540a830401c3c0904a540a09508241295028240e091d8164c8302a540e1f", - "0x24e4054a814e405480247c054a814809003b08124002a540a09608247805", - "0xf80a30048f00a95028f00aa304a300a9502a300aa204a040a9502a040a28", - "0x141207049110441040148882208212a051f0f11881391c948091f0152a05", - "0x1476056e8241295028200a7f048252a0548015160904a540a09508241295", - "0x152a053901520093d8152a053e815b6093e8152a053fa300eda049fc0a95", - "0x2540a0903824f681390200a7b02a540a7b02b70128102a540a81028a01272", - "0x2540a091302412950281c0a4e048252a0504014fe0904a540a9002a2c1209", - "0x24f0054a814f27a03878127902a540a79028c0127902a540a093c824f405", - "0x22c0a90049d40a95029500ade049500a95029e0ee0710024ee054a8141227", - "0x241167518a2c10053a8152a053a815b809188152a05188145009458152a05", - "0x1c0a09331a0ce094809cd06704a4012080381412663419c1290139a0ce09", - "0x198d06704a404e683382521280401c0a09331a0ce094809cd06704a424e08", - "0x19c12080319c1208950200e0504998d06704a404e683382521290401c0a09", - "0x12c480200e0504a08ce0904018342733824e52b038141274" + "0x14be5e02814ba0902814ba2702814b8092d824b4092c824b05701158aa07", + "0x1888805029843c05029840c05029743c05029740c05029840c05029800c05", + "0x14ba05039a00a07339040a05330f80a05330180a05329900a05318180a05", + "0x18ce00502984126f049b80c05029b4126c358140a5d049a8d00502974d205", + "0x680a05308680a053b9d80a05319380a05309d40a053a1cc1005391c40a05", + "0x18cf4050298cf2050298cf0050298c1207340140e672a0140a66138140a66", + "0xec0a05331f80a052e8240e7e0281cce093e89c0a05309f00a05319ec0a05", + "0x140a5d0481d02050399c4a05029841280049fcfc05029d00a073f0140e67", + "0x20c0a053a2081005390680a052e89c0a052ea040a053a0140e810281cce81", + "0x140a851d8140a61420140a631f0140a61208140a5c1e0140a74200140a5c", + "0x14c23002814c23202814b83202814c08902814ba09440180a05438250c06", + "0x140a6304a411e0702a391a050298504050298d18050298c128b04a286205", + "0x14ba09039d40a07339380a05330180a0549825249102814ba0802814ba07", + "0x140e67200140a660481c78050399c0a073a8140e6704a500a050298cea05", + "0x2412960282412094a8140e830281cce05038f00a0733a0c0a052e8240e83", + "0xc40a96029cc0a08048252c050481c128c4101d2e734881d2c07028240e05", + "0x151809188152c05188150409488152c0548814e609180152c05040152209", + "0x940a31048680a96028c40a08048252c050481c122602a604a0603a580e30", + "0x680a96028680a82048180a96028180a06048252c050f01460090f0152c05", + "0x2450054b0143405040241296028240e091101532201381d2c07030151809", + "0x145005410244e054b0144e05030241296028480a30048480a96028800a31", + "0x2580a280282012094b01412070487c0a9a098b00e960389c0a8c048a00a96", + "0x2464054b01464054102458054b01458050302512054b0142605188246405", + "0x2012094b0141207048ec0a9b422340e96038b00a8c04a240a9602a240a25", + "0x2580a8d0281812094b01480051802480054b01508051882478054b0146405", + "0x2580a090382506054e1047c074b01d1a054602478054b0147805410251a05", + "0x14780504024129602a240a30048252c0520814340904a580a3e028981209", + "0x80127e02a580a7e02894127e02a580a091382502054b014121e049100a96", + "0x1e80a12049e80a96029f0f60714024f6054b0141222049f00a96029f90207", + "0x152c05038145809220152c05220150409488152c0548814e6093c8152c05", + "0x2580a830289812094b0141207049e40e4448a440a7902a580a790284c1207", + "0x1464093c0152c053c01504092a0152c050487c127802a580a3c028201209", + "0x241296028240e09389d40e9d271d80e9603950f09104224125402a580a54", + "0x1c00a82049d80a96029d80a73049ac0a9602a240a8d049c00a96029380a08", + "0x152c0538014100904a580a0903824d2054f0252c07358150809380152c05", + "0x141207048253e05048ec125e02a580a6802a08126402a580a76029cc1268", + "0x14e6094e0152c0504900120002a580a700282012094b014d2051e0241296", + "0x2700076040f8129c02a580a9c02894120002a580a0002a08127602a580a76", + "0x28c0a83048252c050481c12a502a9146054b01d44052082544a1500212c05", + "0x1780a9602a980a82049900a9602a800a7304a980a9602a840a08048252c05", + "0x2a14e071002550054b01550051282550054b014124404a9c0a96028243c09", + "0x152c0555814f80904a580aaa029f812ab5501d2c05548150209548152c05", + "0x208126402a580a64029cc12ae02a580aad029e812ad02a580aac029ec12ac", + "0x1cbc64488155c054b0155c05098240e054b0140e0516024bc054b014bc05", + "0x2800a7304ac00a9602a940a1204abc0a9602a840a08048252c050481c12ae", + "0x152c05580142609038152c05038145809578152c05578150409500152c05", + "0x152c0538814100904a580a89028c012094b014120704ac00eaf502440ab0", + "0x2780e2004ac80a9602ac80a2504ac80a9602824f2094f0152c050487812b1", + "0x2580ab50284812b502a580ab35a01c50095a0152c050488812b302a580ab2", + "0x240e054b0140e051602562054b015620541024ea054b014ea05398256c05", + "0x241296028ec0a26048252c050481c12b603ac4ea9102ad80a9602ad80a13", + "0x152c05049e012b802a580a090f0256e054b014640504024129602a240a30", + "0xa012bb02a580a091102574054b01572b80388012b902a580ab90289412b9", + "0x2dc0a8204a440a9602a440a7304af40a9602af00a1204af00a9602ae97607", + "0x257a075ba4522055e8152c055e8142609038152c050381458095b8152c05", + "0x27c0a96028243c095f0152c0514014100904a580a1f0289812094b0141207", + "0x244409600152c055fa7c0e2004afc0a9602afc0a2504afc0a9602824a809", + "0x2580a91029cc12c302a580ac20284812c202a580ac06081c5009608152c05", + "0x1586054b0158605098240e054b0140e05160257c054b0157c05410252205", + "0x2588054b0143405040241296028880a26048252c050481c12c303af92291", + "0x158cc50388012c602a580ac60289412c602a580a093b0258a054b014121e", + "0x3280a9602b240a1204b240a9602b1d90071402590054b014122204b1c0a96", + "0x142609038152c05038145809620152c05620150409488152c0548814e609", + "0x14100904a580a260289812094b014120704b280ec448a440aca02a580aca", + "0x3300a9602b300a2504b300a96028249c09520152c050487812cb02a580a31", + "0x4812ce02a580a576681c5009668152c0504888125702a580acc5201c4009", + "0x140e051602596054b01596054102522054b0152205398259e054b0159c05", + "0x200a75048252c050481c12cf03b2d229102b3c0a9602b3c0a130481c0a96", + "0x94129d02a580a093c825a2054b014121e04b400a9602a300a08048252c05", + "0x349a60714025a6054b014122204b480a9602a75a207100253a054b0153a05", + "0x152c05680150409410152c0541014e6096a8152c056a01424096a0152c05", + "0x14120904b540ed0412440ad502a580ad50284c120702a580a07028b012d0", + "0x14e605040241296028240e09462080ed639a440e96038141207028241296", + "0xc40a96028c40a8204a440a9602a440a73048c00a96028200a91048c40a96", + "0x2434054b0146205040241296028240e0913015ae250301d2c07180151809", + "0x143405410240c054b0140c05030241296028780a30048780a96028940a31", + "0x2580a270289812094b0141207048880ad81009c0e96038180a8c048680a96", + "0x141227048480a96028243c09140152c050d014100904a580a20028681209", + "0x7c0a96028244409098152c05160480e20048b00a96028b00a25048b00a96", + "0x208129102a580a91029cc128902a580a3202848123202a580a130f81c5009", + "0x1c50914881512054b0151205098240e054b0140e051602450054b0145005", + "0x2580a090f8251a054b0143405040241296028880a26048252c050481c1289", + "0x1d2c074223522084482508054b0150805190251a054b0151a05410250805", + "0x20c0a96028248009208152c051e014100904a580a09038247c4003b64783b", + "0x207c09418152c05418144a09208152c052081504091d8152c051d814e609", + "0x241296028240e093d815b47c02a580e7e02904127e40910109602a0c823b", + "0x152c0504910127902a580a090f024f4054b0150205040241296029f00a83", + "0x138ec074b014a80540824a8054b014f07903880127802a580a78028941278", + "0x1c40a7a049c40a96029d40a7b049d40a96029380a7c048252c053b014fc09", + "0x152c050381458093d0152c053d0150409220152c0522014e609380152c05", + "0x2580a810282012094b0141207049c00e7a222440a7002a580a700284c1207", + "0x24d6054b014d6054102488054b014880539824d2054b014f60509024d605", + "0x252c050481c1269039ac8891029a40a96029a40a130481c0a960281c0a2c", + "0x14bc0512824bc054b0141279049900a96028243c09340152c051f0141009", + "0x152c05002700e2804a700a96028244409000152c052f1900e20049780a96", + "0xb0126802a580a6802a08124002a580a40029cc12a102a580aa00284812a0", + "0x241296028240e095081cd0404881542054b0154205098240e054b0140e05", + "0x152c050493812a302a580a090f02544054b0146205040241296028980a26", + "0xa012a702a580a09110254c054b0154aa30388012a502a580aa50289412a5", + "0x2880a8204a440a9602a440a7304aa40a9602aa00a1204aa00a9602a994e07", + "0x255207512452205548152c05548142609038152c05038145809510152c05", + "0x2ac0a96028243c09550152c0546014100904a580a08029d412094b0141207", + "0x244409568152c05562ac0e2004ab00a9602ab00a2504ab00a9602824f209", + "0x2580a82029cc12b002a580aaf0284812af02a580aad5701c5009570152c05", + "0x1560054b0156005098240e054b0140e051602554054b0155405410250405", + "0x1c128c4101db6734881d2c07028240e05048252c050482412b003aa90491", + "0x24129602824e209180152c05040152209188152c0539814100904a580a09", + "0x980adc128180e96038c00a8c048c40a96028c40a8204a440a9602a440a73", + "0x143c05468243c054b0144a051882434054b0146205040241296028240e09", + "0xa00a96028180a06048880a96028680a82048800a960289c0a700489c0a96", + "0x152c0518814100904a580a090382412dd028247609090152c0510014d609", + "0x140c09110152c051601504090f8152c0509814d009098152c05049a4122c", + "0x240e0944815bc3202a580e1202990121202a580a1f029ac122802a580a26", + "0x128d02a580a8d02a08128d02a580a220282012094b014125e048252c05", + "0x14100904a580a3b02a7012094b0141207048f00adf1da100e96038c92207", + "0x2580e2802a30124002a580a4002a08128402a580a84029cc124002a580a8d", + "0x152c05208146209220152c0520014100904a580a09038250605701047c07", + "0x148805410247c054b0147c0503024129602824e20904a580a81028c01281", + "0x2580a440282012094b0141207049ec0ae13e1f80e96038f80a8c049100a96", + "0x24a8054b014fc0503024f0054b014f40541024f2054b014f80550024f405", + "0x1380a96029100a08048252c050481c120971014123b049d80a96029e40aa1", + "0x1ec0a06049e00a96029380a82049c40a96029d40aa2049d40a9602824d209", + "0x141207049ac0ae3380152c073b01546093b0152c053881542092a0152c05", + "0x243c09340152c05380146209348152c053c014100904a580a092f0241296", + "0x152c0542014e609000152c05340151a092f0152c052a014f809320152c05", + "0x94126402a580a6402a98125e02a580a5e02a94126902a580a6902a081284", + "0x152c0750815500950a8138084b01400642f1a508735382400054b0140005", + "0x29d4c074b0154405548254a054b0154005040241296028240e0951815c8a2", + "0x2012094b014120704aa40ae5540152c07538155409528152c05528150409", + "0x1d56054602554054b01554054102556054b0154c054882554054b0154a05", + "0x252c0556814340904a580aac0289812094b014120704ab80ae656ab00e96", + "0x2580a091382560054b014121e04abc0a9602aa80a08048252c0554014fc09", + "0x2564054b014122204a780a9602ac560071002562054b0156205128256205", + "0x1504094e0152c054e014e6095a0152c05598142409598152c054f2c80e28", + "0x2d00eaf4e2440ab402a580ab40284c120702a580a07028b012af02a580aaf", + "0x152c050487c12b502a580aaa0282012094b0155c05130241296028240e09", + "0x2dc0e9603ad96a9c0422412b602a580ab6028c812b502a580ab502a0812b6", + "0x2f00e9602aa00a8104aec0a9602ae00a08048252c050481c12ba5c81dceb8", + "0x1518095d8152c055d81504095b8152c055b814e60904a580abc029f812bd", + "0x15760504024129602af80a26048252c050481c12bf02ba13ebe03a580ebd", + "0x2dc0a9602adc0a7304b080a9602b040a8d04b040a9602a7c0a3104b000a96", + "0x31186084b01584c05b8207c09610152c05610144a09600152c05600150409", + "0x2012094b0158c05418241296028240e0963815d2c602a580ec50290412c5", + "0x152c05650144a09650152c050491012c902a580a090f02590054b0158805", + "0x24129602a900a7e04b3148074b01596054082596054b01594c90388012ca", + "0x30c0a7304b380a9602b340a7a04b340a960295c0a7b0495c0a9602b300a7c", + "0x152c05670142609038152c05038145809640152c05640150409618152c05", + "0x2580ac702aac12cf02a580ac40282012094b014120704b380ec861a440ace", + "0x25a4054b0159e05410253a054b015860539824129602b400aac04b45a007", + "0x24129602afc0a26048252c050481c120975014123b04b4c0a9602b440aa6", + "0x2580aeb0289412eb02a580a0956825aa054b014121e04b500a9602aec0a08", + "0x3480a9602b500a8204a740a9602adc0a7304bb00a9602badaa0710025d605", + "0x142409770152c0569bb40e2804bb40a96028244409698152c05760154c09", + "0x2580a07028b012d202a580ad202a08129d02a580a9d029cc12ef02a580aee", + "0x1550053f0241296028240e097781da49d48815de054b015de05098240e05", + "0x144a09790152c05049e412f102a580a090f025e0054b0157405040241296", + "0x15e6f4038a012f402a580a0911025e6054b015e4f10388012f202a580af2", + "0x3c00a9602bc00a8204ae40a9602ae40a7304bd40a9602a6c0a1204a6c0a96", + "0x2580a0903825ea07782e522057a8152c057a8142609038152c05038145809", + "0x2700a7304bd80a9602a940a08048252c0553014ea0904a580aa902ab81209", + "0x14100904a580a090382412f90282476097c0152c057b01504097b8152c05", + "0x2580afa02a08129c02a580a9c029cc12fb02a580aa30284812fa02a580aa0", + "0x240e097d81df49c48815f6054b015f605098240e054b0140e0516025f405", + "0x1e00a08048252c052a0144c0904a580a6b02ab812094b014125e048252c05", + "0x3f40a96028243c097c0152c057e01504097b8152c0542014e6097e0152c05", + "0x2444097f8152c057f3f40e2004bf80a9602bf80a2504bf80a9602824a809", + "0x2580af7029cc130202a580b0102848130102a580aff8001c5009800152c05", + "0x1604054b0160405098240e054b0140e0516025f0054b015f00541025ee05", + "0x2606054b014800504024129602a0c0a26048252c050481c130203be1ee91", + "0x15350403880129a02a580a9a02894129a02a580a093b02608054b014121e", + "0x4200a9602c1c0a1204c1c0a9602c160c07140260c054b014122204c140a96", + "0x142609038152c05038145809818152c05818150409420152c0542014e609", + "0x14100904a580a280289812094b014120704c200f03422440b0802a580b08", + "0x261805048ec130b02a580b0902a08130a02a580a3c029cc130902a580a8d", + "0x241296028a00a26048252c05448155c0904a580a092f0241296028240e09", + "0x14121e04c2c0a9602c340a8204c280a9602a440a7304c340a96028880a08", + "0x4400a9602c3e1c07100261e054b0161e05128261e054b014124e04c380a96", + "0x14e609898152c05890142409890152c05884440e2804c440a96028244409", + "0x2580b130284c120702a580a07028b0130b02a580b0b02a08130a02a580b0a", + "0x2580a8c0282012094b01410053a8241296028240e098981e170a488162605", + "0x1c40098a8152c058a8144a098a8152c05049e4131402a580a090f0253205", + "0x1630050902630054b0162d17038a0131702a580a09110262c054b0162b14", + "0x1c0a960281c0a2c04a640a9602a640a8204a080a9602a080a7304c640a96", + "0x152c0504abc127302a580a095782632074ca0922058c8152c058c8142609", + "0x940c078d0c062074b01c0a090381412094b0141209048252c0504ac0128c", + "0x2580a093882434054b0141005488244c054b0146005040241296028240e09", + "0x46c4e1e03a580e1a02a30122602a580a2602a08123102a580a31029cc1209", + "0x151a09140152c05138146209110152c0513014100904a580a09038244005", + "0x2580a1e02818121302a580a2202a08122c02a580a12029c0121202a580a28", + "0x144c05040241296028240e0904c700a091d82464054b0145805358243e05", + "0x2426054b01512054102508054b0151a05340251a054b014126904a240a96", + "0x2476058ea080a96038c80a64048c80a9602a100a6b0487c0a96028800a06", + "0x152c05412300eb1048f00a960284c0a08048252c050497812094b0141207", + "0x2580a090382482058f0f880074b01d043103800123c02a580a3c02a081282", + "0x230128302a580a8302a08124002a580a40029cc128302a580a3c028201209", + "0x1462093e0152c0541814100904a580a0903824fc058fa0488074b01c3e05", + "0x2580a0938824f6054b01522054682522054b015227303ac4129102a580a81", + "0x480f27a03a580e4402a30127c02a580a7c02a08124402a580a44028181209", + "0x1504093b0152c053c81540092a0152c053e014100904a580a0903824f005", + "0x264205048ec127102a580a7602a84127502a580a7a02818124e02a580a54", + "0x2580a6b02a88126b02a580a0934824e0054b014f805040241296028240e09", + "0x24e2054b014d20550824ea054b014f005030249c054b014e00541024d205", + "0x149c0504024129602824bc0904a580a0903824c805911a00a96039c40aa3", + "0x2540054b014ea053e02538054b014121e048000a96029a00a31049780a96", + "0x2800aa5049780a96029780a82049000a96029000a7304a840a96028000a8d", + "0x271405e201cd4e09508152c05508144a094e0152c054e0154c09500152c05", + "0x14100904a580a09038254e0591a980a9603a940aa804a9546a2042580aa1", + "0x1d54055502550054b01550054102554a903a580aa602aa412a802a580aa3", + "0x152c05548152209568152c0554014100904a580a09038255805922ac0a96", + "0x252c050481c12b102c9560af03a580eae02a3012ad02a580aad02a0812ae", + "0x2580a7b028c012094b01556053f024129602ac00a1a048252c05578144c09", + "0x14122704ac80a96028243c094f0152c0556814100904a580a3e02a701209", + "0x2d40a960282444095a0152c0559ac80e2004acc0a9602acc0a2504acc0a96", + "0x20812a202a580aa2029cc12b702a580ab60284812b602a580ab45a81c5009", + "0x1d3ca2488156e054b0156e05098240e054b0140e05160253c054b0153c05", + "0x2580a090f82570054b0155a0504024129602ac40a26048252c050481c12b7", + "0x1d2c075cae144084482572054b01572051902570054b0157005410257205", + "0x152c055f01504095f0152c055d814100904a580a09038257abc03c9976ba", + "0x1c12c3613041127602fd3e084b01c0ebe03a7812ba02a580aba029cc12be", + "0x152c05600156409620152c054f81410094f8152c054f815040904a580a09", + "0x2580ac602ad412ca64b218ec639a580ac502ad012c502a580ac002acc12c0", + "0x1590055b824129602b280a30048252c0564815380904a580ac702ad81209", + "0x3100a9602b100a8204afc0a9602afc0a2c04b2c0a9602b2c0a2504b2c0a96", + "0x150209660152c0562014100904a580a09038254805940252c07658150809", + "0x2580acc02a0812ce02a580acd029f012094b014ae053f0259a5703a580aab", + "0x252c050481c12d369274112968b419e084b01d9c7b1f2fd98735c0259805", + "0x14f4096a8152c0568814f6096a0152c05678141009678152c05678150409", + "0x2580ad0028b012d402a580ad402a0812ba02a580aba029cc12eb02a580ad5", + "0x15a6053f0241296028240e0975b41a8ba48815d6054b015d60509825a005", + "0x2e412ed02a580a090f025d8054b0153a05040253a054b0153a05410241296", + "0x2580a0911025de054b015dced0388012ee02a580aee0289412ee02a580a09", + "0x2e80a9602ae80a7304bc80a9602bc40a1204bc40a9602bbde00714025e005", + "0x2e92205790152c05790142609690152c05690145809760152c05760150409", + "0x1ec0a30048252c0555814fc0904a580aa4028f012094b014120704bc9a4ec", + "0x2e812f402a580a090f025e6054b0158805040241296028f80a9c048252c05", + "0x2580a0911025ea054b01536f403880129b02a580a9b02894129b02a580a09", + "0x2e80a9602ae80a7304be00a9602bdc0a1204bdc0a9602bd5ec0714025ec05", + "0x2e922057c0152c057c01426095f8152c055f8145809798152c05798150409", + "0xf80a9c048252c053d814600904a580aab029f812094b014120704be17ef3", + "0x25f6054b014122204be80a9602b040a0804b040a9602b040a82048252c05", + "0x1504095d0152c055d014e6097e8152c057e01424097e0152c0561bec0e28", + "0x3f584fa5d2440afd02a580afd0284c12c202a580ac2028b012fa02a580afa", + "0x252c051f015380904a580a7b028c012094b01556053f0241296028240e09", + "0x1600051282600054b014127904bfc0a96028243c097f0152c055e8141009", + "0x152c0580c080e2804c080a96028244409808152c05803fc0e2004c000a96", + "0xb012fe02a580afe02a0812bc02a580abc029cc130402a580b03028481303", + "0x241296028240e098201dfcbc4881608054b0160805098240e054b0140e05", + "0x252c051f015380904a580a7b028c012094b01552053a824129602ab00aae", + "0x247609830152c054d0150409828152c0551014e6094d0152c05540141009", + "0x28c0a08048252c053d814600904a580a3e02a7012094b0141207048265405", + "0x152c05838150409510152c0551014e609840152c05538142409838152c05", + "0x14120704c200f07512440b0802a580b080284c120702a580a07028b01307", + "0x147c054e0241296029ec0a30048252c05320155c0904a580a092f0241296", + "0x208130502a580a40029cc130902a580a4e0282012094b014ea05130241296", + "0x152c05858144a09858152c0504950130a02a580a090f0260c054b0161205", + "0x261e054b0161b0e038a0130e02a580a09110261a054b016170a03880130b", + "0x1c0a2c04c180a9602c180a8204c140a9602c140a7304c400a9602c3c0a12", + "0x144c0904a580a09038262007834152205880152c05880142609038152c05", + "0x2622054b0150605040241296029cc0abb048252c051f015380904a580a7e", + "0x16271203880131302a580b1302894131302a580a093b02624054b014121e", + "0x4580a9602c540a1204c540a9602a6628071402628054b014122204a640a96", + "0x142609038152c05038145809888152c05888150409200152c0520014e609", + "0x15760904a580a1f0289812094b014120704c580f11202440b1602a580b16", + "0x152c058b81504098c0152c0520814e6098b8152c051e014100904a580a73", + "0x241296028ec0aae048252c050497812094b0141207048265605048ec1319", + "0x152c0509814100904a580a8c02aec12094b014e6055d82412960287c0a26", + "0x249c09968152c0504878131902a580b2c02a08131802a580a31029cc132c", + "0x152c0504888132f02a580b2e9681c4009970152c05970144a09970152c05", + "0x2630054b01630053982664054b01662050902662054b0165f30038a01330", + "0x466309102cc80a9602cc80a130481c0a960281c0a2c04c640a9602c640a82", + "0x1410053a8241296029cc0abb048252c0546015760904a580a09038266407", + "0x144a099a0152c05049e4129802a580a090f02666054b0144a05040241296", + "0x166b36038a0133602a580a09110266a054b016689803880133402a580b34", + "0x4cc0a9602ccc0a82048180a96028180a7304ce00a9602cdc0a1204cdc0a96", + "0x2580a090482670079981922059c0152c059c0142609038152c05038145809", + "0x2580a730282012094b014120704a3104079c9cd22074b01c0a09038141209", + "0x2462054b01462054102522054b01522053982460054b0141005488246205", + "0xc4121a02a580a310282012094b0141207048980b3a128180e96038c00a8c", + "0x2580a1a02a08120602a580a060281812094b0143c05180243c054b0144a05", + "0x152c050d014100904a580a090382444059d8804e074b01c0c05460243405", + "0x94122802a580a2802a08122702a580a2702818121202a580a20028c41228", + "0x144c0904a580a09038243e059e04c58074b01c4e054602424054b0142405", + "0x2464054b0145005040241296028480a30048252c0509814340904a580a2c", + "0x151a8903880128d02a580a8d02894128d02a580a091382512054b014121e", + "0x1000a96028f00a12048f00a9602a1076071402476054b014122204a100a96", + "0x142609038152c05038145809190152c05190150409488152c0548814e609", + "0x14100904a580a1f0289812094b0141207049000e3248a440a4002a580a40", + "0x152c052081464091f0152c051f0150409208152c050487c123e02a580a28", + "0x148805040241296028240e093f2040f3d2220c0e96039047c91042241241", + "0x24f2054b014240546824f4054b014f6055e824f6054b01412bc049f00a96", + "0x14f4055f824f0054b014f0054f824f8054b014f80541024f0054b01412be", + "0x138113e3b1500e96039e4f478039f0e6c004a0c0a9602a0c0a73049e80a96", + "0x243c09380152c052a01410092a0152c052a015040904a580a0903824e275", + "0x152c0534014f80904a580a69029f812683481d2c05358150209358152c05", + "0x208128302a580a83029cc120002a580a5e029e8125e02a580a64029ec1264", + "0x1d8e0834881400054b014000509824ec054b014ec0516024e0054b014e005", + "0x14122204a700a96029380a08049380a96029380a82048252c050481c1200", + "0x152c0541814e609510152c05508142409508152c0538a800e2804a800a96", + "0x2440aa202a580aa20284c127502a580a75028b0129c02a580a9c02a081283", + "0x7812a302a580a7e0282012094b0142405180241296028240e09511d53883", + "0x2580aa65281c4009530152c05530144a09530152c05049e412a502a580a09", + "0x2554054b01552050902552054b0154ea8038a012a802a580a09110254e05", + "0x2a80a130481c0a960281c0a2c04a8c0a9602a8c0a8204a040a9602a040a73", + "0x680a08048252c05110144c0904a580a0903825540751a052205550152c05", + "0x255a054b0155a05128255a054b014127604ab00a96028243c09558152c05", + "0x142409580152c05572bc0e2804abc0a96028244409570152c0556ab00e20", + "0x2580a07028b012ab02a580aab02a08129102a580a91029cc12b102a580ab0", + "0x144c05130241296028240e095881d56914881562054b0156205098240e05", + "0x144a09598152c050493812b202a580a090f0253c054b0146205040241296", + "0x1568b5038a012b502a580a091102568054b01566b20388012b302a580ab3", + "0x2780a9602a780a8204a440a9602a440a7304adc0a9602ad80a1204ad80a96", + "0x2580a09038256e074f24522055b8152c055b8142609038152c05038145809", + "0x14127904ae40a96028243c095c0152c0546014100904a580a08029d41209", + "0x2f00a960282444095d8152c055d2e40e2004ae80a9602ae80a2504ae80a96", + "0x208128202a580a82029cc12be02a580abd0284812bd02a580abb5e01c5009", + "0x1d7082488157c054b0157c05098240e054b0140e051602570054b0157005", + "0x252c050481c12823981e7e910401d2c07028240e05048252c050497812be", + "0x208120802a580a08029cc12310381d2c05038158209460152c05488141009", + "0x140e05180241296028240e091801680094b01c62054202518054b0151805", + "0x30c122602a580a2502b08122502a580a09348240c054b0151805040241296", + "0x143405620240c054b0140c054102410054b01410053982434054b0144c05", + "0x2580a8c0282012094b01460051e0241296028240e090d0181008028680a96", + "0x2410054b01410053982440054b0144e0703b18122702a580a09628243c05", + "0x485022042580a200f020103e048800a96028800a25048780a96028780a82", + "0x2458054b01504050402412960281c0a30048252c050481c1212140881005", + "0x143e1303880121f02a580a1f02894121f02a580a093c82426054b014121e", + "0x2100a9602a340ac704a340a96028c912071402512054b0141222048c80a96", + "0x1cc1005420152c05420158809160152c05160150409398152c0539814e609", + "0x2580a0903824628c03d05047303a580e050481c0a0904a580a092f025082c", + "0x24e6054b014e605398240c9103a580a9102b04123002a580a82028201209", + "0x2440a30048252c050481c122502d081296038180a84048c00a96028c00a82", + "0x152c050d01c0ec9048680a96028200ac8048980a96028c00a08048252c05", + "0x32c122602a580a2602a08127302a580a73029cc122702a580a1e02b28121e", + "0x14100904a580a25028f012094b01412070489c4c73040144e054b0144e05", + "0x800a96028800a82048252c05049c4122202a580a0702a44122002a580a30", + "0x2426054b0144005040241296028240e091601686121401d2c07110151809", + "0x4c0a8204a240a96028c80a70048c80a960287c0a8d0487c0a96028480a31", + "0x2413440282476091d8152c0544814d609420152c05140140c09468152c05", + "0x152c0520014d009200152c05049a4123c02a580a200282012094b0141207", + "0x1f0123b02a580a3e029ac128402a580a2c02818128d02a580a3c02a08123e", + "0x14125e048252c050481c124402d1506054b01c76053202482054b0150805", + "0x24f8054b01412c5049f80a9602a0c10071002502054b0151a05040241296", + "0x154a09408152c05408150409398152c0539814e6093d8152c053e2440ec6", + "0x105027339a9c127b02a580a7b02894127e02a580a7e02a98124102a580a41", + "0xc012094b014125e048252c050481c12783c9e810053c1e4f4084b014f67e", + "0x152c052201548092a0152c0546814100904a580a08029f812094b0152205", + "0x24e6054b014e60539824ea054b0149c05650249c054b014ec4103b241276", + "0x241296028240e093a950e608029d40a96029d40acb049500a96029500a82", + "0x152c0518814100904a580a07029d412094b01410053f024129602a440a30", + "0x1c00e20049ac0a96029ac0a25049ac0a9602824f209380152c05048781271", + "0x2580a6402b30126402a580a693401c5009340152c0504888126902a580a6b", + "0x14bc054b014bc0565824e2054b014e2054102518054b015180539824bc05", + "0x252227349781291048200e05049a0d25e04a444e692f025228c2f1c51808", + "0x1a4bc0948d1c100702824d0692f0252227349781291a30200e05049a0d25e", + "0x229208038141268349781291139a4bc0948d20100702824d0692f0252227", + "0x52d22080381412832f02410060d09cbc0939d280e05049d4bc0904018bc09" ], "sierra_program_debug_info": { "type_names": [], diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/empty_contract.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/empty_contract.sierra.json index 10a368dc8b9..e1d44c9e612 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/empty_contract.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/empty_contract.sierra.json @@ -1,11 +1,11 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", + "0xa", + "0x0", "0x1", "0xff", "0x0", diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/test_contract.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/test_contract.sierra.json index 716d53d25a4..1e9ee40044c 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/test_contract.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/test_contract.sierra.json @@ -1,23 +1,23 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", - "0x8b3", - "0x74d", - "0x1b9", + "0xa", + "0x0", + "0x913", + "0x6ed", + "0x1c2", "0x52616e6765436865636b", "0x800000000000000100000000000000000000000000000000", "0x436f6e7374", "0x800000000000000000000000000000000000000000000002", "0x1", - "0x56", + "0x54", "0x2", "0x6e5f627974657320746f6f20626967", - "0x43", + "0x41", "0x4", "0x5", "0x28", @@ -44,7 +44,7 @@ "0x1000000", "0x10000", "0x1c", - "0x154", + "0x156", "0x100", "0x537472756374", "0x800000000000000f00000000000000000000000000000001", @@ -74,8 +74,8 @@ "0x800000000000000200000000000000000000000000000001", "0x2b", "0x753235365f737562204f766572666c6f77", - "0x51", - "0x5f", + "0x4f", + "0x5d", "0x800000000000000000000000000000000000000000000003", "0x34", "0x31", @@ -87,166 +87,168 @@ "0xfd17b448a68554199c47d08ffb10d4b8", "0xe", "0xb", - "0xa", - "0x7", "0x6", - "0x42", - "0xae", + "0x40", + "0xaf", "0x10000000000000000", "0x4e6f6e5a65726f", "0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672", "0x4172726179", "0x800000000000000300000000000000000000000000000001", "0x800000000000000300000000000000000000000000000003", - "0x45", - "0x46", - "0x3e316790085ded77e618c7a06b4b2688f26416ea39c409a6ae51947c6668180", + "0x43", "0x44", - "0x47", - "0x4e", - "0x4b", - "0x4d", + "0x3e316790085ded77e618c7a06b4b2688f26416ea39c409a6ae51947c6668180", + "0x42", + "0x45", "0x4c", + "0x49", + "0x4b", + "0x4a", "0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e16", "0x6b17d1f2e12c4247f8bce6e563a440f2", "0x77037d812deb33a0f4a13945d898c296", "0x2bce33576b315ececbb6406837bf51f5", "0x800000000000000700000000000000000000000000000005", "0x2907a9767b8e0b68c23345eea8650b1366373b598791523a07fddaa450ba526", + "0x50", + "0x53", "0x52", - "0x55", - "0x54", "0x496e76616c6964207369676e6174757265", "0xffffffff00000000ffffffffffffffff", "0xbce6faada7179e84f3b9cac2fc632551", "0x66656c74323532", "0x3233063c5dc6197e9bf4ddc53b925e10907665cf58255b7899f8212442d4605", - "0x57", + "0x55", "0x1d8a68005db1b26d0d9f54faae1798d540e7df6326fae758cc2cf8f7ee88e72", - "0x58", + "0x56", "0x536563703235366b31506f696e74", "0x3179e7829d19e62b12c79010203ceee40c98166e97eb104c25ad1adb6b9675a", - "0x5a", - "0x5b", + "0x58", + "0x59", "0x3c7b5436891664778e6019991e6bd154eeab5d43a552b1f19485dec008095d3", - "0x5c", + "0x5a", "0x5369676e6174757265206f7574206f662072616e6765", - "0x61", - "0x60", + "0x5f", + "0x5e", "0xfffffffffffffffffffffffffffffffe", "0xbaaedce6af48a03bbfd25e8cd0364141", - "0x65", + "0x63", "0x14ef93a95bec47ff4e55863055b7a948870fa13be1cbddd481656bdaf5facc2", - "0x62", + "0x60", "0x753332", - "0x64", + "0x62", "0x7533325f6d756c204f766572666c6f77", "0x7533325f616464204f766572666c6f77", "0x20", - "0x87", - "0x77", + "0x85", + "0x75", "0x800000", - "0x73", + "0x71", "0x8000", - "0x70", + "0x6e", "0x80", - "0x6d", + "0x6b", "0x80000000", - "0x78", + "0x76", "0x8000000000000000", "0x753634", "0x4b656363616b206c61737420696e70757420776f7264203e3762", - "0x88", + "0x7", + "0x86", "0x313d53fcef2616901e3fd6801087e8d55f5cb59357e1fc8b603b82ae0af064c", - "0x89", - "0x8d", - "0x38b0179dda7eba3d95708820abf10d3d4f66e97d9a9013dc38d712dce2af15", + "0x87", "0x8b", + "0x38b0179dda7eba3d95708820abf10d3d4f66e97d9a9013dc38d712dce2af15", + "0x89", "0x800000000000000700000000000000000000000000000004", "0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508", "0x38f1b5bca324642b144da837412e9d82e31937ed4bbe21a1ebccb0c3d3d8d36", "0x7533325f737562204f766572666c6f77", + "0x57726f6e6720456e74727920506f696e74", + "0x57726f6e675f6572726f72", "0x76616c7565732073686f756c64206e6f74206368616e67652e", "0x636c61737320686173682073686f756c64206e6f74206368616e67652e", - "0x53746f726167654261736541646472657373", - "0x31448060506164e4d1df7635613bacfbea8af9c3dc85ea9a55935292a4acddc", - "0x92", + "0x746573745f73746f726167655f7661725f6368616e6765642e", + "0x311fb2a7f01403971aca6ae0a12b8ad0602e7a5ec48ad48951969942e99d788", "0x556e6578706563746564206572726f72", "0x454e545259504f494e545f4e4f545f464f554e44", "0x1c4e1062ccac759d9786c18a401086aa7ab90fde340fffd5cbd792d11daa7e7", "0x454e545259504f494e545f4641494c4544", "0x457870656374656420726576657274", "0x4369726375697444617461", - "0x9a", + "0x9b", "0x43697263756974", "0x800000000000000800000000000000000000000000000001", - "0x9d", + "0x9e", "0x43697263756974496e707574416363756d756c61746f72", "0x43697263756974496e707574", "0x800000000000000800000000000000000000000000000002", - "0x9c", + "0x9d", "0x4e6f7420616c6c20696e707574732068617665206265656e2066696c6c6564", "0x526573756c743a3a756e77726170206661696c65642e", "0x536e617073686f74", - "0xa0", - "0x149ee8c97f9cdd259b09b6ca382e10945af23ee896a644de8c7b57da1779da7", "0xa1", + "0x149ee8c97f9cdd259b09b6ca382e10945af23ee896a644de8c7b57da1779da7", + "0xa2", "0x800000000000000300000000000000000000000000000004", "0x36775737a2dc48f3b19f9a1f4bc3ab9cb367d1e2e827cef96323826fd39f53f", - "0xa3", + "0xa4", "0x46a6158a16a947e5916b2a2ca68501a45e93d7110e81aa2d6438b1c57c879a3", "0x602e", "0x206c696d62313a20302c206c696d62323a20302c206c696d62333a2030207d", "0x6f7574707574286d756c29203d3d2075333834207b206c696d62303a20362c", "0x679ea9c5b65e40ad9da80f5a4150d36f3b6af3e88305e2e3ae5eccbc5743d9", - "0xaa", + "0xab", "0x1f", "0x617373657274696f6e206661696c65643a20606f7574707574732e6765745f", "0x62797465733331", "0x5539364c696d62734c7447756172616e746565", "0x800000000000000100000000000000000000000000000001", "0x4d756c4d6f6447617465", + "0xb6", "0xb5", - "0xb4", "0x5375624d6f6447617465", - "0xb6", - "0x496e766572736547617465", "0xb7", + "0x496e766572736547617465", + "0xb8", "0x4164644d6f6447617465", "0xffffffffffffffffffffffff", "0x35de1f6419a35f1a8c6f276f09c80570ebf482614031777c6d07679cf95b8bb", - "0xb8", + "0xb9", "0x436972637569744661696c75726547756172616e746565", "0x436972637569745061727469616c4f757470757473", - "0xc8", + "0xc9", "0x436972637569744f757470757473", - "0xbe", - "0xc0", + "0xbf", + "0xc1", "0x4369726375697444657363726970746f72", "0x416c6c20696e707574732068617665206265656e2066696c6c6564", "0x55393647756172616e746565", "0x800000000000000100000000000000000000000000000005", - "0xc5", - "0xca", - "0xb2", + "0xc6", + "0xcb", + "0xb3", "0x436972637569744d6f64756c7573", "0x4d756c4d6f64", - "0xcf", + "0xd0", "0x52616e6765436865636b3936", - "0xd1", + "0xd2", "0x4164644d6f64", - "0xd4", + "0xd5", "0x6d232c016ef1b12aec4b7f88cc0b3ab662be3b7dd7adbce5209fcfdbd42a504", "0x45635374617465", "0x4b5810004d9272776dec83ecc20c19353453b956e594188890b48467cb53c19", "0x3dbce56de34e1cfe252ead5a1f14fd261d520d343ff6b7652174e62976ef44d", "0x4563506f696e74", - "0xdb", + "0xdc", "0x4fad269cbf860980e38768fe9cb6b0b9ab03ee3fe84cfde2eccce597c874fd8", "0x654fd7e67a123dd13868093b3b7777f1ffef596c2e324f25ceaf9146698482c", - "0xe0", + "0xe1", "0x7538", + "0x53746f726167654261736541646472657373", "0x3c4930bb381033105f3ca15ccded195c90cd2af5baa0e1ceb36fde292df7652", + "0xe2", "0x34482b42d8542e3c880c5c93d387fb8b01fe2a5d54b6f50d62fe82d9e6c2526", "0x2691cb735b18f3f656c3b82bd97a32b65d15019b64117513f8604d1e06fe58b", "0x7265637572736976655f6661696c", @@ -254,104 +256,105 @@ "0x32564d7e0fe091d49b4c20f4632191e4ed6986bf993849879abfef9465def25", "0x62c83572d28cb834a3de3c1e94977a4191469a4a8c26d1d7bc55305e640ed5", "0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972", - "0xe9", + "0xeb", "0xa853c166304d20fb0711becf2cbdf482dee3cac4e9717d040b7a7ab1df7eec", - "0xea", - "0xf1", - "0xee", + "0xec", + "0xf3", "0xf0", - "0xef", + "0xf2", + "0xf1", "0x177e60492c5a8242f76f07bfe3661bd", "0xb292a619339f6e567a305c951c0dcbcc", "0x42d16e47f219f9e98e76e09d8770b34a", "0xe59ec2a17ce5bd2dab2abebdf89a62e2", - "0xf7", - "0xf4", + "0xf9", "0xf6", - "0xf5", + "0xf8", + "0xf7", "0xe3b0c44298fc1c149afbf4c8996fb924", "0x87d9315798aaa3a5ba01775787ced05e", "0xaaf7b4e09fc81d6d1aa546e8365d525d", "0x27ae41e4649b934ca495991b7852b855", + "0xfe", "0xfc", - "0xfa", - "0xfb", "0xfd", + "0xff", "0x4aaec73635726f213fb8a9e64da3b86", "0x6e1cda979008bfaf874ff796eb3bb1c0", "0x32e41495a944d0045b522eba7240fad5", "0x49288242", - "0x103", + "0x105", "0x102", - "0x101", + "0x104", + "0x103", "0xdb0a2e6710c71ba80afeb3abdf69d306", "0x502a43ce77c6f5c736a82f847fa95f8c", "0x2d483fe223b12b91047d83258a958b0f", "0xce729c7704f4ddf2eaaf0b76209fe1b0", - "0x107", - "0x106", + "0x109", + "0x108", "0x536563703235367231506f696e74", "0xffffffff000000010000000000000000", "0xcb47311929e7a903ce831cb2b3e67fe265f121b394a36bc46c17cf352547fc", - "0x105", + "0x107", "0x185fda19bc33857e9f1d92d61312b69416f20cf740fa3993dcc2de228a6671d", - "0x109", + "0x10b", "0xf83fa82126e7aeaf5fe12fff6a0f4a02d8a185bf5aaee3d10d1c4e751399b4", - "0x10a", + "0x10c", "0x107a3e65b6e33d1b25fa00c80dfe693f414350005bc697782c25eaac141fedd", - "0x112", - "0x10f", + "0x114", "0x111", - "0x110", + "0x113", + "0x112", "0x4ac5e5c0c0e8a4871583cc131f35fb49", "0x4c8e4fbc1fbb1dece52185e532812c4f", "0x7a5f81cf3ee10044320a0d03b62d3e9a", "0xc2b7f60e6a8b84965830658f08f7410c", - "0x116", - "0x115", + "0x118", + "0x117", "0x100000000000000000000000000000000", "0xe888fbb4cf9ae6254f19ba12e6d9af54", "0x788f195a6f509ca3e934f78d7a71dd85", - "0x119", - "0x118", + "0x11b", + "0x11a", "0x767410c1", "0xbb448978bd42b984d7de5970bcaf5c43", "0x556e657870656374656420636f6f7264696e61746573", - "0x120", - "0x11d", + "0x122", "0x11f", - "0x11e", + "0x121", + "0x120", "0x8e182ca967f38e1bd6a49583f43f1876", "0xf728b4fa42485e3a0a5d2f346baa9455", "0xe3e70682c2094cac629f6fbed82c07cd", "0x8e031ab54fc0c4a8f0dc94fad0d0611", "0x496e76616c696420617267756d656e74", - "0x125", - "0x124", + "0x127", + "0x126", "0x53686f756c64206265206e6f6e65", "0xffffffffffffffffffffffffffffffff", "0xfffffffffffffffffffffffefffffc2f", - "0x14e", + "0x150", "0x61be55a8", "0x800000000000000700000000000000000000000000000009", - "0x12a", - "0x336711c2797eda3aaf8c07c5cf7b92162501924a7090b25482d45dd3a24ddce", - "0x12b", - "0x536861323536537461746548616e646c65", "0x12c", + "0x336711c2797eda3aaf8c07c5cf7b92162501924a7090b25482d45dd3a24ddce", "0x12d", - "0x324f33e2d695adb91665eafd5b62ec62f181e09c2e0e60401806dcc4bb3fa1", + "0x536861323536537461746548616e646c65", "0x12e", + "0x12f", + "0x324f33e2d695adb91665eafd5b62ec62f181e09c2e0e60401806dcc4bb3fa1", + "0x130", "0x800000000000000000000000000000000000000000000009", - "0x129", + "0x12b", + "0x13b", + "0x13a", "0x139", "0x138", "0x137", "0x136", "0x135", "0x134", - "0x133", - "0x132", "0x5be0cd19", "0x1f83d9ab", "0x9b05688c", @@ -361,7 +364,7 @@ "0xbb67ae85", "0x6a09e667", "0x176a53827827a9b5839f3d68f1c2ed4673066bf89e920a3d4110d3e191ce66b", - "0x13a", + "0x13c", "0x61616161", "0x496e646578206f7574206f6620626f756e6473", "0x57726f6e67206572726f72206d7367", @@ -370,71 +373,76 @@ "0xa5963aa610cb75ba273817bce5f8c48f", "0x57726f6e6720686173682076616c7565", "0x587f7cc3722e9654ea3963d5fe8c0748", - "0x144", + "0x146", "0x3f829a4bc463d91621ba418d447cc38c95ddc483f9ccfebae79050eb7b3dcb6", - "0x145", - "0x25e50662218619229b3f53f1dc3253192a0f68ca423d900214253db415a90b4", "0x147", + "0x25e50662218619229b3f53f1dc3253192a0f68ca423d900214253db415a90b4", "0x149", - "0x38b507bf259d96f5c53e8ab8f187781c3d096482729ec2d57f3366318a8502f", - "0x14a", "0x14b", - "0x3c5ce4d28d473343dbe52c630edf038a582af9574306e1d609e379cd17fc87a", + "0x38b507bf259d96f5c53e8ab8f187781c3d096482729ec2d57f3366318a8502f", "0x14c", + "0x14d", + "0x3c5ce4d28d473343dbe52c630edf038a582af9574306e1d609e379cd17fc87a", + "0x14e", "0x753132385f737562204f766572666c6f77", "0x753132385f6d756c204f766572666c6f77", "0x753132385f616464204f766572666c6f77", "0x553132384d756c47756172616e746565", - "0x155", + "0x157", "0x424c4f434b5f494e464f5f4d49534d41544348", "0x54585f494e464f5f4d49534d41544348", "0x43414c4c45525f4d49534d41544348", "0x434f4e54524143545f4d49534d41544348", "0x53454c4543544f525f4d49534d41544348", - "0x15d", - "0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec", - "0x15e", "0x15f", - "0x21afb2f280564fc34ddb766bf42f7ca36154bbba994fbc0f0235cd873ace36a", + "0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec", "0x160", - "0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62", + "0x161", + "0x21afb2f280564fc34ddb766bf42f7ca36154bbba994fbc0f0235cd873ace36a", "0x162", - "0x163", - "0x45b67c75542d42836cef6c02cca4dbff4a80a8621fa521cbfff1b2dd4af35a", + "0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62", "0x164", - "0x16b", - "0x18f", + "0x165", + "0x45b67c75542d42836cef6c02cca4dbff4a80a8621fa521cbfff1b2dd4af35a", + "0x166", + "0x16d", + "0x196", "0x436f6e747261637441646472657373", "0x800000000000000700000000000000000000000000000006", "0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7", - "0x167", - "0x166", - "0x168", "0x169", + "0x168", + "0x16a", + "0x16b", "0x80000000000000070000000000000000000000000000000e", "0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39", "0x1ce0be45cbaa9547dfece0f040e22ec60de2d0d5a6c79fa5514066dfdbb7ca6", "0x3128e9bfd21b6f544f537413d7dd38a8f2e017a3b81c1a4bcf8f51a64d0dc3d", - "0x16f", + "0x171", "0x33ecdfa3f249457fb2ae8b6a6713b3069fa0c38450e972297821b52ba929029", - "0x170", - "0x1d49f7a4b277bf7b55a2664ce8cef5d6922b5ffb806b89644b9e0cdbbcac378", "0x172", + "0x1d49f7a4b277bf7b55a2664ce8cef5d6922b5ffb806b89644b9e0cdbbcac378", + "0x174", "0x13fdd7105045794a99550ae1c4ac13faa62610dfab62c16422bfcf5803baa6e", - "0x173", + "0x175", "0x7536345f616464204f766572666c6f77", + "0x57726f6e675f73746f726167655f76616c75652e", + "0x31448060506164e4d1df7635613bacfbea8af9c3dc85ea9a55935292a4acddc", + "0x73686f756c645f70616e6963", + "0x1e4089d1f1349077b1970f9937c904e27c4582b49a60b6078946dba95bc3c08", + "0x25ff849c52d40a7f29c9849fbe0064575d61c84ddc0ef562bf05bc599abe0ae", "0x746573745f7265766572745f68656c706572", "0x22", "0x45634f70", "0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb", "0x30395f664644a8fcaf5ade2c4222939f92c008e26373687503ba48223c8c394", - "0x17d", + "0x184", "0x506564657273656e", "0x6661696c", "0x223b876ce59fbc872ac2e1412727be9abe279bf03bb3002a29d7aeba8b23a9f", - "0x181", + "0x188", "0x4609194bf9403d809e38367adb782a43edaf535df565a1b05eea7b577c89af", - "0x182", + "0x189", "0x7820213d2079", "0x73756363657373", "0x2f23416cc60464d4158423619ba713070eb82b686c9d621a22c67bd37f6e0a9", @@ -443,205 +451,219 @@ "0x5365676d656e744172656e61", "0x800000000000000f00000000000000000000000000000002", "0xcc5e86243f861d2d64b08c35db21013e773ac5cf10097946fe0011304886d5", - "0x18a", + "0x191", "0x2271e6a0c1b1931cf78a8bfd030df986f9544c426af3bd6023dc55382237cf7", - "0x18c", + "0x193", "0x1d2ae7ecff8f8db67bf542f1d1f8201ff21e9f36f780ef569bcc7bc74ab634c", - "0x18d", + "0x194", "0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5", "0x1cbd0cd3f779a7c0d3cdc804f89c39bcf71a85b43d3cf8a042111f0bc2ddf63", "0x57524f4e475f434c4153535f48415348", "0x909b0519d7c88c554565d942b48b326c8dcbd2e2915301868fb8159e606aa3", - "0x194", + "0x19a", + "0x657865637574655f616e645f726576657274", + "0xa", "0x800000000000000f00000000000000000000000000000003", "0x3153ad87fe24a37e12e7b17b2ed757f4e86be104f506a9fcc51c44f485a3293", - "0x197", + "0x19f", "0x436c61737348617368", "0x4661696c656420746f20646573657269616c697a6520706172616d202334", "0x4661696c656420746f20646573657269616c697a6520706172616d202335", "0x4661696c656420746f20646573657269616c697a6520706172616d202336", "0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9", - "0x19d", + "0x1a6", "0x53797374656d", - "0x1a1", + "0x1aa", "0x4661696c656420746f20646573657269616c697a6520706172616d202333", "0x17b6ecc31946835b0d9d92c2dd7a9c14f29af0371571ae74a1b228828b2242", - "0x1a4", + "0x1ad", "0x34f9bd7c6cb2dd4263175964ad75f1ff1461ddc332fbfb274e0fb2a5d7ab968", - "0x1a5", + "0x1ae", "0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7", - "0x1a7", + "0x1b0", "0x4f7074696f6e3a3a756e77726170206661696c65642e", "0x4661696c656420746f20646573657269616c697a6520706172616d202331", "0x4661696c656420746f20646573657269616c697a6520706172616d202332", "0x4f7574206f6620676173", "0x4275696c74696e436f737473", "0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6", - "0x1b1", + "0x1ba", "0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473", "0x53746f7261676541646472657373", "0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511", "0x4761734275696c74696e", - "0x359", + "0x366", "0x7265766f6b655f61705f747261636b696e67", "0x77697468647261775f676173", "0x6272616e63685f616c69676e", + "0x72656465706f7369745f676173", "0x7374727563745f6465636f6e737472756374", "0x656e61626c655f61705f747261636b696e67", "0x73746f72655f74656d70", + "0x1c1", "0x61727261795f736e617073686f745f706f705f66726f6e74", "0x756e626f78", "0x72656e616d65", "0x656e756d5f696e6974", - "0x1b7", + "0x1c0", "0x6a756d70", "0x7374727563745f636f6e737472756374", "0x656e756d5f6d61746368", - "0x1ad5911ecb88aa4a50482c4de3232f196cfcaf7bd4e9c96d22b283733045007", "0x64697361626c655f61705f747261636b696e67", + "0x1ad5911ecb88aa4a50482c4de3232f196cfcaf7bd4e9c96d22b283733045007", "0x64726f70", - "0x1b6", + "0x1bf", "0x61727261795f6e6577", "0x636f6e73745f61735f696d6d656469617465", - "0x1b5", + "0x1be", "0x61727261795f617070656e64", - "0x1b4", - "0x1b8", + "0x1bd", "0x6765745f6275696c74696e5f636f737473", - "0x1b3", + "0x1bc", "0x77697468647261775f6761735f616c6c", - "0x1b2", + "0x1bb", "0x647570", "0x73746f726167655f77726974655f73797363616c6c", "0x73746f726167655f726561645f73797363616c6c", "0x736e617073686f745f74616b65", - "0x1b0", - "0x1af", - "0x1ae", - "0x1ad", - "0x1ac", - "0x1ab", - "0x1aa", + "0x1b9", + "0x1b8", + "0x1b7", + "0x1b6", + "0x1b5", + "0x1b4", + "0x1b3", "0x616c6c6f635f6c6f63616c", "0x66696e616c697a655f6c6f63616c73", "0x73746f72655f6c6f63616c", "0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371", - "0x1a8", + "0x1b1", "0x66756e6374696f6e5f63616c6c", - "0x1a6", + "0x1af", "0x63616c6c5f636f6e74726163745f73797363616c6c", - "0x1a3", + "0x1ac", + "0x1b2", + "0x1ab", "0x1a9", + "0x2c", + "0x1a7", + "0x61727261795f6c656e", + "0x7533325f746f5f66656c74323532", + "0x2d", + "0x1a5", + "0x1a4", + "0x1a3", + "0x1a8", + "0x636c6173735f686173685f7472795f66726f6d5f66656c74323532", + "0x66656c743235325f69735f7a65726f", + "0x1a1", "0x1a2", + "0x626f6f6c5f6e6f745f696d706c", + "0x2e", "0x1a0", + "0x73746f726167655f626173655f616464726573735f636f6e7374", + "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", + "0x73746f726167655f616464726573735f66726f6d5f62617365", "0x19e", - "0x61727261795f6c656e", - "0x7533325f746f5f66656c74323532", + "0x2f", + "0x19d", + "0x7536345f7472795f66726f6d5f66656c74323532", "0x19c", + "0x30", "0x19b", - "0x19a", - "0x19f", - "0x636c6173735f686173685f7472795f66726f6d5f66656c74323532", - "0x199", - "0x198", - "0x7536345f7472795f66726f6d5f66656c74323532", - "0x196", - "0x195", "0x6765745f636c6173735f686173685f61745f73797363616c6c", "0x636c6173735f686173685f746f5f66656c74323532", "0x66656c743235325f737562", - "0x66656c743235325f69735f7a65726f", - "0x193", - "0x192", + "0x199", "0x6765745f626c6f636b5f686173685f73797363616c6c", - "0x2c", - "0x190", - "0x2d", - "0x18e", - "0x2e", - "0x18b", - "0x191", + "0x197", + "0x195", + "0x192", + "0x198", "0x6c6962726172795f63616c6c5f73797363616c6c", - "0x2f", "0x7265706c6163655f636c6173735f73797363616c6c", "0x73656e645f6d6573736167655f746f5f6c315f73797363616c6c", - "0x189", + "0x190", "0x66656c743235325f646963745f6e6577", - "0x188", - "0x30", - "0x187", - "0x626f6f6c5f6e6f745f696d706c", + "0x18f", + "0x35", + "0x18e", "0x6465706c6f795f73797363616c6c", "0x75313238735f66726f6d5f66656c74323532", - "0x186", - "0x753132385f746f5f66656c74323532", - "0x35", - "0x185", - "0x184", "0x36", - "0x183", - "0x180", + "0x18d", + "0x753132385f746f5f66656c74323532", "0x37", "0x38", - "0x636f6e74726163745f616464726573735f746f5f66656c74323532", - "0x17f", "0x39", - "0x17e", "0x3a", - "0x17c", - "0x17b", + "0x18c", + "0x18b", "0x3b", + "0x18a", + "0x187", "0x3c", - "0x17a", - "0x179", "0x3d", + "0x636f6e74726163745f616464726573735f746f5f66656c74323532", + "0x186", "0x3e", + "0x185", "0x3f", - "0x73746f726167655f626173655f616464726573735f636f6e7374", - "0x1275130f95dda36bcbb6e9d28796c1d7e10b6e9fd5ed083e0ede4b12f613528", - "0x73746f726167655f616464726573735f66726f6d5f62617365", + "0x183", + "0x182", + "0x181", + "0x180", "0x66656c743235325f616464", "0x656d69745f6576656e745f73797363616c6c", + "0x17f", + "0x17e", + "0x17d", + "0x626f6f6c5f746f5f66656c74323532", + "0x17c", + "0x17b", + "0x17a", + "0x179", + "0x7536345f6571", "0x178", + "0x7536345f6f766572666c6f77696e675f616464", "0x177", - "0x7536345f6571", "0x176", - "0x7536345f6f766572666c6f77696e675f616464", - "0x175", - "0x40", - "0x174", - "0x41", - "0x171", - "0x16e", + "0x46", + "0x173", + "0x170", "0x7533325f7472795f66726f6d5f66656c74323532", "0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c", - "0x16a", "0x16c", + "0x16e", "0x753132385f6571", "0x7533325f6571", - "0x165", - "0x161", + "0x47", + "0x167", + "0x48", + "0x163", + "0x15e", + "0x15d", "0x15c", "0x15b", "0x15a", + "0x16f", "0x159", - "0x158", - "0x16d", - "0x157", "0x66656c743235325f646963745f737175617368", "0x753132385f6f766572666c6f77696e675f737562", - "0x153", + "0x155", "0x753132385f67756172616e7465655f6d756c", "0x753132385f6d756c5f67756172616e7465655f766572696679", "0x753132385f6f766572666c6f77696e675f616464", + "0x153", + "0x152", "0x151", - "0x150", + "0x158", "0x14f", - "0x156", - "0x14d", + "0x14a", "0x148", - "0x146", "0x6b656363616b5f73797363616c6c", + "0x145", + "0x144", "0x143", "0x142", "0x141", @@ -649,126 +671,125 @@ "0x13f", "0x13e", "0x13d", - "0x13c", - "0x13b", "0x636f6e73745f61735f626f78", - "0x130", + "0x132", "0x7368613235365f73746174655f68616e646c655f696e6974", - "0x12f", - "0x7368613235365f73746174655f68616e646c655f646967657374", "0x131", + "0x7368613235365f73746174655f68616e646c655f646967657374", + "0x133", + "0x12a", + "0x129", "0x128", - "0x127", - "0x126", "0x736563703235366b315f6e65775f73797363616c6c", + "0x125", + "0x124", "0x123", - "0x122", - "0x121", - "0x11c", - "0x11b", + "0x11e", + "0x11d", "0x736563703235366b315f6765745f78795f73797363616c6c", - "0x11a", - "0x117", - "0x114", + "0x11c", + "0x119", + "0x116", "0x66656c743235325f6d756c", - "0x113", + "0x115", + "0x110", + "0x10f", "0x10e", + "0x4d", "0x10d", - "0x10c", - "0x48", - "0x10b", "0x7365637032353672315f6e65775f73797363616c6c", - "0x108", - "0x104", - "0xff", - "0xfe", + "0x10a", + "0x106", + "0x101", "0x7365637032353672315f6765745f78795f73797363616c6c", - "0xf9", - "0xf8", - "0xf3", - "0xf2", + "0xfb", + "0xfa", + "0xf5", + "0xf4", + "0xef", + "0xee", + "0x4e", "0xed", - "0xec", - "0x49", - "0xeb", - "0xe8", + "0xea", "0x7533325f6f766572666c6f77696e675f737562", "0x61727261795f706f705f66726f6e74", + "0xe9", + "0xe8", "0xe7", "0xe6", "0xe5", "0xe4", - "0xe3", - "0xe2", "0x706564657273656e", "0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1", - "0xe1", - "0xdf", + "0xe3", + "0xe0", "0x2679d68052ccd03a53755ca9169677965fbd93e489df62f5f40d4f03c24f7a4", "0x62697477697365", + "0xdf", "0xde", - "0xdd", "0x65635f706f696e745f7472795f6e65775f6e7a", - "0xdc", + "0xdd", "0x756e777261705f6e6f6e5f7a65726f", + "0xdb", "0xda", - "0xd9", "0x65635f706f696e745f69735f7a65726f", "0x65635f73746174655f696e6974", - "0xd7", - "0x65635f73746174655f6164645f6d756c", "0xd8", + "0x65635f73746174655f6164645f6d756c", + "0xd9", "0x65635f73746174655f7472795f66696e616c697a655f6e7a", "0x65635f706f696e745f7a65726f", "0x65635f73746174655f616464", "0x65635f706f696e745f756e77726170", "0x161bc82433cf4a92809836390ccd14921dfc4dc410cf3d2adbfee5e21ecfec8", - "0xd6", + "0xd7", "0x61727261795f676574", + "0xcf", "0xce", "0xcd", - "0xcc", "0x7472795f696e746f5f636972637569745f6d6f64756c7573", "0x696e69745f636972637569745f64617461", - "0xc7", + "0xc8", "0x696e746f5f7539365f67756172616e746565", - "0xc6", - "0xc9", + "0xc7", + "0xca", "0x6164645f636972637569745f696e707574", - "0xc4", - "0xd2", + "0xc5", + "0xd4", "0xd3", - "0xd5", - "0xd0", - "0xcb", + "0xd6", + "0xd1", + "0xcc", + "0xc4", "0xc3", - "0xc2", "0x6765745f636972637569745f64657363726970746f72", - "0xbf", - "0xbd", + "0xc0", + "0xbe", "0x6576616c5f63697263756974", "0x6765745f636972637569745f6f7574707574", "0x3ec1c84a1511eed894537833882a965abdddafab0d627a3ee76e01e6b57f37a", "0x1d1238f44227bdf67f367571e4dec83368c54054d98ccf71a67381f7c51f1c4", "0x7539365f67756172616e7465655f766572696679", - "0xb9", - "0x4a", + "0xba", + "0xae", "0xad", "0xac", - "0xab", + "0xaa", "0xa9", "0xa8", "0xa7", "0xa6", "0xa5", - "0xa4", "0x7374727563745f736e617073686f745f6465636f6e737472756374", - "0xa2", - "0xbb", - "0x9f", + "0xa3", + "0x51", + "0xbc", + "0xa0", "0x4ef3b3bc4d34db6611aef96d643937624ebee01d56eae5bde6f3b158e32b15", - "0x9e", - "0x9b", + "0x9f", + "0x9c", + "0x9a", + "0x995a1546f96051a2b911879c7b314d53d580bd592e7ea51593aaec427e3c9b", "0x99", "0x98", "0x61727261795f736e617073686f745f706f705f6261636b", @@ -777,18 +798,19 @@ "0x95", "0x94", "0x93", + "0x92", "0x91", "0x90", - "0x61727261795f736c696365", "0x8f", "0x8e", + "0x61727261795f736c696365", + "0x8d", "0x8c", "0x8a", - "0x86", + "0x88", + "0x84", "0x7533325f736166655f6469766d6f64", "0x7533325f69735f7a65726f", - "0x85", - "0x84", "0x83", "0x82", "0x81", @@ -798,35 +820,34 @@ "0x7c", "0x7b", "0x7a", + "0x79", + "0x78", "0x7536345f69735f7a65726f", "0x7536345f736166655f6469766d6f64", - "0x4f", - "0x76", - "0x75", "0x74", + "0x73", "0x72", - "0x71", + "0x70", "0x6f", - "0x6e", + "0x6d", "0x6c", + "0x6a", "0x7533325f776964655f6d756c", "0x646f776e63617374", "0x7533325f6f766572666c6f77696e675f616464", - "0x6b", - "0x6a", - "0x50", "0x69", "0x68", "0x67", "0x66", + "0x65", + "0x64", "0x61727261795f736e617073686f745f6d756c74695f706f705f66726f6e74", - "0x63", + "0x61", "0x7368613235365f70726f636573735f626c6f636b5f73797363616c6c", "0x753132385f69735f7a65726f", - "0x5e", - "0x5d", - "0x59", - "0x53", + "0x5c", + "0x5b", + "0x57", "0x753235365f67756172616e7465655f696e765f6d6f645f6e", "0x753531325f736166655f6469766d6f645f62795f75323536", "0x7365637032353672315f6d756c5f73797363616c6c", @@ -853,508 +874,551 @@ "0x16", "0x13", "0x12", - "0x3910", + "0x4478", "0xffffffffffffffff", "0x26", - "0x1e8", - "0x1d5", - "0x1d0", - "0x1bf", - "0x1db", - "0x3f1", - "0x20e", - "0x213", - "0x3d9", - "0x3cf", - "0x3b9", - "0x225", - "0x22a", - "0x3a0", - "0x392", - "0x385", - "0x246", - "0x24b", - "0x36d", - "0x363", - "0x34d", - "0x25d", - "0x262", - "0x334", - "0x326", - "0x319", - "0x28d", - "0x304", - "0x79", - "0x2f2", - "0x2e9", - "0x2e0", - "0x2d8", - "0x2d1", - "0xaf", + "0x242", + "0x22d", + "0x226", + "0x215", + "0x200", + "0x1f6", + "0x1ed", + "0x1dc", + "0x1d1", + "0x209", + "0x77", + "0x236", + "0x49a", + "0x26d", + "0x274", + "0x480", + "0x474", + "0x45e", + "0x290", + "0x297", + "0x444", + "0x435", + "0x427", + "0x2ba", + "0x2c1", + "0x40d", + "0x401", + "0x3eb", + "0x2dd", + "0x2e4", + "0x3d1", + "0x3c2", + "0x3b4", + "0x315", + "0x39e", + "0x38a", + "0x37f", + "0x375", "0xb0", "0xb1", - "0x2fc", - "0xb3", - "0xba", - "0xbc", - "0x341", - "0xc1", - "0x378", - "0x3ad", - "0x3e4", - "0x475", - "0x414", - "0x419", - "0x464", - "0x460", - "0x430", + "0xb2", + "0x36c", + "0xb4", + "0xbb", + "0xbd", + "0xc2", + "0x364", + "0x396", + "0x3df", + "0x41b", "0x452", - "0x44b", - "0x468", - "0x58b", - "0x492", - "0x497", - "0x578", - "0x573", - "0x4a5", - "0x4aa", - "0x55f", - "0x556", - "0x54e", - "0x4c4", + "0x48e", + "0x562", + "0x4c2", "0x4c9", - "0x53a", - "0x531", - "0x529", - "0x4ef", - "0x519", - "0x512", - "0x542", - "0x567", - "0x57e", - "0x64a", - "0x5a9", - "0x5ae", - "0x639", - "0x635", - "0x5bb", - "0x5c0", - "0x623", - "0x61e", - "0x5d8", - "0x60e", + "0x54f", + "0x549", + "0x539", + "0x4e4", + "0x4eb", + "0x4ff", + "0x528", + "0x520", + "0x556", + "0x5c3", + "0x589", + "0x5b5", + "0x5aa", + "0x692", + "0x5e4", + "0x5eb", + "0x67f", + "0x679", "0x600", - "0x5f6", - "0x605", - "0x628", - "0x63d", - "0x6c6", - "0x664", - "0x669", - "0x6b5", - "0x6b1", - "0x683", - "0x6a3", - "0x69a", - "0x6b9", - "0x7a4", - "0x794", - "0x78c", - "0x77c", - "0x76c", + "0x607", + "0x665", + "0x65d", + "0x624", + "0x64c", + "0x644", + "0x66d", + "0x686", + "0x79d", + "0x6b6", + "0x6bd", + "0x788", + "0x781", + "0x770", + "0x6d9", + "0x6e0", "0x75b", - "0x749", - "0x70d", + "0x751", + "0x748", + "0x70c", "0x737", - "0x730", - "0x880", - "0x7c4", - "0x7c9", - "0x86d", - "0x868", - "0x857", - "0x7db", - "0x7e0", - "0x843", - "0x83a", - "0x832", + "0x728", + "0x72e", + "0x764", + "0x791", + "0x8e5", + "0x7c1", + "0x7c8", + "0x8d0", + "0x8c9", + "0x7de", + "0x7e5", + "0x8b4", + "0x8aa", + "0x8a1", "0x806", - "0x822", - "0x819", - "0x84b", - "0x873", - "0x95a", - "0x89e", - "0x8a3", - "0x949", - "0x945", - "0x935", + "0x80d", + "0x88c", + "0x882", + "0x879", + "0x839", + "0x868", + "0x860", + "0x895", + "0x8bd", + "0x8d9", + "0x9ce", + "0x908", + "0x90f", + "0x9bb", + "0x9b5", "0x924", - "0x912", - "0x8ff", - "0x8d2", - "0x8ed", - "0x94d", - "0x9d3", - "0x976", - "0x97b", + "0x92b", + "0x9a1", + "0x999", + "0x948", + "0x988", + "0x978", + "0x96d", + "0x97f", + "0x9a9", "0x9c2", - "0x9be", - "0x992", - "0x9b0", - "0x9a7", - "0x9c6", - "0xa7f", - "0xa70", - "0x9f5", - "0x9fa", - "0xa5d", - "0xa55", - "0xa4e", - "0xa1f", - "0xa3f", - "0xa36", - "0xa64", - "0xacb", - "0xaa4", - "0xabd", - "0xbd6", - "0xaeb", - "0xaf0", - "0xbc3", - "0xbbe", - "0xbad", - "0xb02", - "0xb07", - "0xb99", - "0xb90", - "0xb88", - "0xb77", - "0xb26", - "0xb2b", - "0xb40", - "0xb65", - "0xb5c", - "0xba1", - "0xbc9", - "0xc58", - "0xbf2", - "0xbf7", - "0xc47", - "0xc41", - "0xc11", - "0xc33", - "0xc2c", + "0xa62", + "0x9ed", + "0x9f4", + "0xa4f", + "0xa49", + "0xa13", + "0xa3a", + "0xa2f", + "0xa56", + "0xb5b", + "0xb4a", + "0xb41", + "0xb30", + "0xb1f", + "0xb0d", + "0xafa", + "0xab8", + "0xae7", + "0xadf", + "0xc60", + "0xb80", + "0xb87", "0xc4b", - "0xca8", - "0xc7b", - "0xc9b", - "0xc94", - "0xcf8", - "0xccb", - "0xceb", - "0xce4", - "0xd4d", - "0xd1c", - "0xd3f", - "0xd37", - "0xd9e", - "0xd71", - "0xd91", - "0xd8a", - "0xe22", - "0xe14", - "0xe05", + "0xc44", + "0xc33", + "0xba3", + "0xbaa", + "0xc1e", + "0xc14", + "0xc0b", + "0xbd6", + "0xbfa", + "0xbef", + "0xc27", + "0xc54", + "0xd55", + "0xc83", + "0xc8a", + "0xd42", + "0xd3c", + "0xd2c", + "0xd1b", + "0xd09", + "0xcf6", + "0xcc6", + "0xce3", + "0xd49", + "0xde6", + "0xd76", + "0xd7d", + "0xdd3", "0xdcd", - "0xdf6", - "0xde8", - "0xeb5", - "0xe3c", - "0xe41", - "0xea3", - "0xe9c", - "0xe96", - "0xe65", - "0xe88", + "0xd99", + "0xdbe", + "0xdb3", + "0xdda", + "0xeae", + "0xe9e", + "0xe0f", + "0xe16", + "0xe8a", "0xe81", - "0xea9", - "0xef7", - "0xed8", - "0xeea", - "0xf5d", - "0xf4f", - "0xf20", - "0xf41", - "0xf3a", + "0xe79", + "0xe41", + "0xe69", + "0xe5e", + "0xe92", + "0xf02", + "0xed7", + "0xef3", + "0x103d", + "0xf27", + "0xf2e", + "0x1028", + "0x1021", + "0x1010", + "0xf4a", + "0xf51", + "0xffb", + "0xff1", + "0xfe8", + "0xfd6", + "0xf79", + "0xf80", + "0xf96", "0xfc3", - "0xfb5", - "0xf86", - "0xfa7", - "0xfa0", - "0x108c", - "0xfdf", - "0xfe4", - "0x107b", - "0x1077", - "0x1067", - "0x1056", - "0x1007", - "0x1046", - "0x101a", - "0x1030", - "0x103c", - "0x107f", - "0x112c", - "0x111d", - "0x110d", - "0x10fc", - "0x10c2", - "0x10eb", - "0x10e3", - "0x11f1", - "0x11df", - "0x114d", - "0x1152", - "0x11d7", - "0x11d0", - "0x1160", - "0x1165", - "0x11c8", - "0x11c0", - "0x1183", - "0x11ad", - "0x11a4", - "0x11ce", - "0x11dd", - "0x11dc", - "0x11e2", - "0x12ee", + "0xfb8", + "0x1004", + "0x1031", + "0x10d4", + "0x105e", + "0x1065", + "0x10c1", + "0x10b9", + "0x1084", + "0x10aa", + "0x10a2", + "0x10c8", + "0x112e", + "0x10fb", + "0x1120", + "0x1118", + "0x1188", + "0x1155", + "0x117a", + "0x1172", + "0x11e7", + "0x11b0", + "0x11d8", + "0x11cf", + "0x1242", "0x120f", - "0x1214", - "0x12dd", - "0x12d9", + "0x1234", + "0x122c", + "0x12d7", "0x12c8", - "0x1225", - "0x122a", - "0x12bf", - "0x12b7", - "0x1238", - "0x123d", - "0x12ae", - "0x12a5", - "0x125a", - "0x1293", - "0x128a", - "0x12b5", - "0x12c6", - "0x12c5", - "0x12cc", - "0x12e1", - "0x1343", - "0x1312", - "0x1335", - "0x132d", - "0x13b1", - "0x13a2", - "0x136e", - "0x1393", - "0x138b", - "0x1420", - "0x1412", - "0x13db", - "0x1404", - "0x13fb", - "0x147e", - "0x1446", - "0x146e", - "0x1464", - "0x14e1", - "0x14a5", - "0x14d3", - "0x14c8", - "0x14c4", - "0x14cb", - "0x15c4", - "0x1501", - "0x1506", - "0x15b1", - "0x15ac", - "0x159b", - "0x1518", - "0x151d", - "0x1587", - "0x157e", - "0x1576", - "0x1543", - "0x1566", - "0x155f", - "0x158f", - "0x15b7", - "0x161e", - "0x1610", - "0x15ef", - "0x1602", - "0x1689", - "0x167b", - "0x166d", - "0x164c", - "0x165f", - "0x1732", - "0x1724", - "0x16aa", - "0x16af", - "0x1713", + "0x12b8", + "0x1279", + "0x12a8", + "0x1299", + "0x1380", + "0x12f6", + "0x12fd", + "0x136d", + "0x1365", + "0x135e", + "0x1327", + "0x134f", + "0x1347", + "0x1374", + "0x13ca", + "0x13a7", + "0x13bc", + "0x143d", + "0x142e", + "0x13f9", + "0x141f", + "0x1417", + "0x14b0", + "0x14a1", + "0x146c", + "0x1492", + "0x148a", + "0x1598", + "0x14d1", + "0x14d8", + "0x1585", + "0x157f", + "0x156f", + "0x155e", + "0x1504", + "0x154d", + "0x151b", + "0x1535", + "0x1541", + "0x158c", + "0x164b", + "0x163b", + "0x162a", + "0x1618", + "0x15d8", + "0x1606", + "0x15fd", + "0x173c", + "0x1729", + "0x1673", + "0x167a", + "0x171c", + "0x1712", + "0x168e", + "0x1695", + "0x1706", + "0x16fb", + "0x16b8", + "0x16e7", + "0x16dd", "0x170f", - "0x16ff", - "0x16cc", - "0x16f0", - "0x16e6", - "0x1717", - "0x17b6", - "0x17a8", - "0x1799", - "0x1761", - "0x178a", - "0x1780", - "0x17fd", - "0x17d3", - "0x17df", - "0x17e4", - "0x17f2", - "0x1827", - "0x181e", - "0x1850", - "0x1847", - "0x18a1", - "0x1898", - "0x1890", - "0x1888", - "0x18f3", - "0x18e7", - "0x18da", - "0x18c9", - "0x190b", - "0x1910", - "0x196b", - "0x1967", - "0x1921", - "0x1926", - "0x195d", - "0x1958", - "0x1939", - "0x193e", - "0x194e", - "0x1949", - "0x1953", - "0x1962", - "0x196f", - "0x1bbe", - "0x198c", - "0x1991", - "0x1bab", - "0x1ba1", - "0x19a1", + "0x1726", + "0x1724", + "0x172e", + "0x1876", + "0x175f", + "0x1766", + "0x1863", + "0x185d", + "0x184b", + "0x1781", + "0x1788", + "0x183d", + "0x1832", + "0x179c", + "0x17a3", + "0x1825", + "0x1819", + "0x17c5", + "0x1806", + "0x17fb", + "0x182f", + "0x1848", + "0x1846", + "0x1851", + "0x186a", + "0x18d5", + "0x189e", + "0x18c6", + "0x18bd", + "0x1950", + "0x1940", + "0x1906", + "0x1930", + "0x1927", + "0x19cf", + "0x19c0", + "0x1980", + "0x19b1", "0x19a6", - "0x1b8f", - "0x1b84", - "0x1b76", - "0x1b66", - "0x1b54", - "0x1b42", - "0x1b30", - "0x19d0", - "0x19d5", - "0x1b19", - "0x1b0c", - "0x19ef", - "0x19f4", - "0x1afe", - "0x19fc", - "0x1a01", - "0x1aeb", - "0x1ade", - "0x1ace", - "0x1abc", - "0x1a18", - "0x1a1d", - "0x1aa6", - "0x1a98", - "0x1a2e", - "0x1a33", - "0x1a82", - "0x1a74", - "0x1a61", - "0x1a4c", - "0x1a90", - "0x1ab4", - "0x1af6", - "0x1b28", - "0x1b99", - "0x1bb6", - "0x1fbe", - "0x1c02", - "0x1c1a", - "0x1c1b", - "0x1fb1", - "0x1fa6", - "0x1f7b", - "0x1f70", - "0x1c9f", - "0x1f85", - "0x1cd6", - "0x1cef", - "0x1f5e", - "0x1cf2", - "0x1f88", - "0x1f51", - "0x1f44", - "0x1f37", - "0x152", - "0x1d8f", - "0x1da7", - "0x1f2a", - "0x1daa", - "0x1f90", - "0x1dd7", - "0x1f92", - "0x1e0d", - "0x1e25", - "0x1f1d", + "0x1a37", + "0x19f9", + "0x1a26", + "0x1a1b", + "0x1aaa", + "0x1a62", + "0x1a9b", + "0x1a8e", + "0x1a88", + "0x1a93", + "0x1bb3", + "0x1acf", + "0x1ad6", + "0x1b9e", + "0x1b97", + "0x1b86", + "0x1af2", + "0x1af9", + "0x1b71", + "0x1b67", + "0x1b5e", + "0x1b25", + "0x1b4d", + "0x1b45", + "0x1b7a", + "0x1ba7", + "0x1c18", + "0x1c09", + "0x1be4", + "0x1bfa", + "0x1c61", + "0x1c3f", + "0x1c53", + "0x1cda", + "0x1ccb", + "0x1cbc", + "0x1c97", + "0x1cad", + "0x1da0", + "0x1d91", + "0x1d02", + "0x1d09", + "0x1d7e", + "0x1d78", + "0x1d68", + "0x1d2d", + "0x1d58", + "0x1d4c", + "0x1d85", + "0x1e37", "0x1e28", - "0x1f94", - "0x1ba", - "0x1bb", - "0x1bc", - "0x1bd", - "0x1be", - "0x1c0", - "0x1c1", - "0x1c2", + "0x1e18", + "0x1dd7", + "0x1e08", + "0x1dfc", + "0x1e8a", + "0x1e58", + "0x1e68", + "0x1e6f", + "0x1e7e", + "0x1eb9", + "0x1eaf", + "0x1ee7", + "0x1edd", + "0x1f5d", + "0x1f50", + "0x1f44", + "0x1f38", + "0x1f29", + "0x1fd4", + "0x1f97", + "0x1fc9", + "0x1fba", + "0x2034", + "0x2027", + "0x2018", + "0x2006", + "0x204d", + "0x2052", + "0x20ad", + "0x20a9", + "0x2063", + "0x2068", + "0x209f", + "0x209a", + "0x207b", + "0x2080", + "0x2090", + "0x208b", + "0x2095", + "0x20a4", + "0x20b1", + "0x2363", + "0x20d2", + "0x20d9", + "0x234f", + "0x2343", + "0x20ef", + "0x20f6", + "0x2330", + "0x2323", + "0x2314", + "0x2303", + "0x22f0", + "0x22dd", + "0x22ca", + "0x2130", + "0x2137", + "0x22b2", + "0x22a4", + "0x2156", + "0x215d", + "0x2295", + "0x2169", + "0x2170", + "0x2281", + "0x2272", + "0x2261", + "0x224e", + "0x2191", + "0x2198", + "0x2237", + "0x2227", + "0x21af", + "0x21b6", + "0x2210", + "0x2200", + "0x21ec", + "0x21d6", + "0x2220", + "0x2247", + "0x228e", + "0x22c2", + "0x233c", + "0x235c", + "0x27b5", + "0x23ab", + "0x23c7", + "0x23c9", + "0x27a9", + "0x279c", + "0x276f", + "0x2762", + "0x2457", + "0x277c", + "0x2490", + "0x24ac", + "0x274f", + "0x24af", + "0x277e", + "0x2741", + "0x2733", + "0x2725", + "0x154", + "0x2555", + "0x2571", + "0x2717", + "0x2574", + "0x2786", + "0x25a4", + "0x2788", "0x1c3", "0x1c4", "0x1c5", "0x1c6", "0x1c7", + "0x25dd", "0x1c8", "0x1c9", "0x1ca", + "0x25f9", "0x1cb", "0x1cc", "0x1cd", "0x1ce", "0x1cf", - "0x1d1", + "0x2709", + "0x1d0", "0x1d2", "0x1d3", "0x1d4", + "0x1d5", + "0x25fc", "0x1d6", "0x1d7", - "0x1e55", "0x1d8", "0x1d9", - "0x1f96", + "0x278a", "0x1da", - "0x1dc", + "0x1db", "0x1dd", "0x1de", "0x1df", @@ -1366,11 +1430,11 @@ "0x1e5", "0x1e6", "0x1e7", + "0x1e8", "0x1e9", "0x1ea", "0x1eb", "0x1ec", - "0x1ed", "0x1ee", "0x1ef", "0x1f0", @@ -1379,19 +1443,17 @@ "0x1f3", "0x1f4", "0x1f5", - "0x1f6", "0x1f7", - "0x1e81", "0x1f8", + "0x262c", "0x1f9", - "0x1f98", "0x1fa", "0x1fb", + "0x278c", "0x1fc", "0x1fd", "0x1fe", "0x1ff", - "0x200", "0x201", "0x202", "0x203", @@ -1400,47 +1462,42 @@ "0x206", "0x207", "0x208", - "0x209", "0x20a", "0x20b", "0x20c", "0x20d", + "0x20e", "0x20f", "0x210", "0x211", "0x212", + "0x213", "0x214", - "0x215", "0x216", "0x217", "0x218", "0x219", "0x21a", + "0x265b", "0x21b", - "0x1eb3", "0x21c", "0x21d", - "0x1f9a", + "0x278e", "0x21e", "0x21f", "0x220", "0x221", - "0x1f12", "0x222", "0x223", "0x224", - "0x226", - "0x1eca", + "0x225", "0x227", "0x228", "0x229", - "0x1f00", + "0x22a", "0x22b", "0x22c", - "0x1ef0", - "0x22d", "0x22e", - "0x1ee2", "0x22f", "0x230", "0x231", @@ -1448,7 +1505,6 @@ "0x233", "0x234", "0x235", - "0x236", "0x237", "0x238", "0x239", @@ -1459,783 +1515,823 @@ "0x23e", "0x23f", "0x240", + "0x2690", "0x241", - "0x242", "0x243", + "0x2790", "0x244", "0x245", + "0x246", "0x247", - "0x1f6a", "0x248", + "0x26fd", "0x249", - "0x1f8e", "0x24a", - "0x1f8c", + "0x24b", "0x24c", "0x24d", - "0x1f8a", "0x24e", + "0x26ab", "0x24f", "0x250", "0x251", "0x252", "0x253", + "0x26ea", "0x254", "0x255", "0x256", "0x257", + "0x26d9", "0x258", "0x259", "0x25a", + "0x26ca", "0x25b", "0x25c", - "0x2005", - "0x1ffd", - "0x208d", - "0x207e", - "0x2076", - "0x2068", - "0x2061", - "0x2052", - "0x2045", - "0x2148", - "0x213f", - "0x2138", - "0x20d7", - "0x20e8", - "0x2101", - "0x2129", - "0x211a", - "0x2150", - "0x21a4", - "0x219d", - "0x2194", - "0x21aa", - "0x22e2", - "0x21cd", - "0x21e4", - "0x22d2", - "0x22c2", - "0x22b5", - "0x22a3", - "0x2296", - "0x221d", - "0x2229", - "0x222a", - "0x2247", - "0x223d", - "0x2255", - "0x2287", - "0x2281", - "0x228c", - "0x241e", - "0x2308", - "0x231e", - "0x240f", - "0x2400", - "0x23f4", - "0x23e3", - "0x23d7", - "0x2356", - "0x2362", - "0x2363", - "0x2380", - "0x2376", - "0x238c", - "0x23cd", - "0x23be", - "0x23b6", - "0x250e", - "0x24fe", - "0x24ef", - "0x24df", - "0x24ce", - "0x246e", - "0x245e", - "0x2454", - "0x24c9", - "0x249c", - "0x248c", - "0x2482", - "0x24c6", - "0x24ac", - "0x24c1", - "0x253a", - "0x2531", - "0x2560", - "0x2557", - "0x25da", - "0x25d0", - "0x25be", - "0x25b8", - "0x25c7", - "0x25e4", - "0x2691", - "0x2688", - "0x2673", - "0x265e", - "0x264c", - "0x2646", - "0x2654", - "0x269a", - "0x2736", - "0x2727", - "0x26ba", - "0x26cc", - "0x26c8", - "0x26d2", - "0x26e7", - "0x26d8", - "0x26e4", - "0x26f6", - "0x2717", - "0x2711", - "0x271f", - "0x2814", - "0x2802", - "0x27f9", - "0x27e5", - "0x27d2", - "0x27c0", - "0x27ba", - "0x27c9", - "0x280b", - "0x2975", - "0x2852", - "0x295f", - "0x292c", - "0x2879", - "0x2876", - "0x2873", - "0x287b", - "0x291f", - "0x2915", - "0x290b", - "0x2901", - "0x28f7", - "0x28e7", - "0x28ec", - "0x2951", - "0x294e", - "0x294b", - "0x2953", - "0x299a", - "0x299c", - "0x2a9b", - "0x29c7", - "0x2a8a", - "0x2a78", - "0x2a67", - "0x29fb", - "0x29eb", - "0x2a02", - "0x2a57", - "0x2a4d", - "0x2a42", - "0x2a32", - "0x2a24", - "0x2aae", - "0x2ab3", - "0x2b05", - "0x2afc", - "0x2aef", - "0x2ae0", - "0x2ad4", - "0x2b39", - "0x2b1e", - "0x2b2f", + "0x25d", "0x25e", - "0x2b98", - "0x2b54", - "0x2b59", - "0x2b8d", - "0x2b7d", - "0x2b72", "0x25f", "0x260", "0x261", - "0x2c1c", + "0x262", "0x263", - "0x2bb2", "0x264", "0x265", "0x266", - "0x2bb7", "0x267", "0x268", - "0x2c11", "0x269", "0x26a", - "0x2c01", "0x26b", "0x26c", - "0x2bf4", - "0x2be0", - "0x26d", - "0x2bf8", - "0x2bec", "0x26e", "0x26f", "0x270", "0x271", "0x272", - "0x2c61", "0x273", - "0x274", - "0x2c36", "0x275", "0x276", "0x277", - "0x2c3b", "0x278", + "0x275c", "0x279", - "0x2c57", "0x27a", "0x27b", "0x27c", - "0x2c4f", "0x27d", + "0x2784", "0x27e", "0x27f", "0x280", + "0x2782", "0x281", "0x282", "0x283", + "0x2780", "0x284", "0x285", - "0x2c82", - "0x2cee", "0x286", - "0x2cd0", - "0x2cca", - "0x2cc4", "0x287", - "0x2cbe", + "0x277b", "0x288", - "0x2cb8", "0x289", - "0x2cb2", "0x28a", - "0x2cae", "0x28b", "0x28c", + "0x28d", "0x28e", - "0x2cb6", "0x28f", - "0x2cbc", - "0x290", - "0x2cc2", "0x291", - "0x2cc8", "0x292", - "0x2cce", "0x293", - "0x2cd4", "0x294", "0x295", - "0x2ce7", "0x296", - "0x2d2a", - "0x297", - "0x2d0d", - "0x2cff", "0x298", "0x299", - "0x2d1c", + "0x2804", + "0x27fa", + "0x289f", + "0x288f", + "0x2886", + "0x2877", + "0x286f", + "0x285f", + "0x2851", + "0x2972", + "0x2968", + "0x295f", + "0x28f0", + "0x2904", + "0x2921", + "0x294f", + "0x293f", + "0x297b", + "0x29d5", + "0x29cd", + "0x29c3", + "0x29dc", + "0x2b45", + "0x2a02", + "0x2a1d", + "0x2b34", + "0x2b23", + "0x2b14", + "0x2b01", + "0x2af2", + "0x2a64", + "0x2a74", + "0x2a76", + "0x2a9b", + "0x2a8d", + "0x2aa9", + "0x2ae1", + "0x2ad9", + "0x2ae8", + "0x2cb6", + "0x2b70", + "0x2b8a", + "0x2ca6", + "0x2c96", + "0x2c88", + "0x2c76", + "0x2c68", + "0x2bd0", + "0x2be0", + "0x2be2", + "0x2c07", + "0x2bf9", + "0x2c13", + "0x2c5c", + "0x2c4c", + "0x2c43", + "0x2dd1", + "0x2dc0", + "0x2db0", + "0x2d9f", + "0x2d8d", + "0x2d1b", + "0x2d0a", + "0x2cfe", + "0x2d88", + "0x2d54", + "0x2d43", + "0x2d37", + "0x2d85", + "0x2d67", + "0x2d7f", + "0x2e02", + "0x2df8", + "0x2e2d", + "0x2e23", + "0x2eb6", + "0x2eaa", + "0x2e96", + "0x2e8e", + "0x2ea1", + "0x2ec2", + "0x2f83", + "0x2f78", + "0x2f62", + "0x2f4c", + "0x2f38", + "0x2f30", + "0x2f42", + "0x2f8e", + "0x304e", + "0x303e", + "0x2fb4", + "0x2fcc", + "0x2fc6", + "0x2fd4", + "0x2ff3", + "0x2fde", + "0x2fee", + "0x3003", + "0x302c", + "0x3024", + "0x3036", + "0x3145", + "0x3131", + "0x3126", + "0x3111", + "0x30fd", + "0x30e9", + "0x30e1", + "0x30f4", + "0x313c", + "0x32de", + "0x3188", + "0x32c7", + "0x3286", + "0x31bf", + "0x31ba", + "0x31b5", + "0x31c3", + "0x3278", + "0x326d", + "0x3262", + "0x3257", + "0x324c", + "0x323a", + "0x3241", + "0x32b7", + "0x32b2", + "0x32ad", + "0x32bb", + "0x3304", + "0x3306", + "0x34ba", + "0x34ab", + "0x3341", + "0x3499", + "0x3486", + "0x3474", + "0x3384", + "0x3373", + "0x33bd", + "0x33aa", + "0x3399", + "0x33bc", + "0x3462", + "0x3451", + "0x3445", + "0x3438", + "0x3427", + "0x3418", + "0x340d", + "0x33fe", + "0x34cf", + "0x34d4", + "0x3526", + "0x351d", + "0x3510", + "0x3501", + "0x34f5", + "0x3561", + "0x3542", + "0x3556", + "0x35cf", + "0x3581", + "0x3588", + "0x35c3", + "0x35b2", + "0x35a6", + "0x366c", + "0x35ee", + "0x35f5", + "0x3660", + "0x364f", + "0x363f", + "0x3626", + "0x3645", + "0x3636", + "0x3646", + "0x36bc", + "0x368b", + "0x3692", + "0x36b1", + "0x36a9", + "0x36e0", + "0x3773", + "0x374e", + "0x3745", + "0x373c", + "0x3733", + "0x372a", + "0x3721", + "0x371b", "0x29a", "0x29b", "0x29c", - "0x2d47", "0x29d", - "0x2d75", - "0x2d63", - "0x2d58", + "0x3727", "0x29e", + "0x3730", "0x29f", + "0x3739", "0x2a0", - "0x2d5f", + "0x3742", "0x2a1", + "0x374b", "0x2a2", + "0x3754", "0x2a3", "0x2a4", - "0x2d6a", + "0x3768", "0x2a5", + "0x37b7", "0x2a6", + "0x3796", + "0x3787", "0x2a7", "0x2a8", + "0x37a8", "0x2a9", - "0x2ddf", "0x2aa", - "0x2dd0", - "0x2dc1", "0x2ab", + "0x37d5", "0x2ac", + "0x3803", + "0x37f1", + "0x37e6", "0x2ad", "0x2ae", - "0x2db4", "0x2af", - "0x2da7", - "0x2d9a", + "0x37ed", "0x2b0", "0x2b1", "0x2b2", "0x2b3", + "0x37f8", "0x2b4", "0x2b5", - "0x2e23", "0x2b6", "0x2b7", - "0x2dfa", "0x2b8", + "0x386d", "0x2b9", - "0x2ba", - "0x2e00", + "0x385e", + "0x384f", "0x2bb", "0x2bc", - "0x2e18", "0x2bd", + "0x3842", "0x2be", - "0x2e0e", + "0x3835", + "0x3828", "0x2bf", "0x2c0", - "0x2c1", "0x2c2", "0x2c3", "0x2c4", + "0x38bb", "0x2c5", "0x2c6", - "0x2e4c", - "0x2e49", + "0x388b", "0x2c7", "0x2c8", - "0x2e6d", "0x2c9", - "0x2e4f", + "0x3893", "0x2ca", - "0x2e7a", - "0x2e63", - "0x2e76", "0x2cb", + "0x38b0", "0x2cc", "0x2cd", + "0x38a4", "0x2ce", "0x2cf", - "0x2e81", - "0x2e98", - "0x2e95", - "0x2eb8", - "0x2e9b", - "0x2ec5", - "0x2eaf", - "0x2ec1", - "0x2ecc", "0x2d0", - "0x2f1a", + "0x2d1", "0x2d2", - "0x2f0a", "0x2d3", "0x2d4", "0x2d5", - "0x2f01", + "0x38eb", + "0x38e6", "0x2d6", "0x2d7", - "0x2ef5", + "0x3916", + "0x2d8", + "0x38f0", "0x2d9", + "0x3924", + "0x3908", + "0x391e", "0x2da", "0x2db", - "0x2f3a", - "0x2f37", - "0x2f5b", - "0x2f3d", "0x2dc", - "0x2f61", - "0x2f51", - "0x2f5d", - "0x308a", - "0x2f68", - "0x2f7e", - "0x2f7b", - "0x2faf", - "0x2f81", - "0x2fa5", - "0x2f94", - "0x2f9e", - "0x3083", - "0x2dd", "0x2de", + "0x392d", + "0x394a", + "0x3945", + "0x3974", + "0x394f", + "0x3982", + "0x3967", + "0x397c", + "0x398b", "0x2df", - "0x3070", + "0x2e0", + "0x39e1", "0x2e1", + "0x39d0", "0x2e2", "0x2e3", - "0x2e4", + "0x39c6", "0x2e5", "0x2e6", - "0x3060", - "0x3052", "0x2e7", - "0x3046", - "0x303b", + "0x39b9", "0x2e8", - "0x3031", - "0x3027", - "0x300f", - "0x3020", - "0x301c", + "0x2e9", "0x2ea", + "0x3a08", + "0x3a03", + "0x3a33", + "0x3a0d", "0x2eb", + "0x3a3c", + "0x3a25", + "0x3a36", + "0x3ba1", + "0x3a45", + "0x3a61", + "0x3a5c", + "0x3aa0", + "0x3a66", + "0x3a94", + "0x3a7d", + "0x3a8b", + "0x3b98", "0x2ec", - "0x3068", "0x2ed", "0x2ee", "0x2ef", + "0x3b84", "0x2f0", "0x2f1", - "0x30ec", - "0x30e7", - "0x30e2", - "0x30dc", - "0x30f0", - "0x30ff", + "0x2f2", "0x2f3", "0x2f4", "0x2f5", + "0x3b72", + "0x3b63", "0x2f6", - "0x342d", - "0x33b1", - "0x334c", - "0x333c", - "0x32aa", - "0x31d8", - "0x3128", - "0x312c", - "0x31c4", + "0x3b55", + "0x3b48", "0x2f7", + "0x3b3c", + "0x3b30", + "0x3b12", + "0x3b29", + "0x3b23", "0x2f8", - "0x31b8", "0x2f9", "0x2fa", - "0x31a8", - "0x3177", - "0x3168", - "0x315c", "0x2fb", - "0x3183", - "0x31a5", - "0x319a", + "0x3b7c", + "0x2fc", "0x2fd", - "0x318e", "0x2fe", - "0x324e", - "0x31d2", "0x2ff", "0x300", - "0x31e1", - "0x31e5", - "0x3299", - "0x3289", - "0x327c", - "0x326b", - "0x3238", - "0x3229", - "0x321d", - "0x3244", - "0x3268", - "0x325d", - "0x3251", "0x301", - "0x3305", - "0x32a4", - "0x32b2", - "0x32b6", - "0x3328", - "0x32ef", - "0x32e0", - "0x32d4", - "0x32fb", - "0x3325", - "0x331a", - "0x330e", - "0x3336", - "0x337b", - "0x336f", - "0x3366", - "0x3387", - "0x33ab", - "0x33a3", - "0x3397", - "0x33c1", - "0x33f4", - "0x33e6", - "0x33db", - "0x3401", - "0x3427", - "0x341d", - "0x340d", - "0x345a", + "0x3c02", + "0x3bfd", + "0x3bf8", + "0x3bf2", + "0x3c06", + "0x3c15", "0x302", "0x303", - "0x3451", + "0x304", "0x305", + "0x3f43", + "0x3ec7", + "0x3e62", + "0x3e52", + "0x3dc0", + "0x3cee", + "0x3c3e", + "0x3c42", + "0x3cda", "0x306", "0x307", - "0x34be", - "0x3475", - "0x347a", - "0x34b4", - "0x34af", - "0x348b", - "0x3490", - "0x34a5", - "0x349e", + "0x3cce", "0x308", "0x309", + "0x3cbe", + "0x3c8d", + "0x3c7e", + "0x3c72", "0x30a", - "0x34aa", + "0x3c99", "0x30b", - "0x34b9", + "0x3cbb", + "0x3cb0", "0x30c", + "0x3ca4", "0x30d", + "0x3d64", + "0x3ce8", "0x30e", - "0x3504", - "0x34f9", - "0x34ea", - "0x34e0", - "0x34f3", - "0x350e", - "0x3544", - "0x3538", - "0x352a", - "0x3558", - "0x3567", - "0x3576", "0x30f", - "0x3585", + "0x3cf7", + "0x3cfb", + "0x3daf", + "0x3d9f", + "0x3d92", + "0x3d81", + "0x3d4e", + "0x3d3f", + "0x3d33", + "0x3d5a", + "0x3d7e", + "0x3d73", + "0x3d67", "0x310", - "0x3594", + "0x3e1b", + "0x3dba", + "0x3dc8", + "0x3dcc", + "0x3e3e", + "0x3e05", + "0x3df6", + "0x3dea", + "0x3e11", + "0x3e3b", + "0x3e30", + "0x3e24", + "0x3e4c", + "0x3e91", + "0x3e85", + "0x3e7c", + "0x3e9d", + "0x3ec1", + "0x3eb9", + "0x3ead", + "0x3ed7", + "0x3f0a", + "0x3efc", + "0x3ef1", + "0x3f17", + "0x3f3d", + "0x3f33", + "0x3f23", + "0x3f74", "0x311", - "0x35a3", "0x312", - "0x35b2", + "0x3f6a", "0x313", - "0x35c1", "0x314", - "0x35d0", - "0x315", - "0x35df", "0x316", - "0x35ee", + "0x3fd9", + "0x3f90", + "0x3f95", + "0x3fcf", + "0x3fca", + "0x3fa6", + "0x3fab", + "0x3fc0", + "0x3fb9", "0x317", - "0x35fd", - "0x360c", "0x318", - "0x361b", - "0x362a", - "0x3637", + "0x319", + "0x3fc5", "0x31a", - "0x3730", - "0x3724", + "0x3fd4", "0x31b", "0x31c", - "0x3714", - "0x3706", "0x31d", - "0x36f2", - "0x367a", - "0x3680", - "0x3687", - "0x368f", - "0x36dc", - "0x36d1", + "0x401f", + "0x4014", + "0x4005", + "0x3ffb", + "0x400e", + "0x4029", + "0x4066", + "0x4059", + "0x404a", + "0x407b", + "0x408a", + "0x4099", "0x31e", - "0x36c6", - "0x36bc", + "0x40a8", "0x31f", - "0x36b3", + "0x40b7", "0x320", + "0x40c6", "0x321", + "0x40d5", + "0x40e4", "0x322", + "0x40f3", "0x323", + "0x4102", + "0x4111", "0x324", - "0x36e6", + "0x4120", + "0x412f", "0x325", - "0x371c", + "0x413e", + "0x326", + "0x414d", + "0x415a", "0x327", - "0x37a0", + "0x427e", + "0x4271", "0x328", "0x329", + "0x425f", + "0x4250", "0x32a", + "0x423b", + "0x41a9", + "0x41b1", + "0x41ba", + "0x41c6", + "0x4223", + "0x4216", "0x32b", + "0x4209", + "0x41fd", "0x32c", + "0x41f2", "0x32d", "0x32e", "0x32f", - "0x3790", - "0x3788", - "0x3782", "0x330", "0x331", + "0x422f", "0x332", + "0x4269", "0x333", - "0x3797", + "0x334", + "0x42fb", "0x335", "0x336", - "0x37bc", "0x337", "0x338", - "0x37c1", "0x339", - "0x37cb", - "0x37d0", - "0x37d7", - "0x37dc", - "0x37e5", - "0x37ea", "0x33a", "0x33b", - "0x37f4", - "0x37f9", "0x33c", + "0x42ea", + "0x42e1", + "0x42d9", "0x33d", "0x33e", - "0x3803", - "0x3806", "0x33f", "0x340", - "0x3864", + "0x341", + "0x42f2", "0x342", "0x343", + "0x4319", "0x344", - "0x3815", - "0x381a", - "0x381f", - "0x3824", - "0x3829", - "0x382e", - "0x3833", - "0x3838", - "0x383d", - "0x3842", - "0x3847", - "0x384c", - "0x3851", - "0x3856", - "0x385b", "0x345", - "0x385f", + "0x431e", "0x346", + "0x4328", + "0x432d", + "0x4334", + "0x4339", + "0x4342", + "0x4347", "0x347", "0x348", + "0x4351", + "0x4356", "0x349", "0x34a", "0x34b", + "0x4360", + "0x4363", "0x34c", + "0x34d", "0x34e", + "0x43c1", "0x34f", "0x350", "0x351", + "0x4372", + "0x4377", + "0x437c", + "0x4381", + "0x4386", + "0x438b", + "0x4390", + "0x4395", + "0x439a", + "0x439f", + "0x43a4", + "0x43a9", + "0x43ae", + "0x43b3", + "0x43b8", "0x352", + "0x43bc", "0x353", "0x354", "0x355", "0x356", "0x357", - "0x38aa", - "0x387b", - "0x3880", - "0x389f", "0x358", - "0x3896", - "0x38ff", - "0x38f4", - "0x38e4", - "0x38da", - "0x38ed", - "0x3909", - "0x406", - "0x483", - "0x59b", - "0x658", - "0x6d4", - "0x7b3", - "0x890", - "0x968", - "0x9e1", - "0xa8e", - "0xada", - "0xbe6", - "0xc66", - "0xcb6", - "0xd06", - "0xd5c", - "0xdac", - "0xe30", - "0xec3", - "0xf05", - "0xf6b", - "0xfd1", - "0x109a", - "0x113b", - "0x1201", - "0x12fc", - "0x1352", - "0x13c0", - "0x142e", - "0x148f", - "0x14f0", - "0x15d4", - "0x162c", - "0x1697", - "0x1740", - "0x17c4", - "0x180c", - "0x1835", - "0x185e", - "0x18ab", - "0x1904", - "0x1974", - "0x1bcf", - "0x1fd1", - "0x2011", - "0x2018", - "0x209b", - "0x2158", - "0x21b0", - "0x22ed", - "0x2428", - "0x251d", - "0x2548", - "0x256e", - "0x25ed", - "0x26a4", - "0x2744", - "0x2820", - "0x2989", - "0x29a2", - "0x2aa7", - "0x2b0f", - "0x2b48", - "0x2ba6", - "0x2c2a", - "0x2c6f", - "0x2d3a", - "0x2dee", - "0x2e32", - "0x2f23", - "0x3092", - "0x30f4", - "0x343e", - "0x3468", - "0x34c6", - "0x3514", - "0x3552", - "0x363e", - "0x373c", - "0x37ac", - "0x380a", - "0x386f", - "0x38b9", - "0x1d89a", + "0x359", + "0x35a", + "0x35b", + "0x35c", + "0x35d", + "0x35e", + "0x35f", + "0x360", + "0x361", + "0x362", + "0x363", + "0x4411", + "0x43dc", + "0x43e3", + "0x4405", + "0x365", + "0x43fc", + "0x4467", + "0x445c", + "0x444c", + "0x4442", + "0x4455", + "0x4471", + "0x4b0", + "0x571", + "0x5d2", + "0x6a1", + "0x7ae", + "0x8f6", + "0x9dd", + "0xa71", + "0xb6b", + "0xc71", + "0xd64", + "0xdf5", + "0xebe", + "0xf12", + "0x104e", + "0x10e3", + "0x113d", + "0x1197", + "0x11f7", + "0x1251", + "0x12e6", + "0x138f", + "0x13d9", + "0x144c", + "0x14bf", + "0x15a7", + "0x165b", + "0x174d", + "0x1885", + "0x18e5", + "0x1960", + "0x19de", + "0x1a49", + "0x1aba", + "0x1bc4", + "0x1c27", + "0x1c70", + "0x1ce9", + "0x1daf", + "0x1e46", + "0x1e9a", + "0x1ec8", + "0x1ef6", + "0x1f6b", + "0x1fe1", + "0x2046", + "0x20b6", + "0x2375", + "0x27ca", + "0x2812", + "0x2819", + "0x28ae", + "0x2983", + "0x29e2", + "0x2b52", + "0x2cc2", + "0x2de1", + "0x2e11", + "0x2e3c", + "0x2ecb", + "0x2f98", + "0x305d", + "0x3153", + "0x32f3", + "0x330c", + "0x34c8", + "0x3530", + "0x3571", + "0x35de", + "0x367b", + "0x36cb", + "0x37c8", + "0x387c", + "0x38cb", + "0x39eb", + "0x3ba8", + "0x3c0a", + "0x3f54", + "0x3f83", + "0x3fe1", + "0x402f", + "0x4075", + "0x4161", + "0x428c", + "0x4309", + "0x4367", + "0x43cc", + "0x4421", + "0x233a6", "0x500900500400300a005009005004003008007006005004003002001000", "0x300f00500900500400300e00700c00500400300d00700c00500400300b", "0x500400301200700c00500400301100700c005004003010005009005004", @@ -2254,6038 +2350,7203 @@ "0x700c00500400304800504700503c00504400304600504500503c005044", "0x304c00700c00500400304b00700c00500400304a00700c005004003049", "0x500400304e00700600500400301400700600500400304d007006005004", - "0x700600500400300f00700600500400301000700600500400304f007006", - "0x300a00700600500400300b007006005004003051007006005004003050", - "0x700c005004003053005035034052005009005004003031007006005004", - "0x2600600505805705602802702600900502902802f02600c005035055054", - "0x503c00504400305e00505d00505c02805902a05b00505a005029028059", - "0x500400306300700c00500400306200506100503c00504400306000505f", - "0x506802806702606600700c00500400306500700c00500400306400700c", - "0x504400303c00503505506900504200500400300c00500c00500c00500c", - "0x500400306d00700c00500400306c00700600500400306b00506a00503c", - "0x2805902a07100502902802f02600600507002802f02603906f06e00700c", - "0x502902802f02602d00507600507502803a02a03907405e005073005072", - "0x503c00504400307a00700600500400305e00507900507802805902a077", - "0x2a07f00503503407e00700c00500400307d00700c00500400307c00507b", - "0x508300508300508300502902802b02603908202d00508100508002803a", - "0x5083005083005083005083005083005083005083005083005083005083", - "0x5004003085007006005004003084007006005004003083005083005083", - "0x508700500400301700700600500400308600708300500400300f007083", - "0x308a005087005004003021007083005004003089007083005004003088", - "0x500400308c00508700500400302200708300500400308b007083005004", - "0x708300500400308e00508700500400302500708300500400308d007083", - "0x309000503505503909201700708300500400309100709000500400308f", - "0x5004003021007090005004003022007090005004003025007090005004", - "0x709000500400301d00709000500400301e007090005004003037007090", - "0x305100708300500400305000708300500400309300700600500400301a", - "0x503505509400508700500400300a00708300500400300b007083005004", - "0x3402d00509600509502803a02a03c005035034018007083005004003083", - "0x509000500600509b02809a02602d00509900509802803a02a097005035", - "0x700600500400309d00700600500400302d00509700509c02803a02a00c", - "0x70060050040030a20050a102802f0260390a009f00700600500400309e", - "0x30a60070060050040030a50070060050040030a40070060050040030a3", - "0x70ab0ae0a90050580ad0ac0050ab0aa0a90050580a80a7007006005004", - "0x570b20070060050040030b10070060050040030b00050290280af026028", - "0x50b40050b80280b70260b60050b502802f0260b40050350b3053005058", - "0x30070070830050040030ba0070060050040030b90050350b3083005006", - "0x280590260bd0070060050040030bc0070060050040030bb007006005004", - "0x30c000708300500400305e0050bf0050be02805902a02d0050b9005029", - "0xc50310070c40c30070070c40c30050070c40c30390c20c1007006005004", - "0xae0cb0050ab0ca0c90050c60050af0c800a0070c40c30c70050c60050af", - "0x50ce0280670260cd00702800702f02e0c90050b00050af0cc0050070ab", - "0x50040030d20050350d30d20050580d10020d00cf0050cf0050cf0050cf", - "0x702800702f02e0280070d500500400300500700500702f02e0050070d4", - "0x50580a80d70070060050040030510070cf0050040030d20050350d6028", - "0x70cf0050040030da0050da0050da0050da0050290280d90260020d80d2", - "0x280670260390dd0dc0050290280af0260d20050580ad0db0050ab0aa031", - "0x70cf0050040030280070cf0050040030cf0050cf0050cf0050cf005029", - "0x3e0020e20b900503f03e0e100503f03e0020e00df00503f03e0020de050", - "0x50040030390e50e40070060050040030050070830050040030e300503f", - "0x70060050040030e90050350550390e80e70070060050040030e6007006", - "0x50ee02802f0260390ed0050070ec0050040030eb0070060050040030ea", - "0x30f10070060050040030f00070060050040030060050ef02802f0260a2", + "0x700600500400304f00700600500400300f007006005004003010007006", + "0x3405000500900500400303100700600500400300a00700600500400300b", + "0x2600900502902802f02600c00503505305200700c005004003051005035", + "0x505a02805702a059005058005029028057026006005056055054028027", + "0x306000505f00503c00504400305e00505d00503c00504400305c00505b", + "0x500400306300700c00500400306200700c00500400306100700c005004", + "0x504200500400300c00500c00500c00500c00506602806502606400700c", + "0x306a00700600500400306900506800503c00504400303c005035053067", + "0x2600600506e02802f02603906d06c00700c00500400306b00700c005004", + "0x507302803a02a03907205c00507100507002805702a06f00502902802f", + "0x500400305c00507700507602805702a07500502902802f02602d005074", + "0x500400307b00700c00500400307a00507900503c005044003078007006", + "0x2802b02603908002d00507f00507e02803a02a07d00503503407c00700c", + "0x5081005081005081005081005081005081005081005081005081005029", + "0x3082007006005004003081005081005081005081005081005081005081", + "0x500400308400708100500400300f007081005004003083007006005004", + "0x7081005004003087007081005004003086005085005004003017007006", + "0x3022007081005004003089007081005004003088005085005004003021", + "0x500400302500708100500400308b00708100500400308a005085005004", + "0x708100500400308f00708e00500400308d00708100500400308c005085", + "0x302200708e00500400302500708e00500400308e005035053039090017", + "0x500400301e00708e00500400303700708e00500400302100708e005004", + "0x708100500400309100700600500400301a00708e00500400301d00708e", + "0x300a00708100500400300b00708100500400304f007081005004003092", + "0x2a03c005035034018007081005004003081005035053093005085005004", + "0x2602d00509800509702803a02a09600503503402d00509500509402803a", + "0x500400302d00509600509b02803a02a00c00508e00500600509a028099", + "0x700600500400309e00700600500400309d00700600500400309c007006", + "0x30a20070060050040030a10070060050040030a000700600500400309f", + "0x50040030a50070060050040030a40070060050040030a3007006005004", + "0xaa0a90050560a80920070060050040030a70070060050040030a6007006", + "0x50040030b00050290280af0260280070ab0ae0a90050560ad0ac0050ab", + "0x2802f0260b40050350b30510050560550b20070060050040030b1007006", + "0x50040030b90050350b30810050060050b40050b80280b70260b60050b5", + "0x70060050040030bb0070060050040030070070810050040030ba007006", + "0x50be02805702a02d0050b90050290280570260bd0070060050040030bc", + "0x70c40c30390c20c10070060050040030c000708100500400305c0050bf", + "0xc800a0070c40c30c70050c60050af0c50310070c40c30070070c40c3005", + "0x2e0c90050b00050af0cc0050070ab0ae0cb0050ab0ca0c90050c60050af", + "0xd10020d00cf0050cf0050cf0050cf0050ce0280650260cd00702800702f", + "0x300500700500702f02e0050070d40050040030d20050350d30d2005056", + "0x70cf0050040030d20050350d602800702800702f02e0280070d5005004", + "0x50da0050290280d90260020d80d20050560a80d700700600500400304f", + "0x260d20050560ad0db0050ab0aa0310070cf0050040030da0050da0050da", + "0x30cf0050cf0050cf0050cf0050290280650260390dd0dc0050290280af", + "0x3e0020e00df00503f03e0020de0920070cf0050040030280070cf005004", + "0x30050070810050040030e300503f03e0020e20b900503f03e0e100503f", + "0xe80e70070060050040030e60070060050040030390e50e4007006005004", + "0x50040030eb0070060050040030ea0070060050040030e9005035053039", + "0x30060050f102802f0260f00050ef02802f0260390ee0390ed0050070ec", "0x50040030f40070060050040030f30070060050040030f2007006005004", - "0x2805902a0f600502902802f02602d00502d0050f502803a02a031007083", - "0x50fb00503c0050440030fa0050f900503c00504400305e0050f80050f7", - "0x30ff00700c0050040030fe00700c0050040030fd00700c0050040030fc", - "0x510300503c00504400310200510100503c00504400310000700c005004", - "0x310700700c00500400310600700c00500400310500700c005004003104", - "0x510b00503c00504400310a00510900503c00504400310800700c005004", - "0x310f00700c00500400310e00700c00500400310d00700c00500400310c", - "0x511200503c00504400302500511100503c00504400311000700c005004", - "0x311600700c00500400311500700c00500400311400700c005004003113", - "0x700c00500400303911a11900511800503c00504400311700700c005004", - "0x511e02803a02a02d00511d00511c02803a02a0cd00700c00500400311b", - "0x2809a02605e00512100512002805902a11f00502902802f02600600502d", - "0x503c00504400312400512300503c0050440030f600503c00503c005122", - "0x700c00500400312800700c00500400312700700c005004003126005125", - "0x700600500400312c00512b00503c00504400312a00700c005004003129", - "0x513000503c00504400312f00700c00500400312e00700c00500400312d", - "0x313400700600500400313300700c00500400313200700c005004003131", - "0x700c00500400313800513700503c00504400313600513500503c005044", - "0x313c00700c00500400313b00700c00500400313a00700c005004003139", - "0x314000700600500400313f00513e00503c00504400313d007006005004", - "0x314300502400503c00504400314200700c00500400314100700c005004", - "0x508300502902814502614400708300500400314300514300503c005044", - "0x50350b3083005058057083005083005083005083005083005083005083", - "0x2a02d00514b00514a00502902809a02603914914800514702802f026146", - "0x515300515200515100515000514f00514e00305e00514d00514c028059", - "0x500400315800708300500400314f005035034157005156005155005154", - "0x708300500400315b00708300500400315a007083005004003159007083", - "0x2615f00708300500400315e00708300500400315d00708300500400315c", - "0x708300500400305e00516100516002805902a02d005146005029028059", - "0x3165007006005004003164007006005004003163007006005004003162", - "0x500400316800700600500400316700700c005004003166007006005004", - "0x2805902616c00516b02802f02616a0050350b309000505805716900700c", - "0x50350b303c00505805705e00516e00516d02805902a02d00516a005029", - "0x2805902a02d00516a0051720050290280b702617100517002802f02616f", - "0x500400317500700600500400302800700c00500400305e005174005173", - "0x500400300700700c005004003002178177007006005004003176007006", - "0x300700700600500400317900503f03e00c00502902802f02600500700c", - "0x500400317c00700600500400317b00700600500400317a007006005004", - "0x2802f02617f0050350b309700505805717e00700600500400317d007006", - "0x518400518302805902a0f600518200518200502902809a026181005180", - "0x518700518700502902809a02618600518502802f02605b0050350b305e", - "0x2603918c18b00503503418a00503503405e00518900518802805902a0f6", - "0x2819302619200503503400600519100519100519000518f00518e02818d", - "0x500c00518200500600500600500600518700500c005191005006005194", - "0x519502803a02a19100503f03e18a00503f03e187005083005083005187", - "0x2a19700518700502902805902602d00517f00519602805902a02d005182", - "0x502902803a02602d00518700519a02803a02a05e005199005198028059", - "0x500400319e00700600500400305e00519d00519c02805902a19b005187", - "0x700600500400301800700600500400319f007006005004003005007090", - "0x502902803a0261a20070060050040030021a10130070060050040031a0", - "0x261a60070060050040030021a51a40050060051a302803a02600c00500c", - "0x305e0051aa0051a902805902a0060051a800502902803a0261a7028027", - "0x1ae05e0051790051ad02805902a1ac0070060050040031ab007006005004", - "0x51b202805902a02d0050290281b10260021b00060050c41af006005058", - "0x2a1b500518700502902803a02602d00518a0051b402803a02a05e0051b3", - "0x2803a02a1910050900050900051b802809a02605e0051b70051b6028059", - "0x260060050350551ba00700600500400318b00503f03e02d00518b0051b9", - "0x709000500400305e0051bc0051bb02805902a02d00509000502902803a", - "0x30391c005e0051bf0051be02805902a02d0051a80050290281bd026028", - "0x280590261c30070060050040031c20070060050040031c1007006005004", - "0x503f03e05b00503f03e05e0051c50051c402805902a02d00505b005029", - "0x505b0051c902805902a1c80070060050040031c700503f03e0021c6187", - "0x503503405e0051cc0051cb02805902a1ca00518700502902805902602d", - "0x31cf00700600500400300600503f03e02d0051ce0051cd02803a02a006", - "0x5004003030007006005004003028007006005004003005007006005004", - "0x502902802f0261d20070060050040031d10070060050040031d0007006", - "0x500400305e0051d50051d402805902a0391d3028007083005004003187", - "0x281dc0281db1da0021d902d0050060051d802803a02a0391d71d6007006", - "0x60050051e20060050051e10280050051e00281df1870050051de0281dd", - "0x281e61e50050051e01860050051e00280071e50050071e40060050051e3", - "0x60050051e00281e91e50050051e80050071e50050071e402d0050051e7", - "0x51ed1ec0050051eb0060050051eb1ce0050051eb1860050051eb0281ea", - "0x71e405e0050051e705a0050051e70060050051f01ef0050051ee006005", - "0x51e00281f31f10050051e01c70050051e01f20050051e00050071f1005", - "0x830050051e01ec0050051f70830050051f71f60050051ee0281f51f4005", - "0x1d50050051e71870050051e705b0050051eb05b0050051fa0281f90281f8", - "0x51ee1fb0050051ee0830050051eb05b0050051e00280071f10050071e4", - "0x51ee1fe0050051ee1870050051eb1fd0050051ee02d0050051eb1fc005", - "0x60050052040282030060050052022010050051ee2000050051ee1ff005", - "0x51e80050072060050071e42060050051e00280072060050071e4028205", - "0x51e81cc0050051de2080050051e80330310052071870050051e0206005", - "0x1c700500520220b0050051eb20a0050051ee0282091910050051eb1ca005", - "0x20d0050051eb20c0050051eb05b00500520405b005005202187005005202", - "0x1c50050051de20e0050051e800c0310052071870050052041c7005005204", - "0x51eb05e0050051de03c03100520702821000600500520f1860050051f7", - "0x282152140050051eb2130050051ee2120050051ee2110050051ee05a005", - "0x2170050051e80360310052072160050051e01a80050051e72160050051eb", - "0x51e00900050051fa2190050051ee0900050051eb0282181bf0050051eb", - "0x2821d02821c02821b1bc0050051eb21a0050051e8040031005207090005", - "0x22203100520718b0050052020282212200050051ee21f0050051eb02821e", - "0x1b70050051de2250050051e822403100520718b0050052042230050051e8", - "0x1a80050051eb1a80050051fa18b0050051eb18a0050051eb1b50050051e8", - "0x1b30050051eb2270050051e822603100520718a0050051e018b0050051e0", - "0x522e22d0050051e002822c02822b22a0310052070282292280050051eb", - "0x50070f60050071e42310050051eb23003100520722f0050051e0006005", - "0x282340282330282320f60050051eb0280070f60050071e40f60050051e0", - "0x1790050051de2350050051e804603100520700c0050051e000c0050051eb", - "0x52070450310052070400050051e0047031005207048031005207028236", - "0x51de23b0050051e823a0310052072390050051ee2380050051ee237031", - "0x51f70060050051f723e03100520723d03100520723c0050051ee1aa005", - "0x2420050051e71a40050051e72410310052072400050051e002823f191005", - "0x2420050051eb2420050051fa0280050051e32430310052072420050051e0", - "0xc0050051e31a40050051de1a40050051eb2420050051de2420050051f7", - "0x2480050051ee2470310052072460310052072450050051e02440050051ee", - "0x24a0310052070df0050051e00e30050051e00e10050051e02490050051ee", - "0x24e00700524d24c0310052071910050051e005e0050051e024b031005207", - "0x71e41cc0050051e70280071ca0050071e41ec0050051e002825002824f", - "0x50072080050071e40050071ca0050071e42080050051e0028007208005", - "0x500720e0050071e420e0050051e002800720e0050071e41c50050051e7", - "0x50072170050071e42530050051ee2520050051ee0282511870050051f7", - "0x282562550050051ee0282540900050051e30900050051f72170050051e0", - "0x71e41bc0050051e721a0050051e000500721a0050071e42570050051ee", - "0x71e42230050051e00280072230050071e418b0050051e702800721a005", - "0x19b0050051e819d0050051de2590050051e8258031005207005007223005", - "0x1990050051de25b0050051e825a03100520717f0050051e00970050051ed", - "0x25c0050071e41820050051e717f0050051eb17f0050051fa1970050051e8", - "0x51e702825d25c0050051e800500725c0050071e425c0050051e0028007", - "0x51e00280072250050071e41b70050051e70280071b50050071e418a005", - "0x51e30050072250050071e40050071b50050071e41820050051eb225005", - "0x1920050051e225f0050051e002825e18a00500520219100500520202d005", - "0x18b0050051f718b0050051fa18b0050051e218f0050051e01920050051de", - "0x1900050051eb2600050051eb1910050052041900050051e018b0050051de", - "0x18a0050051f718a0050051fa18a00500520418a0050051e21910050051e3", - "0x2630050051e80520310052070282621870050051e302826118a0050051de", - "0x1820050051f71820050051e31f20050051e30f60050051e81890050051de", - "0x2640050051e80090310052071820050051e009700500520f1820050051de", - "0x51e00280072270050071e41b30050051e70830050051e31840050051de", - "0x2670050051ee2660050051ee0050072270050071e42650050051ee227005", - "0x26b0050051ee2160050051f726a0050051eb2690050051ee2680050051ee", - "0xc0050051f70240050051ee1790050052022310050051e000600500526c", - "0x1790050051e702827102827002826f17900500520426e0050051ee02826d", - "0x50072350050071e42720050051ee2350050051e00280072350050071e4", - "0x3c0050051ed2750050051eb2740050051ee2730050051ee1790050051eb", - "0x900050051ed03c0050051f003c0050051e003c0050051e71430050051ee", - "0x16a0050051e01720050051e01720050051e716f0050051eb16f0050051fa", - "0x5a0310052071720050051eb1740050051de2760050051e805d031005207", - "0x2780050051e716a0050051eb16a0050051fa16e0050051de2770050051e8", - "0x51f027c0050051ee27b0050051ee27a0050051ee03c0050051de028279", - "0x51e727e0050051ee27d0050051ee03c0050051eb2780050051e0090005", - "0x830050051ed2800050051ee27f0050051ee0280072170050071e41bf005", - "0x2820050051e805b0310052071460050051e00830050051f02810050051ee", - "0x1460050051eb1460050051fa1610050051de028285028007284005007283", - "0x2860050051e805e03100520714b0050051e014a0050051e014a0050051e7", - "0x51de14f0050051e22880050051e002828714a0050051eb14d0050051de", - "0x770050051fa02828c28b0050051ee28a0050051ee2890050051ee14f005", - "0x28d0050051ee0760050051eb0770050051e80770050051e00770050051eb", - "0x3c0050051f72910050051ee2900050051ee28f0050051ee28e0050051ee", - "0x51ee2940050051ee1310050051ee2930050051ee03c0050051fa028292", - "0x29a0050051e72990050051ee2980050051ee2970050051ee028296295005", - "0x29c0050051e829b0310052070710050051e029a0050051e00710050051e7", - "0x51e029e0050051eb29e0050051fa02829d11f0050051e81210050051de", - "0x51ee2a00050051ee29f0050051ee11d0050051eb29e0050051e829e005", - "0x2a50050051ee2a40050051ee2a30050051ee10c0050051ee0282a22a1005", - "0x2a903100520711d0050051e02a80050051ee2a70050051ee2a60050051ee", - "0x71e40060050052ad0282ac2ab0050051ee0f80050051eb2aa0050051e8", - "0x1c70050051e32af0050051ee2ae0050051ee23b0050051e000500723b005", - "0x51ee2b10050051ee2b00050051ee02800723b0050071e41aa0050051e7", - "0x282b42b30050051de2b30050051eb2b30050051fa2b30050051e72b2005", - "0x51e32b60050051de2b60050051eb2b60050051fa2b60050051e70282b5", - "0x51ee0282b90a20050051eb0282b82b70050051ee0a20050051f70a2005", - "0x2bf0050051ee0e90050052be2bd0050051e00282bc2bb0050051ee2ba005", - "0x282c20e90050051eb0e90050051e00282c10e90050051f72c00050051ee", - "0x282c82bd0050051eb0282c70282c62c50050051e00282c42c30050051ee", - "0x52cc2cb0050051ee18f0050051eb0a20050051e02ca00700524d0282c9", - "0x52020e10050052020b90050052020e30050052021ce0050051e0006005", - "0x282d02cf0050051e02cf0050051e72ce0050051ee2cd0050051ee0df005", - "0x2d50050051e02d40050051e70cf0050052d32d20050051ee0d20050052d1", - "0x2d90050051eb2d80050051eb2d70050051eb0d20050052d62d40050051e0", - "0x2de0050051ee2dd0050051ee2dc0050051eb2db0050051eb2da0050051eb", - "0xd40050051e00d50050051e02e10050051ee2e00050051ee0d20050052df", - "0x52e40df0050052040e30050052040dc0050d20050072e30d20050052e2", - "0x51fa0282e60da0050051e00282e50070070052e40310070052e400a007", - "0x52042e80310052072e70050051e02e70050051e72e70050051eb2e7005", - "0x51e00b90050051e72ea0050051ee2e90050051ee0530050051ed0e1005", - "0x51ee2ec0050051ee0bf0050051de2eb0050051e80600310052070b9005", - "0x51fa0b90050052042f00050051ee2ef0050051ee2ee0050051ee2ed005", - "0x520f0b60050051f70b90050052f22f10050051f70b90050051eb0b9005", - "0x51eb0b60050051eb0620310052072f30050051e02f30050051e7053005", - "0x2f70050051ee2d50050051eb0282f62f50050051ee2f40050051eb2f1005", - "0x2f80050051eb2f90050051eb0a90050052d62f80050051e00a90050052d1", - "0x2fe0050051ee2fd0050051ee2fc0050051ee0060050052fb2fa0050051ee", - "0x3000050051de3000050051eb3000050051fa3000050051e72ff0050051ee", - "0x51e702800719b0050071e40060050053033020050051ee3010050051ee", - "0x51ee0050072590050071e42590050051e00280072590050071e419d005", - "0x71e41990050051e70280071970050071e400500719b0050071e4304005", - "0x970050051f03050050051e806103100520725b0050051e002800725b005", - "0x2630050071e41890050051e700500725b0050071e40050071970050071e4", - "0x3060050071e40970050051e10050072630050071e42630050051e0028007", - "0x3060050051e80050073060050071e43060050051e01810050051e0028007", - "0x970050051eb0970050051de0970050051f70970050051e00970050051e2", - "0x71e41810050051eb2640050051e00280072640050071e41840050051e7", - "0x51e00280073070050071e403c0050051e11720050051de005007264005", - "0x3c0050051e23070050051e80050073070050071e43070050051e0171005", - "0x51e72760050051e00050072760050071e405f03100520703c0050051e3", - "0x870050051e03080050051ee09000500520f0280072760050071e4174005", - "0x30d0050051ee30c0050051ee30b0050051ee0870050051eb02830a028309", - "0x51ee2770050051e00050072770050071e430f0050051ee30e0050051ee", - "0x51ee3130050051ee3120050051ee3110050051ee3100050051ee08d005", - "0x51ee3180310052070880050051ee0283170283163150050051ee314005", - "0x31a0050051ee08300500520f0280072770050071e416e0050051e7319005", - "0x8c0050051ee31d0050051ee31c0050051ee08a0050051ee31b0050051ee", - "0x3200050051ee08e0050051ee31f0050051ee0870050051e331e0050051ee", - "0x52073250050051ee3240050051ee028323083005090005007322028321", - "0x280072820050071e41610050051e73280050051ee3270050051ee326031", - "0x51de32a0050051ee0050072820050071e43290050051ee2820050051e0", - "0x32c0050051e01480050051e002800732c0050071e407f00500532b14a005", - "0x2860050071e402832d0810050051e332c0050051e800500732c0050071e4", - "0x14b0050051eb0280072860050071e414d0050051e72860050051e0005007", - "0x51eb29a0050051eb0710050051eb02832e29a0050051de29a0050051f7", - "0x1210050051e700500711f0050071e432f0050051ee0430050051ee009005", - "0x51de3300050051e804203100520729c0050051e002800729c0050071e4", - "0x51fa0730050051de3310050051e80690310052070760050051e0079005", - "0x29c0050071e43320050051ee02800711f0050071e40710050051de071005", - "0x283330420050051e00420050051f73260050051ee0690050051ee005007", - "0x51ee2e80050051ee3180050051eb02833433203100520703c0050052be", - "0x2aa0050051e00280072aa0050071e40f80050051e70283360283352a9005", - "0x51eb2e70050051de2e70050051f70420050051eb0050072aa0050071e4", - "0x2eb0050071e40bf0050051e70060050cf0050073370cf0050051e30cf005", - "0x51de29b0050051e806b0310052070b90050051de2eb0050051e0028007", - "0x51e30530050051f00283390b40050051eb00c0050052be02833805d005", - "0x530050051e12f30050051de0b90050051e30050072eb0050071e405b005", - "0x71e40970050051e72f30050051eb02833a0530050051e30530050051e2", - "0x51e02580050051ee0050073050050071e43050050051e0028007305005", - "0x24a0050051ee24b0050051ee24c0050051ee09000500c005007322009005", - "0x23e0050051ee2410050051ee2430050051ee2460050051ee2470050051ee", - "0x51ee2300050051ee02833b2370050051ee23a0050051ee23d0050051ee", - "0x790050051e70280070770050071e402833d02833c2260050051ee22a005", - "0x2240050051ee0050073300050071e43300050051e00280073300050071e4", - "0x51eb0360050051fa0360050051e70400050052020050070770050071e4", - "0x520406a03100520703600500533f03600500533e0360050051e0036005", - "0x51e00280073310050071e40730050051e73410050051ee028340040005", - "0x320050051e03420050051ee2220050051eb0050073310050071e4331005", - "0x3440050051e000c0053440050073370320050320050073431a00050051ee", - "0x3180050051e03180050051e700c005086005007337032005344005007343", - "0x51ee3460050051e83460050051e03460050053450c0005083005007322", - "0x51ee34b0050051ee34a0050051ee3490050051ee3480050051ee347005", - "0x51ee04f0050051ee04e0050051ee04d0050051ee0300050051ee34c005", - "0x71e405d0050051e70070050051ee0310050051ee0510050051ee050005", - "0x520700500729b0050071e40050050051ee29b0050051e002800729b005", - "0xa900b00a00734e00700502800700502802834e00502802802834d006031", - "0x2800a02800f00534e00503100503102802834e005028007028050051007", - "0x4f01000734e00700f00505102800a00534e00500a00500b02802834e005", - "0x500f02801300534e00504f00505002802834e00502800702804e00504d", - "0x534e00501000504f02804d00534e00501400501002801400534e005013", - "0x34e00502800702802834b00502801302801700534e00504d00504e028030", - "0x4e00504f02834c00534e00501800504d02801800534e005028014028028", - "0x34b00534e00701700503002801700534e00534c00504e02803000534e005", - "0x30b34a01c00734e00734b00a00701702802834e00502800702801b005096", - "0x3000505102801c00534e00501c00500b02802834e005028007028349005", - "0x34e00502000505002802834e00502800702834800531a02001f00734e007", - "0x5102834700534e00534700501802801f00534e00501f00504f028347005", - "0x502834c02802834e00502800702834600523002d02300734e00701f005", - "0x34700501c02802834e00502d00501b02802834e00502300534b02802834e", - "0x2801f0280c000534e00502834902802834e00534a00534a02802834e005", - "0x534e0050860c000702002808600534e00508600501802808600534e005", - "0x502302834200534e0053441a00073470281a000534e005028348028344", - "0x534e00500b00502d02801c00534e00501c00500b02803200534e005342", - "0x1c00a00503200534e0050320050c002800700534e00500700534602800b", - "0x534600534b02802834e00502834c02802834e00502800702803200700b", - "0x311a002834100534e00534100534402834100534e00502808602802834e", - "0xf02802834e00502800702803c00c00732a03334f00734e00734100b01c", - "0x2802834e00502800a02804000534e00502834202803600534e005347005", - "0x534f02822434a00734e00534a00534102822204000734e005040005032", - "0x22422200703300b03302834f00534e00534f00500b02822200534e005222", - "0x502d02802834e00502800702804804623003107122a22600734e007036", - "0x34a04022a22600a00c02804000534e00504000534f02822600534e005226", - "0x2834c02802834e00502800702823e23d23a03106923704504703134e007", - "0x2002823700534e00523700501802824100534e00502834902802834e005", - "0x24600503602824724600734e00524300503c02824300534e005237241007", - "0x2824b00534e00524a00522202824a00534e00524700504002802834e005", - "0x504700502d02834f00534e00534f00500b02824c00534e00524b005224", - "0x524c00534e00524c0050c002804500534e00504500534602804700534e", - "0x2825800534e00523a00502d02802834e00502800702824c04504734f00a", - "0x33000502801302805200534e00523e00522602825a00534e00523d005346", - "0x34e00504000522a02802834e00534a00534a02802834e005028007028028", - "0x522602825a00534e00504600534602825800534e00523000502d028028", - "0x34702800900534e00502834802802834e00502834c02805200534e005048", - "0x534f00500b02805a00534e00505d00502302805d00534e005052009007", - "0x2825a00534e00525a00534602825800534e00525800502d02834f00534e", - "0x2802834e00502800702805a25a25834f00a00505a00534e00505a0050c0", - "0x5b00534e00502834902802834e00534a00534a02802834e00534700501c", - "0x5e05b00702002805e00534e00505e00501802805e00534e005028230028", - "0x2e800534e00529b2a90073470282a900534e00502834802829b00534e005", - "0x3c00502d02800c00534e00500c00500b02806000534e0052e8005023028", - "0x6000534e0050600050c002800700534e00500700534602803c00534e005", - "0x34b02802834e00502834c02802834e00502800702806000703c00c00a005", - "0x2806200534e00502834902802834e00534a00534a02802834e005348005", - "0x506106200702002806100534e00506100501802806100534e005028046", - "0x2832600534e00505f31800734702831800534e00502834802805f00534e", - "0x500b00502d02801c00534e00501c00500b02804200534e005326005023", - "0x504200534e0050420050c002800700534e00500700534602800b00534e", - "0xb02802834e00503000534b02802834e00502800702804200700b01c00a", - "0x4802802834e00502800702802809700502801302806900534e005349005", - "0x6900534e00500a00500b02802834e00503000534b02802834e00501b005", - "0x6b00534e00502804702833200534e00502834902802834e00502834c028", - "0x2834802806a00534e00506b33200702002806b00534e00506b005018028", - "0x534e00507100502302807100534e00506a00600734702800600534e005", - "0x534602800b00534e00500b00502d02806900534e00506900500b028073", - "0x2807300700b06900a00507300534e0050730050c002800700534e005007", - "0x2833100534e00502834902802834e00503100504502802834e005028007", - "0x507633100702002807600534e00507600501802807600534e005028230", - "0x2833000534e00507707900734702807900534e00502834802807700534e", - "0x505000502d02805100534e00505100500b02832f00534e005330005023", - "0x532f00534e00532f0050c002800700534e00500700534602805000534e", - "0xa00734e00700502800700502802834e00502802802832f00705005100a", - "0x2800f00534e00503100503102802834e00502800702805005100729900b", - "0x2804e0052e104f01000734e00700f00505102800a00534e00500a00500b", - "0x2802834e00504f00501b02802834e00501000534b02802834e005028007", - "0x534e00501400501802801400534e00502801f02801300534e005028349", - "0x734702803000534e00502834802804d00534e005014013007020028014", - "0x34e00500a00500b02801800534e00501700502302801700534e00504d030", - "0xc002800700534e00500700534602800b00534e00500b00502d02800a005", - "0x34b02802834e00502800702801800700b00a00a00501800534e005018005", - "0x34c00534e00534c00534402834c00534e00502808602802834e00504e005", - "0x34e00502800702834a01c00702501b34b00734e00734c00b00a0311a0028", - "0x34b00701702834900534e00534900501802834900534e005028237028028", - "0x34e00502834202802834e0050280070283480050fc02001f00734e007349", - "0x34102802d34700734e00534700503202802300534e00502823a028347005", - "0x502300501802802d00534e00502d00534f02834602000734e005020005", - "0x702334602d00701b00b03302801f00534e00501f00500b02802300534e", - "0x34e00502823d02802834e0050280070283421a03440312ae0860c000734e", - "0x1802834700534e00534700534f0280c000534e0050c000502d028032005", - "0x2b634f34100734e0070320203470860c000b03302803200534e005032005", - "0x503c02803600534e00502834902802834e00502800702803c00c033031", - "0x534e00522200504002802834e00504000503602822204000734e005036", - "0x500b02822a00534e00522600522402822600534e005224005222028224", - "0x534e00534f00534602834100534e00534100502d02801f00534e00501f", - "0x34e00502800702822a34f34101f00a00522a00534e00522a0050c002834f", - "0x534602804600534e00503300502d02823000534e00501f00500b028028", - "0x280282a400502801302804700534e00503c00522602804800534e00500c", - "0x2802834e00502000534a02802834e00534700522a02802834e005028007", - "0x51a000534602804600534e00534400502d02823000534e00501f00500b", - "0x280070280282a400502801302804700534e00534200522602804800534e", - "0x501802823700534e00502823e02804500534e00502834902802834e005", - "0x34e00534800500b02823a00534e00523704500702002823700534e005237", - "0x22602804800534e00500700534602804600534e00501b00502d028230005", - "0x34e00504723d00734702823d00534e00502834802804700534e00523a005", - "0x2d02823000534e00523000500b02824100534e00523e00502302823e005", - "0x34e0052410050c002804800534e00504800534602804600534e005046005", - "0x534e00502834902802834e00502800702824104804623000a005241005", - "0x24300702002824600534e00524600501802824600534e005028230028243", - "0x534e00524724a00734702824a00534e00502834802824700534e005246", - "0x502d02801c00534e00501c00500b02824c00534e00524b00502302824b", - "0x534e00524c0050c002800700534e00500700534602834a00534e00534a", - "0x2834e00503100504502802834e00502800702824c00734a01c00a00524c", - "0x34e00525a00501802825a00534e00502823002825800534e005028349028", - "0x34702800900534e00502834802805200534e00525a25800702002825a005", - "0x505100500b02805a00534e00505d00502302805d00534e005052009007", - "0x2800700534e00500700534602805000534e00505000502d02805100534e", - "0xb00534e00502824102805a00705005100a00505a00534e00505a0050c0", - "0x2802834e00502802802802834e00502824302805000534e005028241028", - "0x2802834e00502800702804e04f00735001000f00734e007005028007005", - "0x534e00500f00500b02802834e00502800a02801300534e005031005031", - "0x2802834e00502800702803000514a04d01400734e00701300505102800f", - "0x501800501002801800534e00501700500f02801700534e00504d005050", - "0x2801b00534e00534c00504e02834b00534e00501400504f02834c00534e", - "0x4d02801c00534e00502801402802834e005028007028028288005028013", - "0x34e00534a00504e02834b00534e00503000504f02834a00534e00501c005", - "0x2802834e00502800702834900535100a00534e00701b00503002801b005", - "0x535202001f00734e00700a00f00724702800a00534e00500a00b007246", - "0x734b00505102801f00534e00501f00500b02802834e005028007028348", - "0x534e00502300505002802834e00502800702802d00535302334700734e", - "0x4f02834600534e00505100500f02805100534e005051050007246028051", - "0x702834400527a0860c000734e00734700505102834700534e005347005", - "0x34200534e0050c000504f0281a000534e00508600524a02802834e005028", - "0x2834e00502800702802827700502801302803200534e0051a000524b028", - "0x534400504f02834f00534e00534100524c02834100534e005028014028", - "0x20003300534e00703200525802803200534e00534f00524b02834200534e", - "0x34e00503300505002802834e00502834c02802834e00502800702800c005", - "0x500f02804000534e00534200504002803600534e00502834902803c005", - "0x534e00501000502d02801f00534e00501f00500b02822200534e00503c", - "0x501802803600534e00503600522602804000534e00504000525a028010", - "0x2822a22622403134e00522203604001001f00b05202822200534e005222", - "0x23000505d02802834e00502800702804600520c23000534e00722a005009", - "0x502800702823700521304500534e00704700505a02804704800734e005", - "0x25c23e23d00734e00723a00505102823a00534e00504800503102802834e", - "0x523e00501b02802834e00523d00534b02802834e005028007028241005", - "0x2000505b02802834e00534600501c02802834e00504500503602802834e", - "0x501802824600534e00502801f02824300534e00502834902802834e005", - "0x534e00502834802824700534e00524624300702002824600534e005246", - "0xb02824c00534e00524b00502302824b00534e00524724a00734702824a", - "0x34e00500700534602822600534e00522600502d02822400534e005224005", - "0x502800702824c00722622400a00524c00534e00524c0050c0028007005", - "0x25800534402825800534e00502808602802834e00524100534b02802834e", - "0x2805d0090071b305225a00734e0072582262240311a002825800534e005", - "0x34e00505a00503602805b05a00734e00504500503c02802834e005028007", - "0xb05e02825a00534e00525a00500b02805e00534e00505b005040028028", - "0x50280070280610620600311a82e82a929b03134e00705e346020007052", - "0xb02831800534e00505f00522402805f00534e0052e800522202802834e", - "0x34e0052a900534602829b00534e00529b00502d02825a00534e00525a005", - "0x50280070283182a929b25a00a00531800534e0053180050c00282a9005", - "0x2302804200534e00506132600734702832600534e00502834802802834e", - "0x34e00506000502d02825a00534e00525a00500b02806900534e005042005", - "0xa00506900534e0050690050c002806200534e005062005346028060005", - "0x501c02802834e00504500503602802834e00502800702806906206025a", - "0x23002833200534e00502834902802834e00502000505b02802834e005346", - "0x34e00506b33200702002806b00534e00506b00501802806b00534e005028", - "0x2302807100534e00506a00600734702800600534e00502834802806a005", - "0x34e00505d00502d02800900534e00500900500b02807300534e005071005", - "0xa00507300534e0050730050c002800700534e00500700534602805d005", - "0x504502802834e00523700504802802834e00502800702807300705d009", - "0xb02802834e00502000505b02802834e00534600501c02802834e005048", - "0x281f400502801302807600534e00522600502d02833100534e005224005", - "0x2834e00534600501c02802834e00502000505b02802834e005028007028", - "0x22600502d02822400534e00522400500b02807700534e005046005023028", - "0x7700534e0050770050c002800700534e00500700534602822600534e005", - "0x4802802834e00502834c02802834e00502800702807700722622400a005", - "0x2802834e00534600501c02802834e00502000505b02802834e00500c005", - "0x34e00501000502d02833100534e00501f00500b02802834e00534200534b", - "0x33000501802833000534e00502829b02807900534e005028349028076005", - "0x4300534e00502834802832f00534e00533007900702002833000534e005", - "0x500b02807b00534e00507c00502302807c00534e00532f043007347028", - "0x534e00500700534602807600534e00507600502d02833100534e005331", - "0x34e00502800702807b00707633100a00507b00534e00507b0050c0028007", - "0x34e00502000505b02802834e00502d00534b02802834e00502834c028028", - "0x34e00502804602808100534e00502834902802834e0050500052a9028028", - "0x2808300534e00532c08100702002832c00534e00532c00501802832c005", - "0x532a00502302832a00534e00508307f00734702807f00534e005028348", - "0x2801000534e00501000502d02801f00534e00501f00500b02832900534e", - "0x701001f00a00532900534e0053290050c002800700534e005007005346", - "0x34e00534b00534b02802834e0050500052a902802834e005028007028329", - "0x34e00502800702802835400502801302832800534e00534800500b028028", - "0x534b00534b02802834e0050500052a902802834e005349005048028028", - "0x2834c02832800534e00500f00500b02802834e00500b0052a902802834e", - "0x501802832500534e00502804702832700534e00502834902802834e005", - "0x534e00502834802832400534e00532532700702002832500534e005325", - "0xb02831f00534e00508e00502302808e00534e005324320007347028320", - "0x34e00500700534602801000534e00501000502d02832800534e005328005", - "0x502800702831f00701032800a00531f00534e00531f0050c0028007005", - "0xb0052a902802834e0050500052a902802834e00503100504502802834e", - "0x501802808c00534e00502823002831e00534e00502834902802834e005", - "0x534e00502834802831d00534e00508c31e00702002808c00534e00508c", - "0xb02831b00534e00508a00502302808a00534e00531d31c00734702831c", - "0x34e00500700534602804e00534e00504e00502d02804f00534e00504f005", - "0x50282e802831b00704e04f00a00531b00534e00531b0050c0028007005", - "0x2824102801000534e00502824102805000534e00502806002800b00534e", - "0x24102803000534e00502824102801400534e00502806202804e00534e005", - "0x700502802834e00502802802802834e00502824302801800534e005028", - "0x503102802834e00502800702801c01b00735534b34c00734e007005028", - "0x2834c00534e00534c00500b02802834e00502800a02834a00534e005031", - "0x505002802834e00502800702802000535601f34900734e00734a005051", - "0x534e00534700501002834700534e00534800500f02834800534e00501f", - "0x2801302834600534e00502300504e02802d00534e00534900504f028023", - "0xc000504d0280c000534e00502801402802834e005028007028028357005", - "0x34600534e00508600504e02802d00534e00502000504f02808600534e005", - "0x724602802834e00502800702834400535801700534e007346005030028", - "0x280320053593421a000734e00701734c00724702801700534e005017018", - "0x734e00702d0050510281a000534e0051a000500b02802834e005028007", - "0x2804f00534e00534f00505002802834e00502800702803300535a34f341", - "0x34100504f02800c00534e00504f00500f02804f00534e00504f04e007246", - "0x502800702804000535b03603c00734e00734100505102834100534e005", - "0x24b02822400534e00503c00504f02822200534e00503600524a02802834e", - "0x1402802834e00502800702802835c00502801302822600534e005222005", - "0x534e00504000504f02823000534e00522a00524c02822a00534e005028", - "0x4800535d04600534e00722600525802822600534e00523000524b028224", - "0x534e00502834902804700534e00504600505002802834e005028007028", - "0x500b02823a00534e00504700500f02823700534e005224005040028045", - "0x534e00523700525a02834b00534e00534b00502d0281a000534e0051a0", - "0xb05202823a00534e00523a00501802804500534e005045005226028237", - "0x35e24300534e00724100500902824123e23d03134e00523a04523734b1a0", - "0x505a02824a24700734e00524300505d02802834e005028007028246005", - "0x34e00524700503102802834e00502800702824b00535f01300534e00724a", - "0x505102801300534e00501301400706102802834e00502800a02824c005", - "0x525a00505002802834e00502800702805200536025a25800734e00724c", - "0x2805a00534e00505d00501002805d00534e00500900500f02800900534e", - "0x36100502801302805e00534e00505a00504e02805b00534e00525800504f", - "0x34e00529b00504d02829b00534e00502801402802834e005028007028028", - "0x3002805e00534e0052a900504e02805b00534e00505200504f0282a9005", - "0x4d03000724602802834e0050280070282e800536204d00534e00705e005", - "0x2800702806100536306206000734e00704d23d00724702804d00534e005", - "0x31805f00734e00705b00505102806000534e00506000500b02802834e005", - "0x724602800f00534e00531800505002802834e005028007028326005364", - "0x34e00505f00504f02804200534e00500f00500f02800f00534e00500f010", - "0x2834e00502800702806b00536533206900734e00705f00505102805f005", - "0x6a00524b02800600534e00506900504f02806a00534e00533200524a028", - "0x502801402802834e00502800702802836600502801302807100534e005", - "0x2800600534e00506b00504f02833100534e00507300524c02807300534e", - "0x702807700536707600534e00707100525802807100534e00533100524b", - "0x34902807900534e00507600505002802834e00502834c02802834e005028", - "0x534e00507900500f02832f00534e00500600504002833000534e005028", - "0x525a02823e00534e00523e00502d02806000534e00506000500b028043", - "0x534e00504300501802833000534e00533000522602832f00534e00532f", - "0x708100500902808107b07c03134e00504333032f23e06000b052028043", - "0x7f00734e00532c00505d02802834e00502800702808300536832c00534e", - "0x3102802834e00502800702832800536932900534e00732a00505a02832a", - "0x702832000536a32432500734e00732700505102832700534e00507f005", - "0x3602802834e00532400501b02802834e00532500534b02802834e005028", - "0x2802834e00500b00505f02802834e00506200505b02802834e005013005", - "0x2834e00504200501c02802834e00532900503602802834e005050005318", - "0x534e00502834902802834e00534200505b02802834e00500c00501c028", - "0x8e00702002831f00534e00531f00501802831f00534e00502801f02808e", - "0x534e00531e08c00734702808c00534e00502834802831e00534e00531f", - "0x502d02807c00534e00507c00500b02831c00534e00531d00502302831d", - "0x534e00531c0050c002800700534e00500700534602807b00534e00507b", - "0x2834e00532000534b02802834e00502800702831c00707b07c00a00531c", - "0x7b07c0311a002808a00534e00508a00534402808a00534e005028086028", - "0x1300503c02802834e00502800702808831900736b31a31b00734e00708a", - "0x31500534e00536c00504002802834e00509000503602836c09000734e005", - "0x31403134e00731500c34200731a00b05e02831b00534e00531b00500b028", - "0x734e00532900503c02802834e00502800702808d31031103136d312313", - "0x502d02830d00534e00530e00504002802834e00530f00503602830e30f", - "0x4206231331400b05e02831200534e00531200525a02831400534e005314", - "0x34902802834e00502800702808730830b03136e05100a30c03134e00730d", - "0x534e00530c00502d02831b00534e00531b00500b02809400534e005028", - "0x732602831200534e00531200525a02809400534e00509400522602830c", - "0x30c31b00a06902805100534e00505105000704202800a00534e00500a00b", - "0x2809700536f30600534e00709900533202809930709603134e005312094", - "0x34e00530400504802830430500734e00530600506b02802834e005028007", - "0x522602830700534e00530700502d02809600534e00509600500b028028", - "0x5130530709600a06902805100534e00505100525a02830500534e005305", - "0x280070282ff00537030000534e0070a20053320280a230130203134e005", - "0x282fc2fd00734e00530000506b0282fe00534e00502834902802834e005", - "0x52fa0050360282f92fa00734e0052fd00503c02802834e0052fc005048", - "0x282f800534e0050a90050060280a92f900734e0052f900506a02802834e", - "0xb02fe0070200280b000534e0050b00050180280b000534e0052f8005071", - "0x30200534e00530200500b0282f700534e0052f90050400280ac00534e005", - "0xac0052260282f700534e0052f700525a02830100534e00530100502d028", - "0x53320280b60b42f503134e0050ac2f730130200a0730280ac00534e005", - "0x34e0052f300506b02802834e0050280070280b90053712f300534e0070b6", - "0x282ee2ef00734e0052f100503c02802834e0052f00050480282f02f1007", - "0x34e0052ed0052220282ed00534e0052ee00504002802834e0052ef005036", - "0x2d0282f500534e0052f500500b0280bf00534e0052ec0052240282ec005", - "0x34e0050bf0050c002800a00534e00500a0053460280b400534e0050b4005", - "0x34e0050b900502302802834e0050280070280bf00a0b42f500a0050bf005", - "0x3460280b400534e0050b400502d0282f500534e0052f500500b0282eb005", - "0x2eb00a0b42f500a0052eb00534e0052eb0050c002800a00534e00500a005", - "0x52ea0050760282e92ea00734e0052ff00533102802834e005028007028", - "0x34602837200534e00530100502d02805300534e00530200500b02802834e", - "0x2837500502801302837400534e0052e900522602837300534e00500a005", - "0x734e00509700533102802834e00505100504502802834e005028007028", - "0x502d02805300534e00509600500b02802834e0050dc0050760283760dc", - "0x534e00537600522602837300534e00500a00534602837200534e005307", - "0x2834e00531200504502802834e005028007028028375005028013028374", - "0x34e00531b00500b02802834e00505000531802802834e00500b00505f028", - "0x22602837300534e00530800534602837200534e00530b00502d028053005", - "0x5b02802834e00502800702802837500502801302837400534e005087005", - "0x2802834e00505000531802802834e00500b00505f02802834e005062005", - "0x534e00531b00500b02802834e00504200501c02802834e005329005036", - "0x522602837300534e00531000534602837200534e00531100502d028053", - "0x534e0053740c70073470280c700534e00502834802837400534e00508d", - "0x502d02805300534e00505300500b0280c900534e0050c60050230280c6", - "0x534e0050c90050c002837300534e00537300534602837200534e005372", - "0x2834e00501300503602802834e0050280070280c937337205300a0050c9", - "0x34e00505000531802802834e00500b00505f02802834e00506200505b028", - "0x500c00501c02802834e00504200501c02802834e005329005036028028", - "0x50282300280cb00534e00502834902802834e00534200505b02802834e", - "0x2e700534e0050cf0cb0070200280cf00534e0050cf0050180280cf00534e", - "0x2f40050230282f400534e0052e737700734702837700534e005028348028", - "0x8800534e00508800502d02831900534e00531900500b02837800534e005", - "0x8831900a00537800534e0053780050c002800700534e005007005346028", - "0x501300503602802834e00532800504802802834e005028007028378007", - "0x5000531802802834e00500b00505f02802834e00506200505b02802834e", - "0x501c02802834e00504200501c02802834e00507f00504502802834e005", - "0x282e100534e00507c00500b02802834e00534200505b02802834e00500c", - "0x2802834e0050280070280283790050280130280d400534e00507b00502d", - "0x2834e00500b00505f02802834e00506200505b02802834e005013005036", - "0x34e00504200501c02802834e00534200505b02802834e005050005318028", - "0x7c00500b0282e000534e00508300502302802834e00500c00501c028028", - "0x700534e00500700534602807b00534e00507b00502d02807c00534e005", - "0x2834e0050280070282e000707b07c00a0052e000534e0052e00050c0028", - "0x2834e00504200501c02802834e00507700504802802834e00502834c028", - "0x34e00506200505b02802834e00501300503602802834e00500c00501c028", - "0x534200505b02802834e00505000531802802834e00500b00505f028028", - "0x502d0282e100534e00506000500b02802834e00500600534b02802834e", - "0x2837a00534e0050280770280d500534e0050283490280d400534e00523e", - "0x50283480282de00534e00537a0d500702002837a00534e00537a005018", - "0xda00534e0052d70050230282d700534e0052de2dd0073470282dd00534e", - "0x70053460280d400534e0050d400502d0282e100534e0052e100500b028", - "0x70280da0070d42e100a0050da00534e0050da0050c002800700534e005", - "0x52a902802834e00532600534b02802834e00502834c02802834e005028", - "0x5b02802834e00501300503602802834e00500c00501c02802834e005010", - "0x2802834e00505000531802802834e00500b00505f02802834e005062005", - "0x2d200534e0050280790282d400534e00502834902802834e00534200505b", - "0x283480280d200534e0052d22d40070200282d200534e0052d2005018028", - "0x534e0050db0050230280db00534e0050d22d50073470282d500534e005", - "0x534602823e00534e00523e00502d02806000534e00506000500b0282dc", - "0x282dc00723e06000a0052dc00534e0052dc0050c002800700534e005007", - "0x2802834e00500c00501c02802834e0050100052a902802834e005028007", - "0x2834e00505000531802802834e00500b00505f02802834e005013005036", - "0x34e00506100500b02802834e00505b00534b02802834e00534200505b028", - "0x34e0052e800504802802834e00502800702802837b0050280130282cf005", - "0x501300503602802834e00500c00501c02802834e0050100052a9028028", - "0x34200505b02802834e00505000531802802834e00500b00505f02802834e", - "0x500b02802834e0050300052a902802834e00505b00534b02802834e005", - "0x3300282ce00534e00502834902802834e00502834c0282cf00534e00523d", - "0x34e0052cd2ce0070200282cd00534e0052cd0050180282cd00534e005028", - "0x230280e100534e0050df2db0073470282db00534e0050283480280df005", - "0x34e00523e00502d0282cf00534e0052cf00500b0282d800534e0050e1005", - "0xa0052d800534e0052d80050c002800700534e00500700534602823e005", - "0x52a902802834e00524b00504802802834e0050280070282d800723e2cf", - "0x5f02802834e00524700504502802834e00500c00501c02802834e005010", - "0x2802834e00534200505b02802834e00505000531802802834e00500b005", - "0x534e00523d00500b02802834e00501400532f02802834e0050300052a9", - "0x34e00502800702802837c0050280130280e300534e00523e00502d0282d9", - "0x501400532f02802834e00500c00501c02802834e0050100052a9028028", - "0x34200505b02802834e00505000531802802834e00500b00505f02802834e", - "0xb0282da00534e00524600502302802834e0050300052a902802834e005", - "0x34e00500700534602823e00534e00523e00502d02823d00534e00523d005", - "0x50280070282da00723e23d00a0052da00534e0052da0050c0028007005", - "0x50100052a902802834e00504800504802802834e00502834c02802834e", - "0x300052a902802834e00501400532f02802834e00500c00501c02802834e", - "0x505b02802834e00505000531802802834e00500b00505f02802834e005", - "0x282d900534e0051a000500b02802834e00522400534b02802834e005342", - "0x534e00502829b0282cb00534e0050283490280e300534e00534b00502d", - "0x3480282c500534e0052c32cb0070200282c300534e0052c30050180282c3", - "0x34e0052bf0050230282bf00534e0052c52c00073470282c000534e005028", - "0x3460280e300534e0050e300502d0282d900534e0052d900500b0280e9005", - "0xe90070e32d900a0050e900534e0050e90050c002800700534e005007005", - "0x2802834e00503300534b02802834e00502834c02802834e005028007028", - "0x2834e00501400532f02802834e00504e0052a902802834e0050100052a9", - "0x34e00505000531802802834e00500b00505f02802834e0050300052a9028", - "0x34e0050280460282bd00534e00502834902802834e00534200505b028028", - "0x282ba00534e0052bb2bd0070200282bb00534e0052bb0050180282bb005", - "0x50ec0050230280ec00534e0052ba2b70073470282b700534e005028348", - "0x2834b00534e00534b00502d0281a000534e0051a000500b0282b600534e", - "0x734b1a000a0052b600534e0052b60050c002800700534e005007005346", - "0x34e00504e0052a902802834e0050100052a902802834e0050280070282b6", - "0x500b00505f02802834e0050300052a902802834e00501400532f028028", - "0x3200500b02802834e00502d00534b02802834e00505000531802802834e", - "0x34400504802802834e00502800702802837d0050280130282b300534e005", - "0x532f02802834e00504e0052a902802834e0050100052a902802834e005", - "0x31802802834e00500b00505f02802834e0050300052a902802834e005014", - "0x2802834e0050180052a902802834e00502d00534b02802834e005050005", - "0x2b200534e00502834902802834e00502834c0282b300534e00534c00500b", - "0x2b12b20070200282b100534e0052b10050180282b100534e005028047028", - "0x2ae00534e0052b02af0073470282af00534e0050283480282b000534e005", - "0x34b00502d0282b300534e0052b300500b0282ab00534e0052ae005023028", - "0x2ab00534e0052ab0050c002800700534e00500700534602834b00534e005", - "0x2802834e0050100052a902802834e0050280070282ab00734b2b300a005", - "0x2834e0050300052a902802834e00501400532f02802834e00504e0052a9", - "0x34e00503100504502802834e00505000531802802834e00500b00505f028", - "0x34e0050282300280f600534e00502834902802834e0050180052a9028028", - "0x282aa00534e0050f80f60070200280f800534e0050f80050180280f8005", - "0x52a70050230282a700534e0052aa2a80073470282a800534e005028348", - "0x2801c00534e00501c00502d02801b00534e00501b00500b0280fa00534e", - "0x701c01b00a0050fa00534e0050fa0050c002800700534e005007005346", - "0x5100737e00b00a00734e00700502800700502802834e0050280280280fa", - "0x34e00502800a02800f00534e00503100503102802834e005028007028050", - "0x537f04f01000734e00700f00505102800a00534e00500a00500b028028", - "0x501300500f02801300534e00504f00505002802834e00502800702804e", - "0x2803000534e00501000504f02804d00534e00501400501002801400534e", - "0x2802834e00502800702802838000502801302801700534e00504d00504e", - "0x34e00504e00504f02834c00534e00501800504d02801800534e005028014", - "0x538134b00534e00701700503002801700534e00534c00504e028030005", - "0x34900538234a01c00734e00734b00a00704302802834e00502800702801b", - "0x34e00703000505102801c00534e00501c00500b02802834e005028007028", - "0x34b02802834e00502834c02802834e00502800702834800538302001f007", - "0x2802834e00534a00507c02802834e00502000501b02802834e00501f005", - "0x534e00502300501802802300534e00502801f02834700534e005028349", - "0x734702834600534e00502834802802d00534e005023347007020028023", - "0x34e00501c00500b02808600534e0050c00050230280c000534e00502d346", - "0xc002800700534e00500700534602800b00534e00500b00502d02801c005", - "0x34c02802834e00502800702808600700b01c00a00508600534e005086005", - "0x34402834400534e00502808602802834e00534800534b02802834e005028", - "0x320073843421a000734e00734400b01c0311a002834400534e005344005", - "0x34e00534200502d02834f00534e00502807b02802834e005028007028341", - "0x32c02834a00534e00534a00508102800700534e005007005346028342005", - "0x281a000534e0051a000500b02803c00c03303134e00534a34f00734200a", - "0x3600507f02802834e00502800702804000538503600534e00703c005083", - "0x2822622400734e00522200503c02822200534e00502834902802834e005", - "0x34e00522a00522202822a00534e00522600504002802834e005224005036", - "0x2d0281a000534e0051a000500b02804600534e005230005224028230005", - "0x34e0050460050c002800c00534e00500c00534602803300534e005033005", - "0x34e00504000502302802834e00502800702804600c0331a000a005046005", - "0x34602803300534e00503300502d0281a000534e0051a000500b028048005", - "0x4800c0331a000a00504800534e0050480050c002800c00534e00500c005", - "0x4700534e00502834902802834e00534a00507c02802834e005028007028", - "0x4504700702002804500534e00504500501802804500534e005028230028", - "0x23d00534e00523723a00734702823a00534e00502834802823700534e005", - "0x34100502d02803200534e00503200500b02823e00534e00523d005023028", - "0x23e00534e00523e0050c002800700534e00500700534602834100534e005", - "0x2802834e00503000534b02802834e00502800702823e00734103200a005", - "0x2802834e00502800702802838600502801302824100534e00534900500b", - "0x534e00500a00500b02802834e00503000534b02802834e00501b005048", - "0x534e00502804702824300534e00502834902802834e00502834c028241", - "0x34802824700534e00524624300702002824600534e005246005018028246", - "0x34e00524b00502302824b00534e00524724a00734702824a00534e005028", - "0x34602800b00534e00500b00502d02824100534e00524100500b02824c005", - "0x24c00700b24100a00524c00534e00524c0050c002800700534e005007005", - "0x25800534e00502834902802834e00503100504502802834e005028007028", - "0x25a25800702002825a00534e00525a00501802825a00534e005028230028", - "0x5d00534e00505200900734702800900534e00502834802805200534e005", - "0x5000502d02805100534e00505100500b02805a00534e00505d005023028", - "0x5a00534e00505a0050c002800700534e00500700534602805000534e005", - "0x5000534e00502824102800b00534e00502806202805a00705005100a005", - "0x734e00700502800700502802834e00502802802802834e005028243028", - "0x1300534e00503100503102802834e00502800702804e04f00738701000f", - "0x34e00701300505102800f00534e00500f00500b02802834e00502800a028", - "0x1700534e00504d00524a02802834e00502800702803000538804d014007", - "0x502801302834c00534e00501700524b02801800534e00501400504f028", - "0x534b00524c02834b00534e00502801402802834e005028007028028389", - "0x2834c00534e00501b00524b02801800534e00503000504f02801b00534e", - "0x1c00505002802834e00502800702834a00538a01c00534e00734c005258", - "0x534e00505100500f02805100534e00505105000724602805100534e005", - "0x2834e00502800702834800538b02001f00734e00734900f00732a028349", - "0x2d00538c02334700734e00701800505102801f00534e00501f00500b028", - "0x34e00534700504f02834600534e00502300524a02802834e005028007028", - "0x502800702802838d00502801302808600534e00534600524b0280c0005", - "0x504f0281a000534e00534400524c02834400534e00502801402802834e", - "0x534e00708600525802808600534e0051a000524b0280c000534e00502d", - "0x34902834100534e00534200505002802834e00502800702803200538e342", - "0x534e00534100500f02803300534e0050c000504002834f00534e005028", - "0x525a02801000534e00501000502d02801f00534e00501f00500b02800c", - "0x534e00500c00501802834f00534e00534f00522602803300534e005033", - "0x704000500902804003603c03134e00500c34f03301001f00b05202800c", - "0x22600734e00522200505d02802834e00502800702822400538f22200534e", - "0x3102802834e00502800702823000539000a00534e00722a00505a02822a", - "0x534e00500a00b00706102802834e00502800a02804600534e005226005", - "0x2802834e00502800702804500539104704800734e00704600505102800a", - "0x523700524b02823a00534e00504800504f02823700534e00504700524a", - "0x34e00502801402802834e00502800702802839200502801302823d00534e", - "0x24b02823a00534e00504500504f02824100534e00523e00524c02823e005", - "0x2800702824600539324300534e00723d00525802823d00534e005241005", - "0x2834902824700534e00524300505002802834e00502834c02802834e005", - "0x24c00534e00524700500f02824b00534e00523a00504002824a00534e005", - "0x24b00525a02803600534e00503600502d02803c00534e00503c00500b028", - "0x24c00534e00524c00501802824a00534e00524a00522602824b00534e005", - "0x34e00705200500902805225a25803134e00524c24a24b03603c00b052028", - "0x5b05a00734e00500900505d02802834e00502800702805d005394009005", - "0x503102802834e00502800702829b00539505e00534e00705b00505a028", - "0x280070280620053960602e800734e0072a90050510282a900534e00505a", - "0x503602802834e00506000501b02802834e0052e800534b02802834e005", - "0x34902802834e00505e00503602802834e00502000532902802834e00500a", - "0x5f00534e00505f00501802805f00534e00502801f02806100534e005028", - "0x32600734702832600534e00502834802831800534e00505f061007020028", - "0x534e00525800500b02806900534e00504200502302804200534e005318", - "0x50c002800700534e00500700534602825a00534e00525a00502d028258", - "0x534b02802834e00502800702806900725a25800a00506900534e005069", - "0x2833200534e00533200534402833200534e00502808602802834e005062", - "0x2834e00502800702807100600739706a06b00734e00733225a2580311a0", - "0x33100503602807633100734e00505e00503c02807300534e005028328028", - "0x2802834e00507700532902807907700734e00502000532702802834e005", - "0x506b00500b02802834e00533000503602832f33000734e00500a00503c", - "0x2800700534e00500700534602806a00534e00506a00502d02806b00534e", - "0x507900532502807600534e00507600504f02807300534e005073005325", - "0x7907607300706a06b05032402832f00534e00532f00504f02807900534e", - "0x2808300539832c00534e00708100532002808107b07c04300a34e00532f", - "0x2807f00534e00502834902802834e00532c00508e02802834e005028007", - "0x532900504002802834e00532a00503602832932a00734e00507f00503c", - "0x2832500534e00532700522402832700534e00532800522202832800534e", - "0x507b00534602807c00534e00507c00502d02804300534e00504300500b", - "0x2800702832507b07c04300a00532500534e0053250050c002807b00534e", - "0x2804300534e00504300500b02832400534e00508300502302802834e005", - "0x53240050c002807b00534e00507b00534602807c00534e00507c00502d", - "0x500a00503602802834e00502800702832407b07c04300a00532400534e", - "0x502834902802834e00505e00503602802834e00502000532902802834e", - "0x2002808e00534e00508e00501802808e00534e00502823002832000534e", - "0x531f31e00734702831e00534e00502834802831f00534e00508e320007", - "0x2800600534e00500600500b02831d00534e00508c00502302808c00534e", - "0x531d0050c002800700534e00500700534602807100534e00507100502d", - "0x529b00504802802834e00502800702831d00707100600a00531d00534e", - "0x5a00504502802834e00502000532902802834e00500a00503602802834e", - "0x2808a00534e00525a00502d02831c00534e00525800500b02802834e005", - "0x32902802834e00500a00503602802834e005028007028028399005028013", - "0x534e00525800500b02831b00534e00505d00502302802834e005020005", - "0x50c002800700534e00500700534602825a00534e00525a00502d028258", - "0x2834c02802834e00502800702831b00725a25800a00531b00534e00531b", - "0x532902802834e00500a00503602802834e00524600504802802834e005", - "0x2831c00534e00503c00500b02802834e00523a00534b02802834e005020", - "0x534e00502829b02831a00534e00502834902808a00534e00503600502d", - "0x34802808800534e00531931a00702002831900534e005319005018028319", - "0x34e00536c00502302836c00534e00508809000734702809000534e005028", - "0x34602808a00534e00508a00502d02831c00534e00531c00500b028315005", - "0x31500708a31c00a00531500534e0053150050c002800700534e005007005", - "0x2834e00522600504502802834e00523000504802802834e005028007028", - "0x34e00503c00500b02802834e00500b00532f02802834e005020005329028", - "0x502800702802839a00502801302831300534e00503600502d028314005", - "0x22400502302802834e00502000532902802834e00500b00532f02802834e", - "0x3600534e00503600502d02803c00534e00503c00500b02831200534e005", - "0x3603c00a00531200534e0053120050c002800700534e005007005346028", - "0x34e00503200504802802834e00502834c02802834e005028007028312007", - "0x50c000534b02802834e00502000532902802834e00500b00532f028028", - "0x34902831300534e00501000502d02831400534e00501f00500b02802834e", - "0x31000534e00531000501802831000534e00502804602831100534e005028", - "0x30f00734702830f00534e00502834802808d00534e005310311007020028", - "0x534e00531400500b02830d00534e00530e00502302830e00534e00508d", - "0x50c002800700534e00500700534602831300534e00531300502d028314", - "0x532f02802834e00502800702830d00731331400a00530d00534e00530d", - "0x2830c00534e00534800500b02802834e00501800534b02802834e00500b", - "0x32f02802834e00534a00504802802834e00502800702802839b005028013", - "0x2802834e0050500052a902802834e00501800534b02802834e00500b005", - "0x30b00534e00502834902802834e00502834c02830c00534e00500f00500b", - "0x30830b00702002830800534e00530800501802830800534e005028047028", - "0x9600534e00508709400734702809400534e00502834802808700534e005", - "0x1000502d02830c00534e00530c00500b02830700534e005096005023028", - "0x30700534e0053070050c002800700534e00500700534602801000534e005", - "0x2802834e00500b00532f02802834e00502800702830700701030c00a005", - "0x9900534e00502834902802834e0050500052a902802834e005031005045", - "0x30609900702002830600534e00530600501802830600534e005028230028", - "0x30400534e00509730500734702830500534e00502834802809700534e005", - "0x4e00502d02804f00534e00504f00500b02830200534e005304005023028", - "0x30200534e0053020050c002800700534e00500700534602804e00534e005", - "0x734e00700502800700502802834e00502802802830200704e04f00a005", - "0xf00534e00503100503102802834e00502800702805005100739c00b00a", - "0x34e00700f00505102800a00534e00500a00500b02802834e00502800a028", - "0x1300534e00504f00505002802834e00502800702804e00539d04f010007", - "0x1000504f02804d00534e00501400501002801400534e00501300500f028", - "0x702802839e00502801302801700534e00504d00504e02803000534e005", - "0x2834c00534e00501800504d02801800534e00502801402802834e005028", - "0x701700503002801700534e00534c00504e02803000534e00504e00504f", - "0x734e00734b00a00724702802834e00502800702801b00539f34b00534e", - "0x2801c00534e00501c00500b02802834e0050280070283490053a034a01c", - "0x505002802834e0050280070283480053a102001f00734e007030005051", - "0x534e00502300501002802300534e00534700500f02834700534e005020", - "0x280130280c000534e00502d00504e02834600534e00501f00504f02802d", - "0x8600504d02808600534e00502801402802834e0050280070280283a2005", - "0xc000534e00534400504e02834600534e00534800504f02834400534e005", - "0x704302802834e0050280070283420053a31a000534e0070c0005030028", - "0x3200500b02802834e00502800702834f0053a434103200734e0071a001c", - "0x502800702803c0053a500c03300734e00734600505102803200534e005", - "0x500c00501b02802834e00503300534b02802834e00502834c02802834e", - "0x502834902802834e00534a00505b02802834e00534100507c02802834e", - "0x2002804000534e00504000501802804000534e00502801f02803600534e", - "0x522222400734702822400534e00502834802822200534e005040036007", - "0x2803200534e00503200500b02822a00534e00522600502302822600534e", - "0x522a0050c002800700534e00500700534602800b00534e00500b00502d", - "0x503c00534b02802834e00502800702822a00700b03200a00522a00534e", - "0x311a002823000534e00523000534402823000534e00502808602802834e", - "0xb02802834e0050280070280450470073a604804600734e00723000b032", - "0x313a723d23a23703134e00734a00704803131f02804600534e005046005", - "0x531e02824600534e00523d00531e02802834e00502800702824324123e", - "0x34e00524724600708c02824600534e00524600501802824700534e005341", - "0x34602823700534e00523700502d02824a00534e00524a00501802824a005", - "0x502800702824b0053a802834e00724a00531d02823a00534e00523a005", - "0x524c00503c02824c00534e00502834902802834e00502834c02802834e", - "0x2805200534e00525a00504002802834e00525800503602825a25800734e", - "0x504600500b02805d00534e00500900522402800900534e005052005222", - "0x2823a00534e00523a00534602823700534e00523700502d02804600534e", - "0x2802834e00502800702805d23a23704600a00505d00534e00505d0050c0", - "0x5b00534e00502808a02805a00534e00502834902802834e00524b00531c", - "0x502d02805e00534e00505b05a00702002805b00534e00505b005018028", - "0x534e00505e0052260282a900534e00523a00534602829b00534e005237", - "0x2834e00534100507c02802834e0050280070280283a90050280130282e8", - "0x2430052260282a900534e00524100534602829b00534e00523e00502d028", - "0x734702806000534e00502834802802834e00502834c0282e800534e005", - "0x34e00504600500b02806100534e00506200502302806200534e0052e8060", - "0xc00282a900534e0052a900534602829b00534e00529b00502d028046005", - "0x34c02802834e0050280070280612a929b04600a00506100534e005061005", - "0x34902802834e00534a00505b02802834e00534100507c02802834e005028", - "0x31800534e00531800501802831800534e00502823002805f00534e005028", - "0x4200734702804200534e00502834802832600534e00531805f007020028", - "0x534e00504700500b02833200534e00506900502302806900534e005326", - "0x50c002800700534e00500700534602804500534e00504500502d028047", - "0x534b02802834e00502800702833200704504700a00533200534e005332", - "0x2806b00534e00534f00500b02802834e00534a00505b02802834e005346", - "0x34b02802834e00534200504802802834e0050280070280283aa005028013", - "0x6b00534e00501c00500b02802834e00534a00505b02802834e005346005", - "0x600534e00502804602806a00534e00502834902802834e00502834c028", - "0x2834802807100534e00500606a00702002800600534e005006005018028", - "0x534e00533100502302833100534e00507107300734702807300534e005", - "0x534602800b00534e00500b00502d02806b00534e00506b00500b028076", - "0x2807600700b06b00a00507600534e0050760050c002800700534e005007", - "0x7700534e00534900500b02802834e00503000534b02802834e005028007", - "0x2802834e00501b00504802802834e0050280070280283ab005028013028", - "0x2834e00502834c02807700534e00500a00500b02802834e00503000534b", - "0x34e00533000501802833000534e00502804702807900534e005028349028", - "0x34702804300534e00502834802832f00534e005330079007020028330005", - "0x507700500b02807b00534e00507c00502302807c00534e00532f043007", - "0x2800700534e00500700534602800b00534e00500b00502d02807700534e", - "0x2802834e00502800702807b00700b07700a00507b00534e00507b0050c0", - "0x32c00534e00502823002808100534e00502834902802834e005031005045", - "0x2834802808300534e00532c08100702002832c00534e00532c005018028", - "0x534e00532a00502302832a00534e00508307f00734702807f00534e005", - "0x534602805000534e00505000502d02805100534e00505100500b028329", - "0x2832900705005100a00532900534e0053290050c002800700534e005007", - "0x280500510073ac00b00a00734e00700502800700502802834e005028028", - "0x2802834e00502800a02800f00534e00503100503102802834e005028007", - "0x2804e0053ad04f01000734e00700f00505102800a00534e00500a00500b", - "0x534e00501000504f02801300534e00504f00524a02802834e005028007", - "0x34e0050280070280283ae00502801302804d00534e00501300524b028014", - "0x4e00504f02801700534e00503000524c02803000534e005028014028028", - "0x1800534e00704d00525802804d00534e00501700524b02801400534e005", - "0x500f02834b00534e00501800505002802834e00502800702834c0053af", - "0x34e00701b00a00732a02801b00534e00501b00501802801b00534e00534b", - "0x1c00534e00501c00500b02802834e0050280070283490053b034a01c007", - "0x34c02802834e0050280070283480053b102001f00734e007014005051028", - "0x32902802834e00502000501b02802834e00501f00534b02802834e005028", - "0x2802300534e00502801f02834700534e00502834902802834e00534a005", - "0x502834802802d00534e00502334700702002802300534e005023005018", - "0x8600534e0050c00050230280c000534e00502d34600734702834600534e", - "0x700534602800b00534e00500b00502d02801c00534e00501c00500b028", - "0x702808600700b01c00a00508600534e0050860050c002800700534e005", - "0x2808602802834e00534800534b02802834e00502834c02802834e005028", - "0x34e00734400b01c0311a002834400534e00534400534402834400534e005", - "0x534e0051a000500b02802834e0050280070283410320073b23421a0007", - "0x702804003603c0313b300c03334f03134e00734a00734203131b0281a0", - "0x2800c00534e00500c00501802822200534e00502834902802834e005028", - "0x503602822a22600734e00522400503c02822400534e00500c222007020", - "0x4600534e00523000522202823000534e00522a00504002802834e005226", - "0x34f00502d0281a000534e0051a000500b02804800534e005046005224028", - "0x4800534e0050480050c002803300534e00503300534602834f00534e005", - "0x2804700534e00502834802802834e00502800702804803334f1a000a005", - "0x1a000500b02823700534e00504500502302804500534e005040047007347", - "0x3600534e00503600534602803c00534e00503c00502d0281a000534e005", - "0x2834e00502800702823703603c1a000a00523700534e0052370050c0028", - "0x534e00502823002823a00534e00502834902802834e00534a005329028", - "0x34802823e00534e00523d23a00702002823d00534e00523d00501802823d", - "0x34e00524300502302824300534e00523e24100734702824100534e005028", - "0x34602834100534e00534100502d02803200534e00503200500b028246005", - "0x24600734103200a00524600534e0052460050c002800700534e005007005", - "0x534e00534900500b02802834e00501400534b02802834e005028007028", - "0x2834e00534c00504802802834e0050280070280283b4005028013028247", - "0x34e00502834c02824700534e00500a00500b02802834e00501400534b028", - "0x524b00501802824b00534e00502804702824a00534e005028349028028", - "0x2825800534e00502834802824c00534e00524b24a00702002824b00534e", - "0x24700500b02805200534e00525a00502302825a00534e00524c258007347", - "0x700534e00500700534602800b00534e00500b00502d02824700534e005", - "0x2834e00502800702805200700b24700a00505200534e0050520050c0028", - "0x534e00502823002800900534e00502834902802834e005031005045028", - "0x34802805a00534e00505d00900702002805d00534e00505d00501802805d", - "0x34e00505e00502302805e00534e00505a05b00734702805b00534e005028", - "0x34602805000534e00505000502d02805100534e00505100500b02829b005", - "0x29b00705005100a00529b00534e00529b0050c002800700534e005007005", - "0x2802834e00502802802802834e00502824302800b00534e00502831a028", - "0x2802834e00502800702801000f0073b505005100734e007005028007005", - "0x3105100731902803100534e00503100525a02805100534e00505100500b", - "0x280070280140053b600a00534e00701300508802801304e04f03134e005", - "0x2805000534e00505000502d02804f00534e00504f00500b02802834e005", - "0x4f03136c02800a00534e00500a00b00709002804e00534e00504e00525a", - "0x2834c0053b701800534e00701700531502801703004d03134e00504e050", - "0x34e00701b00531302801b34b00734e00501800531402802834e005028007", - "0x2834900534e00534b00503102802834e00502800702834a0053b801c005", - "0x505002802834e0050280070283480053b902001f00734e007349005051", - "0x534e00534700501802801f00534e00501f00504f02834700534e005020", - "0x2802834e0050280070283460053ba02d02300734e00701f005051028347", - "0x50c000501802802300534e00502300504f0280c000534e00502d005050", - "0x34e0050280070281a00053bb34408600734e0070230050510280c000534e", - "0x501802808600534e00508600504f02834200534e005344005050028028", - "0x2800702834f0053bc34103200734e00708600505102834200534e005342", - "0x501c02802834e00534100501b02802834e00503200534b02802834e005", - "0x31102802834e00501c00531202802834e0050c000501c02802834e005342", - "0x2803300534e00502834902802834e00534700501c02802834e00500a005", - "0x500c03300702002800c00534e00500c00501802800c00534e00502801f", - "0x2804000534e00503c03600734702803600534e00502834802803c00534e", - "0x503000502d02804d00534e00504d00500b02822200534e005040005023", - "0x522200534e0052220050c002800700534e00500700534602803000534e", - "0x8602802834e00534f00534b02802834e00502800702822200703004d00a", - "0x722403004d0311a002822400534e00522400534402822400534e005028", - "0x34e00534700500f02802834e0050280070280462300073bd22a22600734e", - "0x7b02804500534e00534200500f02804700534e0050c000500f028048005", - "0x34e00523a00508d02823d23a00734e00523700531002823700534e005028", - "0x534602822a00534e00522a00502d02822600534e00522600500b028028", - "0x534e00501c00530e02800a00534e00500a00530f02800700534e005007", - "0x501802804700534e00504700501802804800534e00504800501802801c", - "0xa34e00504504704801c00a23d00722a22601030d02804500534e005045", - "0x34e00502800702824a0053be24700534e00724600530c02824624324123e", - "0x524b00503c02824b00534e00502834902802834e00524700530b028028", - "0x2825a00534e00525800504002802834e00524c00503602825824c00734e", - "0x523e00500b02800900534e00505200522402805200534e00525a005222", - "0x2824300534e00524300534602824100534e00524100502d02823e00534e", - "0x2802834e00502800702800924324123e00a00500900534e0050090050c0", - "0x524100502d02823e00534e00523e00500b02805d00534e00524a005023", - "0x505d00534e00505d0050c002824300534e00524300534602824100534e", - "0x1c02802834e00534200501c02802834e00502800702805d24324123e00a", - "0x2802834e00500a00531102802834e00501c00531202802834e0050c0005", - "0x5b00534e00502823002805a00534e00502834902802834e00534700501c", - "0x2834802805e00534e00505b05a00702002805b00534e00505b005018028", - "0x534e0052a90050230282a900534e00505e29b00734702829b00534e005", - "0x534602804600534e00504600502d02823000534e00523000500b0282e8", - "0x282e800704623000a0052e800534e0052e80050c002800700534e005007", - "0x2802834e00534700501c02802834e0051a000534b02802834e005028007", - "0x2834e00500a00531102802834e00501c00531202802834e0050c000501c", - "0x34e00506200501802806200534e00502807902806000534e005028349028", - "0x34702805f00534e00502834802806100534e005062060007020028062005", - "0x504d00500b02832600534e00531800502302831800534e00506105f007", - "0x2800700534e00500700534602803000534e00503000502d02804d00534e", - "0x2802834e00502800702832600703004d00a00532600534e0053260050c0", - "0x2834e00500a00531102802834e00534700501c02802834e00534600534b", - "0x534e00502833002804200534e00502834902802834e00501c005312028", - "0x34802833200534e00506904200702002806900534e005069005018028069", - "0x34e00506a00502302806a00534e00533206b00734702806b00534e005028", - "0x34602803000534e00503000502d02804d00534e00504d00500b028006005", - "0x600703004d00a00500600534e0050060050c002800700534e005007005", - "0x2834e00501c00531202802834e00534800534b02802834e005028007028", - "0x534e00502829b02807100534e00502834902802834e00500a005311028", - "0x34802833100534e00507307100702002807300534e005073005018028073", - "0x34e00507700502302807700534e00533107600734702807600534e005028", - "0x34602803000534e00503000502d02804d00534e00504d00500b028079005", - "0x7900703004d00a00507900534e0050790050c002800700534e005007005", - "0x2834e00534b00504502802834e00534a00504802802834e005028007028", - "0x534e00502804602833000534e00502834902802834e00500a005311028", - "0x34802804300534e00532f33000702002832f00534e00532f00501802832f", - "0x34e00507b00502302807b00534e00504307c00734702807c00534e005028", - "0x34602803000534e00503000502d02804d00534e00504d00500b028081005", - "0x8100703004d00a00508100534e0050810050c002800700534e005007005", - "0x534e00534c00502302802834e00500a00531102802834e005028007028", - "0x534602803000534e00503000502d02804d00534e00504d00500b02832c", - "0x2832c00703004d00a00532c00534e00532c0050c002800700534e005007", - "0x2802834e00504e00504502802834e00501400504802802834e005028007", - "0x7f00534e00502804702808300534e00502834902802834e00500b005308", - "0x2834802832a00534e00507f08300702002807f00534e00507f005018028", - "0x534e00532800502302832800534e00532a32900734702832900534e005", - "0x534602805000534e00505000502d02804f00534e00504f00500b028327", - "0x2832700705004f00a00532700534e0053270050c002800700534e005007", - "0x2802834e00500b00530802802834e00503100504502802834e005028007", - "0x534e00532400501802832400534e00502823002832500534e005028349", - "0x734702808e00534e00502834802832000534e005324325007020028324", - "0x34e00500f00500b02831e00534e00531f00502302831f00534e00532008e", - "0xc002800700534e00500700534602801000534e00501000502d02800f005", - "0x2800b00534e00502824102831e00701000f00a00531e00534e00531e005", - "0x502802834e00502802802802834e00502824302805000534e005028241", - "0x3102802834e00502800702804e04f0073bf01000f00734e007005028007", - "0xf00534e00500f00500b02802834e00502800a02801300534e005031005", - "0x5002802834e0050280070280300053c004d01400734e007013005051028", - "0x34e00501800501002801800534e00501700500f02801700534e00504d005", - "0x1302801b00534e00534c00504e02834b00534e00501400504f02834c005", - "0x504d02801c00534e00502801402802834e0050280070280283c1005028", - "0x534e00534a00504e02834b00534e00503000504f02834a00534e00501c", - "0x24602802834e0050280070283490053c200a00534e00701b00503002801b", - "0x3480053c302001f00734e00700a00f00704302800a00534e00500a00b007", - "0x34e00734b00505102801f00534e00501f00500b02802834e005028007028", - "0x5100534e00502300505002802834e00502800702802d0053c4023347007", - "0x504f02834600534e00505100500f02805100534e005051050007246028", - "0x280070283440053c50860c000734e00734700505102834700534e005347", - "0x2834200534e0050c000504f0281a000534e00508600524a02802834e005", - "0x2802834e0050280070280283c600502801302803200534e0051a000524b", - "0x34e00534400504f02834f00534e00534100524c02834100534e005028014", - "0x53c703300534e00703200525802803200534e00534f00524b028342005", - "0x534e00503300505002802834e00502834c02802834e00502800702800c", - "0x3c00500f02804000534e00534200504002803600534e00502834902803c", - "0x1000534e00501000502d02801f00534e00501f00500b02822200534e005", - "0x22200501802803600534e00503600522602804000534e00504000525a028", - "0x902822a22622403134e00522203604001001f00b05202822200534e005", - "0x523000505d02802834e0050280070280460053c823000534e00722a005", - "0x34e0050280070282370053c904500534e00704700505a02804704800734e", - "0x53ca23e23d00734e00723a00505102823a00534e005048005031028028", - "0x34e00523e00501b02802834e00523d00534b02802834e005028007028241", - "0x502000507c02802834e00534600501c02802834e005045005036028028", - "0x24600501802824600534e00502801f02824300534e00502834902802834e", - "0x24a00534e00502834802824700534e00524624300702002824600534e005", - "0x500b02824c00534e00524b00502302824b00534e00524724a007347028", - "0x534e00500700534602822600534e00522600502d02822400534e005224", - "0x34e00502800702824c00722622400a00524c00534e00524c0050c0028007", - "0x525800534402825800534e00502808602802834e00524100534b028028", - "0x702805d0090073cb05225a00734e0072582262240311a002825800534e", - "0x2834e00505a00503602805b05a00734e00504500503c02802834e005028", - "0x5200b08702825a00534e00525a00500b02805e00534e00505b005040028", - "0x34e0050280070280610620600313cc2e82a929b03134e00705e346020007", - "0x500b02831800534e00505f00522402805f00534e0052e8005222028028", - "0x534e0052a900534602829b00534e00529b00502d02825a00534e00525a", - "0x34e0050280070283182a929b25a00a00531800534e0053180050c00282a9", - "0x502302804200534e00506132600734702832600534e005028348028028", - "0x534e00506000502d02825a00534e00525a00500b02806900534e005042", - "0x25a00a00506900534e0050690050c002806200534e005062005346028060", - "0x34600501c02802834e00504500503602802834e005028007028069062060", - "0x2823002833200534e00502834902802834e00502000507c02802834e005", - "0x534e00506b33200702002806b00534e00506b00501802806b00534e005", - "0x502302807100534e00506a00600734702800600534e00502834802806a", - "0x534e00505d00502d02800900534e00500900500b02807300534e005071", - "0x900a00507300534e0050730050c002800700534e00500700534602805d", - "0x4800504502802834e00523700504802802834e00502800702807300705d", - "0x500b02802834e00502000507c02802834e00534600501c02802834e005", - "0x280283cd00502801302807600534e00522600502d02833100534e005224", - "0x2802834e00534600501c02802834e00502000507c02802834e005028007", - "0x522600502d02822400534e00522400500b02807700534e005046005023", - "0x507700534e0050770050c002800700534e00500700534602822600534e", - "0x504802802834e00502834c02802834e00502800702807700722622400a", - "0x34b02802834e00534600501c02802834e00502000507c02802834e00500c", - "0x534e00501000502d02833100534e00501f00500b02802834e005342005", - "0x533000501802833000534e00502829b02807900534e005028349028076", - "0x2804300534e00502834802832f00534e00533007900702002833000534e", - "0x33100500b02807b00534e00507c00502302807c00534e00532f043007347", - "0x700534e00500700534602807600534e00507600502d02833100534e005", - "0x2834e00502800702807b00707633100a00507b00534e00507b0050c0028", - "0x2834e00502000507c02802834e00502d00534b02802834e00502834c028", - "0x534e00502804602808100534e00502834902802834e0050500052a9028", - "0x34802808300534e00532c08100702002832c00534e00532c00501802832c", - "0x34e00532a00502302832a00534e00508307f00734702807f00534e005028", - "0x34602801000534e00501000502d02801f00534e00501f00500b028329005", - "0x32900701001f00a00532900534e0053290050c002800700534e005007005", - "0x2834e00534b00534b02802834e0050500052a902802834e005028007028", - "0x2834e0050280070280283ce00502801302832800534e00534800500b028", - "0x34e00534b00534b02802834e0050500052a902802834e005349005048028", - "0x502834c02832800534e00500f00500b02802834e00500b0052a9028028", - "0x32500501802832500534e00502804702832700534e00502834902802834e", - "0x32000534e00502834802832400534e00532532700702002832500534e005", - "0x500b02831f00534e00508e00502302808e00534e005324320007347028", - "0x534e00500700534602801000534e00501000502d02832800534e005328", - "0x34e00502800702831f00701032800a00531f00534e00531f0050c0028007", - "0x500b0052a902802834e0050500052a902802834e005031005045028028", - "0x8c00501802808c00534e00502823002831e00534e00502834902802834e", - "0x31c00534e00502834802831d00534e00508c31e00702002808c00534e005", - "0x500b02831b00534e00508a00502302808a00534e00531d31c007347028", - "0x534e00500700534602804e00534e00504e00502d02804f00534e00504f", - "0x34e00502802802831b00704e04f00a00531b00534e00531b0050c0028007", - "0x34e0050280070280500510073cf00b00a00734e007005028007005028028", - "0x500a00500b02802834e00502800a02800f00534e005031005031028028", - "0x34e00502800702804e0053d004f01000734e00700f00505102800a00534e", - "0x501002801400534e00501300500f02801300534e00504f005050028028", - "0x534e00504d00504e02803000534e00501000504f02804d00534e005014", - "0x1800534e00502801402802834e0050280070280283d1005028013028017", - "0x34c00504e02803000534e00504e00504f02834c00534e00501800504d028", - "0x34e00502800702801b0053d234b00534e00701700503002801700534e005", - "0x2834e0050280070283490053d334a01c00734e00734b00a007043028028", - "0x3480053d402001f00734e00703000505102801c00534e00501c00500b028", - "0x34e00501f00504f02834700534e00502000505002802834e005028007028", - "0x3d502d02300734e00701f00505102834700534e00534700501802801f005", - "0x2300504f0280c000534e00502d00505002802834e005028007028346005", - "0x8600734e0070230050510280c000534e0050c000501802802300534e005", - "0x4f02834200534e00534400505002802834e0050280070281a00053d6344", - "0x34e00708600505102834200534e00534200501802808600534e005086005", - "0x3300534e00534100505002802834e00502800702834f0053d7341032007", - "0x3200505102803300534e00503300501802803200534e00503200504f028", - "0x2834e00502834c02802834e0050280070280360053d803c00c00734e007", - "0x34e00534700501c02802834e00503c00501b02802834e00500c00534b028", - "0x50c000501c02802834e00534200501c02802834e00503300501c028028", - "0x502801f02804000534e00502834902802834e00534a00507c02802834e", - "0x22400534e00522204000702002822200534e00522200501802822200534e", - "0x22a00502302822a00534e00522422600734702822600534e005028348028", - "0xb00534e00500b00502d02801c00534e00501c00500b02823000534e005", - "0xb01c00a00523000534e0052300050c002800700534e005007005346028", - "0x34e00503600534b02802834e00502834c02802834e005028007028230007", - "0x1c0311a002804600534e00504600534402804600534e005028086028028", - "0x500f02802834e0050280070282370450073d904704800734e00704600b", - "0x534e00534200500f02823d00534e0050c000500f02823a00534e005347", - "0x24300531002824300534e00502807b02824100534e00503300500f02823e", - "0x4700534e00504700502d02802834e00524600508d02824724600734e005", - "0x23a00501802834a00534e00534a00508102800700534e005007005346028", - "0x23e00534e00523e00501802823d00534e00523d00501802823a00534e005", - "0x524123e23d23a34a24700704700f09402824100534e005241005018028", - "0x534e00524a00502d02804800534e00504800500b02824c24b24a03134e", - "0x4800a00524c00534e00524c0050c002824b00534e00524b00534602824a", - "0x3300501c02802834e00534700501c02802834e00502800702824c24b24a", - "0x507c02802834e0050c000501c02802834e00534200501c02802834e005", - "0x1802825a00534e00502823002825800534e00502834902802834e00534a", - "0x34e00502834802805200534e00525a25800702002825a00534e00525a005", - "0x2805a00534e00505d00502302805d00534e005052009007347028009005", - "0x500700534602823700534e00523700502d02804500534e00504500500b", - "0x2800702805a00723704500a00505a00534e00505a0050c002800700534e", - "0x34700501c02802834e00534f00534b02802834e00502834c02802834e005", - "0x501c02802834e00534200501c02802834e00534a00507c02802834e005", - "0x1802805e00534e00502807902805b00534e00502834902802834e0050c0", - "0x34e00502834802829b00534e00505e05b00702002805e00534e00505e005", - "0x2806000534e0052e80050230282e800534e00529b2a90073470282a9005", - "0x500700534602800b00534e00500b00502d02801c00534e00501c00500b", - "0x2800702806000700b01c00a00506000534e0050600050c002800700534e", - "0x34700501c02802834e0051a000534b02802834e00502834c02802834e005", - "0x2834902802834e0050c000501c02802834e00534a00507c02802834e005", - "0x2806100534e00506100501802806100534e00502833002806200534e005", - "0x5f31800734702831800534e00502834802805f00534e005061062007020", - "0x1c00534e00501c00500b02804200534e00532600502302832600534e005", - "0x420050c002800700534e00500700534602800b00534e00500b00502d028", - "0x502834c02802834e00502800702804200700b01c00a00504200534e005", - "0x34a00507c02802834e00534700501c02802834e00534600534b02802834e", - "0x501802833200534e00502829b02806900534e00502834902802834e005", - "0x534e00502834802806b00534e00533206900702002833200534e005332", - "0xb02807100534e00500600502302800600534e00506b06a00734702806a", - "0x34e00500700534602800b00534e00500b00502d02801c00534e00501c005", - "0x502800702807100700b01c00a00507100534e0050710050c0028007005", - "0x534a00507c02802834e00534800534b02802834e00502834c02802834e", - "0x33100501802833100534e00502804602807300534e00502834902802834e", - "0x7700534e00502834802807600534e00533107300702002833100534e005", - "0x500b02833000534e00507900502302807900534e005076077007347028", - "0x534e00500700534602800b00534e00500b00502d02801c00534e00501c", - "0x34e00502800702833000700b01c00a00533000534e0053300050c0028007", - "0x502801302832f00534e00534900500b02802834e00503000534b028028", - "0x503000534b02802834e00501b00504802802834e0050280070280283da", - "0x502834902802834e00502834c02832f00534e00500a00500b02802834e", - "0x2002807c00534e00507c00501802807c00534e00502804702804300534e", - "0x507b08100734702808100534e00502834802807b00534e00507c043007", - "0x2832f00534e00532f00500b02808300534e00532c00502302832c00534e", - "0x50830050c002800700534e00500700534602800b00534e00500b00502d", - "0x503100504502802834e00502800702808300700b32f00a00508300534e", - "0x32a00501802832a00534e00502823002807f00534e00502834902802834e", - "0x32800534e00502834802832900534e00532a07f00702002832a00534e005", - "0x500b02832500534e00532700502302832700534e005329328007347028", - "0x534e00500700534602805000534e00505000502d02805100534e005051", - "0x34e00502802802832500705005100a00532500534e0053250050c0028007", - "0x34e0050280070280500510073db00b00a00734e007005028007005028028", - "0x500a00500b02802834e00502800a02800f00534e005031005031028028", - "0x34e00502800702804e0053dc04f01000734e00700f00505102800a00534e", - "0x501002801400534e00501300500f02801300534e00504f005050028028", - "0x534e00504d00504e02803000534e00501000504f02804d00534e005014", - "0x1800534e00502801402802834e0050280070280283dd005028013028017", - "0x34c00504e02803000534e00504e00504f02834c00534e00501800504d028", - "0x34e00502800702801b0053de34b00534e00701700503002801700534e005", - "0x2834e0050280070283490053df34a01c00734e00734b00a007043028028", - "0x3480053e002001f00734e00703000505102801c00534e00501c00500b028", - "0x2802834e00501f00534b02802834e00502834c02802834e005028007028", - "0x34700534e00502834902802834e00534a00507c02802834e00502000501b", - "0x2334700702002802300534e00502300501802802300534e00502801f028", - "0xc000534e00502d34600734702834600534e00502834802802d00534e005", - "0xb00502d02801c00534e00501c00500b02808600534e0050c0005023028", - "0x8600534e0050860050c002800700534e00500700534602800b00534e005", - "0x34b02802834e00502834c02802834e00502800702808600700b01c00a005", - "0x34400534e00534400534402834400534e00502808602802834e005348005", - "0x34e0050280070283410320073e13421a000734e00734400b01c0311a0028", - "0x3334f00734e00734a0073420310960281a000534e0051a000500b028028", - "0x3c02804000534e00502834902802834e00502800702803603c00c0313e2", - "0x34e00522400504002802834e00522200503602822422200734e005040005", - "0xb02823000534e00522a00522402822a00534e005226005222028226005", - "0x34e00503300534602834f00534e00534f00502d0281a000534e0051a0005", - "0x502800702823003334f1a000a00523000534e0052300050c0028033005", - "0x2302804800534e00503604600734702804600534e00502834802802834e", - "0x34e00500c00502d0281a000534e0051a000500b02804700534e005048005", - "0xa00504700534e0050470050c002803c00534e00503c00534602800c005", - "0x2834902802834e00534a00507c02802834e00502800702804703c00c1a0", - "0x2823700534e00523700501802823700534e00502823002804500534e005", - "0x23a23d00734702823d00534e00502834802823a00534e005237045007020", - "0x3200534e00503200500b02824100534e00523e00502302823e00534e005", - "0x2410050c002800700534e00500700534602834100534e00534100502d028", - "0x3000534b02802834e00502800702824100734103200a00524100534e005", - "0x280070280283e300502801302824300534e00534900500b02802834e005", - "0x500b02802834e00503000534b02802834e00501b00504802802834e005", - "0x4702824600534e00502834902802834e00502834c02824300534e00500a", - "0x34e00524724600702002824700534e00524700501802824700534e005028", - "0x2302824c00534e00524a24b00734702824b00534e00502834802824a005", - "0x34e00500b00502d02824300534e00524300500b02825800534e00524c005", - "0xa00525800534e0052580050c002800700534e00500700534602800b005", - "0x2834902802834e00503100504502802834e00502800702825800700b243", - "0x2805200534e00505200501802805200534e00502823002825a00534e005", - "0x905d00734702805d00534e00502834802800900534e00505225a007020", - "0x5100534e00505100500b02805b00534e00505a00502302805a00534e005", - "0x5b0050c002800700534e00500700534602805000534e00505000502d028", - "0x2824302800b00534e00502824102805b00705005100a00505b00534e005", - "0x3e405005100734e00700502800700502802834e00502802802802834e005", - "0x500b02804f00534e00503100503102802834e00502800702801000f007", - "0x280070280140053e501304e00734e00704f00505102805100534e005051", - "0xa00534e00500a00b00724602800a00534e00501300505002802834e005", - "0x34e00504e00504f02802834e00502800a02804d00534e00500a00500f028", - "0x2834e0050280070280180053e601703000734e00704e00505102804e005", - "0x34c00524b02834b00534e00503000504f02834c00534e00501700524a028", - "0x502801402802834e0050280070280283e700502801302801b00534e005", - "0x2834b00534e00501800504f02834a00534e00501c00524c02801c00534e", - "0x702801f0053e834900534e00701b00525802801b00534e00534a00524b", - "0x34902802000534e00534900505002802834e00502834c02802834e005028", - "0x534e00502000500f02834700534e00534b00504002834800534e005028", - "0x525a02805000534e00505000502d02805100534e00505100500b028023", - "0x534e00502300501802834800534e00534800522602834700534e005347", - "0x70c00050090280c034602d03134e00502334834705005100b052028023", - "0x1a000734e00508600505d02802834e0050280070283440053e908600534e", - "0x3102802834e0050280070283410053ea03200534e00734200505a028342", - "0x702803c0053eb00c03300734e00734f00505102834f00534e0051a0005", - "0x3602802834e00500c00501b02802834e00503300534b02802834e005028", - "0x2803600534e00502834902802834e00504d00501c02802834e005032005", - "0x504003600702002804000534e00504000501802804000534e00502801f", - "0x2822600534e00522222400734702822400534e00502834802822200534e", - "0x534600502d02802d00534e00502d00500b02822a00534e005226005023", - "0x522a00534e00522a0050c002800700534e00500700534602834600534e", - "0x8602802834e00503c00534b02802834e00502800702822a00734602d00a", - "0x723034602d0311a002823000534e00523000534402823000534e005028", - "0x34e00503200503c02802834e0050280070280450470073ec04804600734e", - "0xb02823d00534e00523a00504002802834e00523700503602823a237007", - "0x313ed24123e00734e00723d04d00704800a30702804600534e005046005", - "0x24a00503c02824a00534e00502834902802834e005028007028247246243", - "0x25800534e00524c00504002802834e00524b00503602824c24b00734e005", - "0x4600500b02805200534e00525a00522402825a00534e005258005222028", - "0x24100534e00524100534602823e00534e00523e00502d02804600534e005", - "0x2834e00502800702805224123e04600a00505200534e0050520050c0028", - "0x5d00502302805d00534e00524700900734702800900534e005028348028", - "0x24300534e00524300502d02804600534e00504600500b02805a00534e005", - "0x24304600a00505a00534e00505a0050c002824600534e005246005346028", - "0x504d00501c02802834e00503200503602802834e00502800702805a246", - "0x5e00501802805e00534e00502823002805b00534e00502834902802834e", - "0x2a900534e00502834802829b00534e00505e05b00702002805e00534e005", - "0x500b02806000534e0052e80050230282e800534e00529b2a9007347028", - "0x534e00500700534602804500534e00504500502d02804700534e005047", - "0x34e00502800702806000704504700a00506000534e0050600050c0028007", - "0x504d00501c02802834e0051a000504502802834e005341005048028028", - "0x1302806100534e00534600502d02806200534e00502d00500b02802834e", - "0x502302802834e00504d00501c02802834e0050280070280283ee005028", - "0x534e00534600502d02802d00534e00502d00500b02805f00534e005344", - "0x2d00a00505f00534e00505f0050c002800700534e005007005346028346", - "0x501f00504802802834e00502834c02802834e00502800702805f007346", - "0x5100500b02802834e00534b00534b02802834e00504d00501c02802834e", - "0x2831800534e00502834902806100534e00505000502d02806200534e005", - "0x532631800702002832600534e00532600501802832600534e005028046", - "0x2833200534e00504206900734702806900534e00502834802804200534e", - "0x506100502d02806200534e00506200500b02806b00534e005332005023", - "0x506b00534e00506b0050c002800700534e00500700534602806100534e", - "0x2a902802834e00501400534b02802834e00502800702806b00706106200a", - "0x2800600534e00502804702806a00534e00502834902802834e00500b005", - "0x502834802807100534e00500606a00702002800600534e005006005018", - "0x7600534e00533100502302833100534e00507107300734702807300534e", - "0x700534602805000534e00505000502d02805100534e00505100500b028", - "0x702807600705005100a00507600534e0050760050c002800700534e005", - "0x34902802834e00503100504502802834e00500b0052a902802834e005028", - "0x7900534e00507900501802807900534e00502823002807700534e005028", - "0x32f00734702832f00534e00502834802833000534e005079077007020028", - "0x534e00500f00500b02807c00534e00504300502302804300534e005330", - "0x50c002800700534e00500700534602801000534e00501000502d02800f", - "0x700502802834e00502802802807c00701000f00a00507c00534e00507c", - "0x503102802834e00502800702800f0500073ef05100b00734e007007028", - "0x734e00701000505102800b00534e00500b00500b02801000534e00500a", - "0x1b02802834e00504f00534b02802834e0050280070280130053f004e04f", - "0x2804d00534e00502801f02801400534e00502834902802834e00504e005", - "0x502834802803000534e00504d01400702002804d00534e00504d005018", - "0x34c00534e00501800502302801800534e00503001700734702801700534e", - "0x5100502d02800500534e00500500509902800b00534e00500b00500b028", - "0x34c00534e00534c0050c002803100534e00503100534602805100534e005", - "0x2834e00501300534b02802834e00502800702834c03105100500b00b005", - "0x5100b0311a002834b00534e00534b00534402834b00534e005028086028", - "0x500530602802834e00502800702834934a0073f101c01b00734e00734b", - "0x534e00501f00509902801b00534e00501b00500b02802001f00734e005", - "0xa30502802000534e00502000509702801c00534e00501c00502d02801f", - "0x34902802834e00502d00530402802d02334734800a34e00502001c01f01b", - "0x34e0050c00050360280860c000734e00534600503c02834600534e005028", - "0x52240281a000534e00534400522202834400534e005086005040028028", - "0x534e00534700509902834800534e00534800500b02834200534e0051a0", - "0x50c002803100534e00503100534602802300534e00502300502d028347", - "0x34902802834e00502800702834203102334734800b00534200534e005342", - "0x34100534e00534100501802834100534e00502823002803200534e005028", - "0x3300734702803300534e00502834802834f00534e005341032007020028", - "0x534e00534a00500b02803c00534e00500c00502302800c00534e00534f", - "0x534602834900534e00534900502d02800500534e00500500509902834a", - "0x3c03134900534a00b00503c00534e00503c0050c002803100534e005031", - "0x3600534e00502834902802834e00500a00504502802834e005028007028", - "0x4003600702002804000534e00504000501802804000534e005028230028", - "0x22600534e00522222400734702822400534e00502834802822200534e005", - "0x500509902805000534e00505000500b02822a00534e005226005023028", - "0x3100534e00503100534602800f00534e00500f00502d02800500534e005", - "0x34e00502824102822a03100f00505000b00522a00534e00522a0050c0028", - "0x34e00502802802802834e00502824302805000534e00502824102800b005", - "0x34e00502800702804e04f0073f201000f00734e007005028007005028028", - "0x500f00500b02802834e00502800a02801300534e005031005031028028", - "0x34e0050280070280300053f304d01400734e00701300505102800f00534e", - "0x501002801800534e00501700500f02801700534e00504d005050028028", - "0x534e00534c00504e02834b00534e00501400504f02834c00534e005018", - "0x1c00534e00502801402802834e0050280070280283f400502801302801b", - "0x34a00504e02834b00534e00503000504f02834a00534e00501c00504d028", - "0x34e0050280070283490053f500a00534e00701b00503002801b00534e005", - "0x2001f00734e00700a00f00704302800a00534e00500a00b007246028028", - "0x505102801f00534e00501f00500b02802834e0050280070283480053f6", - "0x502300505002802834e00502800702802d0053f702334700734e00734b", - "0x34600534e00505100500f02805100534e00505105000724602805100534e", - "0x3440053f80860c000734e00734700505102834700534e00534700504f028", - "0x34e0050c000504f0281a000534e00508600524a02802834e005028007028", - "0x50280070280283f900502801302803200534e0051a000524b028342005", - "0x504f02834f00534e00534100524c02834100534e00502801402802834e", - "0x534e00703200525802803200534e00534f00524b02834200534e005344", - "0x34902803c00534e00503300505002802834e00502800702800c0053fa033", - "0x534e00503c00500f02804000534e00534200504002803600534e005028", - "0x525a02801000534e00501000502d02801f00534e00501f00500b028222", - "0x534e00522200501802803600534e00503600522602804000534e005040", - "0x722a00500902822a22622403134e00522203604001001f00b052028222", - "0x4800734e00523000505d02802834e0050280070280460053fb23000534e", - "0x3102802834e0050280070282370053fc04500534e00704700505a028047", - "0x70282410053fd23e23d00734e00723a00505102823a00534e005048005", - "0x24600534e00524300500f02824300534e00523e00505002802834e005028", - "0x34e00523d00504f02824600534e00524600501802802834e00502800a028", - "0x1402802834e0050280070282470053fe02834e00724600531d02823d005", - "0x534e00524b00530102824b00534e00524a00530202824a00534e005028", - "0x2834e00524700531c02802834e0050280070280283ff00502801302824c", - "0x525a00530102825a00534e0052580050a202825800534e005028014028", - "0x34e00502800702805d00540000905200734e00723d00505102824c00534e", - "0x34e00500900501b02802834e00505200534b02802834e00502834c028028", - "0x534600501c02802834e00504500503602802834e00524c005300028028", - "0x502801f02805a00534e00502834902802834e00502000507c02802834e", - "0x5e00534e00505b05a00702002805b00534e00505b00501802805b00534e", - "0x2a90050230282a900534e00505e29b00734702829b00534e005028348028", - "0x22600534e00522600502d02822400534e00522400500b0282e800534e005", - "0x22622400a0052e800534e0052e80050c002800700534e005007005346028", - "0x34e00502808602802834e00505d00534b02802834e0050280070282e8007", - "0x6200734e0070602262240311a002806000534e005060005344028060005", - "0x52ff02802834e00502834c02802834e00502800702831805f007401061", - "0x34e00504200503602806904200734e00504500503c02832600534e00524c", - "0x500b02832600534e00532600530102833200534e005069005040028028", - "0x606a06b00a34e0073263323460200070610512fe02806200534e005062", - "0x2802834e00500600505b02802834e005028007028076331073031402071", - "0x734e00507700503c02807700534e00502834902802834e005071005045", - "0x522202832f00534e00533000504002802834e005079005036028330079", - "0x534e00506200500b02807c00534e00504300522402804300534e00532f", - "0x50c002806a00534e00506a00534602806b00534e00506b00502d028062", - "0x2834802802834e00502800702807c06a06b06200a00507c00534e00507c", - "0x534e00508100502302808100534e00507607b00734702807b00534e005", - "0x534602807300534e00507300502d02806200534e00506200500b02832c", - "0x2832c33107306200a00532c00534e00532c0050c002833100534e005331", - "0x3602802834e00524c00530002802834e00502834c02802834e005028007", - "0x2802834e00502000507c02802834e00534600501c02802834e005045005", - "0x534e00507f00501802807f00534e00502823002808300534e005028349", - "0x734702832900534e00502834802832a00534e00507f08300702002807f", - "0x34e00505f00500b02832700534e00532800502302832800534e00532a329", - "0xc002800700534e00500700534602831800534e00531800502d02805f005", - "0x34b02802834e00502800702832700731805f00a00532700534e005327005", - "0x2802834e00504500503602802834e00502000507c02802834e005241005", - "0x32400534e00502833002832500534e00502834902802834e00534600501c", - "0x2834802832000534e00532432500702002832400534e005324005018028", - "0x534e00531f00502302831f00534e00532008e00734702808e00534e005", - "0x534602822600534e00522600502d02822400534e00522400500b02831e", - "0x2831e00722622400a00531e00534e00531e0050c002800700534e005007", - "0x2802834e00502000507c02802834e00523700504802802834e005028007", - "0x534e00522400500b02802834e00534600501c02802834e005048005045", - "0x34e00502800702802840300502801302831d00534e00522600502d02808c", - "0x504600502302802834e00534600501c02802834e00502000507c028028", - "0x2822600534e00522600502d02822400534e00522400500b02831c00534e", - "0x722622400a00531c00534e00531c0050c002800700534e005007005346", - "0x2834e00500c00504802802834e00502834c02802834e00502800702831c", - "0x34e00534200534b02802834e00534600501c02802834e00502000507c028", - "0x2834902831d00534e00501000502d02808c00534e00501f00500b028028", - "0x2831b00534e00531b00501802831b00534e00502829b02808a00534e005", - "0x31a31900734702831900534e00502834802831a00534e00531b08a007020", - "0x8c00534e00508c00500b02809000534e00508800502302808800534e005", - "0x900050c002800700534e00500700534602831d00534e00531d00502d028", - "0x502834c02802834e00502800702809000731d08c00a00509000534e005", - "0x500052a902802834e00502000507c02802834e00502d00534b02802834e", - "0x501802831500534e00502804602836c00534e00502834902802834e005", - "0x534e00502834802831400534e00531536c00702002831500534e005315", - "0xb02831100534e00531200502302831200534e005314313007347028313", - "0x34e00500700534602801000534e00501000502d02801f00534e00501f005", - "0x502800702831100701001f00a00531100534e0053110050c0028007005", - "0x34800500b02802834e00534b00534b02802834e0050500052a902802834e", - "0x34900504802802834e00502800702802840400502801302831000534e005", - "0x52a902802834e00534b00534b02802834e0050500052a902802834e005", - "0x34902802834e00502834c02831000534e00500f00500b02802834e00500b", - "0x30f00534e00530f00501802830f00534e00502804702808d00534e005028", - "0x30d00734702830d00534e00502834802830e00534e00530f08d007020028", - "0x534e00531000500b02830b00534e00530c00502302830c00534e00530e", - "0x50c002800700534e00500700534602801000534e00501000502d028310", - "0x504502802834e00502800702830b00701031000a00530b00534e00530b", - "0x34902802834e00500b0052a902802834e0050500052a902802834e005031", - "0x8700534e00508700501802808700534e00502823002830800534e005028", - "0x9600734702809600534e00502834802809400534e005087308007020028", - "0x534e00504f00500b02809900534e00530700502302830700534e005094", - "0x50c002800700534e00500700534602804e00534e00504e00502d02804f", - "0x700502802834e00502802802809900704e04f00a00509900534e005099", - "0x503102802834e00502800702805005100740500b00a00734e007005028", - "0x2800a00534e00500a00500b02802834e00502800a02800f00534e005031", - "0x524a02802834e00502800702804e00540604f01000734e00700f005051", - "0x534e00501300524b02801400534e00501000504f02801300534e00504f", - "0x3000534e00502801402802834e00502800702802840700502801302804d", - "0x1700524b02801400534e00504e00504f02801700534e00503000524c028", - "0x34e00502800702834c00540801800534e00704d00525802804d00534e005", - "0x501802801b00534e00534b00500f02834b00534e005018005050028028", - "0x2001f34903140934a01c00734e00701b00a0072fd02801b00534e00501b", - "0x34e00701400505102801c00534e00501c00500b02802834e005028007028", - "0x34b02802834e00502834c02802834e00502800702802300540a347348007", - "0x2802834e00534a0052fc02802834e00534700501b02802834e005348005", - "0x534e00534600501802834600534e00502801f02802d00534e005028349", - "0x734702808600534e0050283480280c000534e00534602d007020028346", - "0x34e00501c00500b0281a000534e00534400502302834400534e0050c0086", - "0xc002800700534e00500700534602800b00534e00500b00502d02801c005", - "0x34c02802834e0050280070281a000700b01c00a0051a000534e0051a0005", - "0x34402834200534e00502808602802834e00502300534b02802834e005028", - "0x34f00740b34103200734e00734200b01c0311a002834200534e005342005", - "0x534100502d02803200534e00503200500b02802834e005028007028033", - "0x3134e00534a3410320312f902834a00534e00534a0052fa02834100534e", - "0x2834e00502800702822200540c04000534e0070360050a902803603c00c", - "0x52260050b002822600534e0050400052f802822400534e005028349028", - "0x4600734e00523000503c02823000534e00522a22400702002822a00534e", - "0x4700522202804700534e00504800504002802834e005046005036028048", - "0xc00534e00500c00500b02823700534e00504500522402804500534e005", - "0x2370050c002800700534e00500700534602803c00534e00503c00502d028", - "0x22200502302802834e00502800702823700703c00c00a00523700534e005", - "0x3c00534e00503c00502d02800c00534e00500c00500b02823a00534e005", - "0x3c00c00a00523a00534e00523a0050c002800700534e005007005346028", - "0x34e00502834902802834e00534a0052fc02802834e00502800702823a007", - "0x702002823e00534e00523e00501802823e00534e00502823002823d005", - "0x34e00524124300734702824300534e00502834802824100534e00523e23d", - "0x2d02834f00534e00534f00500b02824700534e005246005023028246005", - "0x34e0052470050c002800700534e00500700534602803300534e005033005", - "0x34e00501f0052fc02802834e00502800702824700703334f00a005247005", - "0x534900500b02802834e00501400534b02802834e0050200052fc028028", - "0x534c00504802802834e00502800702802840d00502801302824a00534e", - "0x2834c02824a00534e00500a00500b02802834e00501400534b02802834e", - "0x501802824c00534e00502804702824b00534e00502834902802834e005", - "0x534e00502834802825800534e00524c24b00702002824c00534e00524c", - "0xb02800900534e00505200502302805200534e00525825a00734702825a", - "0x34e00500700534602800b00534e00500b00502d02824a00534e00524a005", - "0x502800702800900700b24a00a00500900534e0050090050c0028007005", - "0x502823002805d00534e00502834902802834e00503100504502802834e", - "0x5b00534e00505a05d00702002805a00534e00505a00501802805a00534e", - "0x29b00502302829b00534e00505b05e00734702805e00534e005028348028", - "0x5000534e00505000502d02805100534e00505100500b0282a900534e005", - "0x5005100a0052a900534e0052a90050c002800700534e005007005346028", - "0x740e00b00a00734e00700502800700502802834e0050280280282a9007", - "0xa00500b02800f00534e00503100503102802834e005028007028050051", - "0x502800702804e00540f04f01000734e00700f00505102800a00534e005", - "0x502834902802834e00504f00501b02802834e00501000534b02802834e", - "0x2002801400534e00501400501802801400534e00502801f02801300534e", - "0x504d03000734702803000534e00502834802804d00534e005014013007", - "0x2800a00534e00500a00500b02801800534e00501700502302801700534e", - "0x50180050c002800700534e00500700534602800b00534e00500b00502d", - "0x504e00534b02802834e00502800702801800700b00a00a00501800534e", - "0x311a002834c00534e00534c00534402834c00534e00502808602802834e", - "0x7b02802834e00502800702834a01c00741001b34b00734e00734c00b00a", - "0x534e00501b00502d02834b00534e00534b00500b02834900534e005028", - "0x1f00a34e00534900701b34b00a0ac02800700534e00500700534602801b", - "0x2834e00502800702802d00541102300534e007347005083028347348020", - "0x34e00534600503c02834600534e00502834902802834e00502300507f028", - "0x22202834400534e00508600504002802834e0050c00050360280860c0007", - "0x34e00501f00500b02834200534e0051a00052240281a000534e005344005", - "0xc002834800534e00534800534602802000534e00502000502d02801f005", - "0x2302802834e00502800702834234802001f00a00534200534e005342005", - "0x34e00502000502d02801f00534e00501f00500b02803200534e00502d005", - "0xa00503200534e0050320050c002834800534e005348005346028020005", - "0x2823002834100534e00502834902802834e00502800702803234802001f", - "0x534e00534f34100702002834f00534e00534f00501802834f00534e005", - "0x502302803c00534e00503300c00734702800c00534e005028348028033", - "0x534e00534a00502d02801c00534e00501c00500b02803600534e00503c", - "0x1c00a00503600534e0050360050c002800700534e00500700534602834a", - "0x502834902802834e00503100504502802834e00502800702803600734a", - "0x2002822200534e00522200501802822200534e00502823002804000534e", - "0x522422600734702822600534e00502834802822400534e005222040007", - "0x2805100534e00505100500b02823000534e00522a00502302822a00534e", - "0x52300050c002800700534e00500700534602805000534e00505000502d", - "0x502800700502802834e00502802802823000705005100a00523000534e", - "0x503100503102802834e00502800702805005100741200b00a00734e007", - "0x4f01000734e00700f00505102800a00534e00500a00500b02800f00534e", - "0x4f00501b02802834e00501000534b02802834e00502800702804e005413", - "0x501802801400534e00502801f02801300534e00502834902802834e005", - "0x534e00502834802804d00534e00501401300702002801400534e005014", - "0xb02801800534e00501700502302801700534e00504d030007347028030", - "0x34e00500700534602800b00534e00500b00502d02800a00534e00500a005", - "0x502800702801800700b00a00a00501800534e0050180050c0028007005", - "0x34c00534402834c00534e00502808602802834e00504e00534b02802834e", - "0x2834a01c00741401b34b00734e00734c00b00a0311a002834c00534e005", - "0x34b00534e00534b00500b02834900534e00502807b02802834e005028007", - "0x34b00a2f702800700534e00500700534602801b00534e00501b00502d028", - "0x541502300534e00734700508302834734802001f00a34e00534900701b", - "0x534e00502834902802834e00502300507f02802834e00502800702802d", - "0x504002802834e0050c00050360280860c000734e00534600503c028346", - "0x534e0051a00052240281a000534e00534400522202834400534e005086", - "0x534602802000534e00502000502d02801f00534e00501f00500b028342", - "0x2834234802001f00a00534200534e0053420050c002834800534e005348", - "0x534e00501f00500b02803200534e00502d00502302802834e005028007", - "0x50c002834800534e00534800534602802000534e00502000502d02801f", - "0x2834902802834e00502800702803234802001f00a00503200534e005032", - "0x2834f00534e00534f00501802834f00534e00502823002834100534e005", - "0x3300c00734702800c00534e00502834802803300534e00534f341007020", - "0x1c00534e00501c00500b02803600534e00503c00502302803c00534e005", - "0x360050c002800700534e00500700534602834a00534e00534a00502d028", - "0x3100504502802834e00502800702803600734a01c00a00503600534e005", - "0x501802822200534e00502823002804000534e00502834902802834e005", - "0x534e00502834802822400534e00522204000702002822200534e005222", - "0xb02823000534e00522a00502302822a00534e005224226007347028226", - "0x34e00500700534602805000534e00505000502d02805100534e005051005", - "0x502802802823000705005100a00523000534e0052300050c0028007005", - "0x502800702800f05000741605100b00734e00700702800700502802834e", - "0x5102800b00534e00500b00500b02801000534e00500a00503102802834e", - "0x4f00534b02802834e00502800702801300541704e04f00734e007010005", - "0x2801f02801400534e00502834902802834e00504e00501b02802834e005", - "0x534e00504d01400702002804d00534e00504d00501802804d00534e005", - "0x502302801800534e00503001700734702801700534e005028348028030", - "0x534e0050050052f502800b00534e00500b00500b02834c00534e005018", - "0x50c002803100534e00503100534602805100534e00505100502d028005", - "0x34b02802834e00502800702834c03105100500b00b00534c00534e00534c", - "0x34b00534e00534b00534402834b00534e00502808602802834e005013005", - "0x34e00502800702834934a00741801c01b00734e00734b05100b0311a0028", - "0x1c00502d02801b00534e00501b00500b02801f00534e00502807b028028", - "0x3100534e00503100534602800500534e0050050052f502801c00534e005", - "0x2d00508302802d02334734802000b34e00501f03100501c01b00b0b4028", - "0x2834e00534600507f02802834e0050280070280c000541934600534e007", - "0x3440050360281a034400734e00508600503c02808600534e005028349028", - "0x2803200534e00534200522202834200534e0051a000504002802834e005", - "0x53470052f502802000534e00502000500b02834100534e005032005224", - "0x2802300534e00502300534602834800534e00534800502d02834700534e", - "0x2834e00502800702834102334834702000b00534100534e0053410050c0", - "0x3470052f502802000534e00502000500b02834f00534e0050c0005023028", - "0x2300534e00502300534602834800534e00534800502d02834700534e005", - "0x34e00502800702834f02334834702000b00534f00534e00534f0050c0028", - "0x500c00501802800c00534e00502823002803300534e005028349028028", - "0x2803600534e00502834802803c00534e00500c03300702002800c00534e", - "0x34a00500b02822200534e00504000502302804000534e00503c036007347", - "0x34900534e00534900502d02800500534e0050050052f502834a00534e005", - "0x534a00b00522200534e0052220050c002803100534e005031005346028", - "0x502834902802834e00500a00504502802834e005028007028222031349", - "0x2002822600534e00522600501802822600534e00502823002822400534e", - "0x522a23000734702823000534e00502834802822a00534e005226224007", - "0x2805000534e00505000500b02804800534e00504600502302804600534e", - "0x503100534602800f00534e00500f00502d02800500534e0050050052f5", - "0x2802804803100f00505000b00504800534e0050480050c002803100534e", - "0x702805005100741a00b00a00734e00700502800700502802834e005028", - "0xa00534e00500a00500b02800f00534e00503100503102802834e005028", - "0x34b02802834e00502800702804e00541b04f01000734e00700f005051028", - "0x2801300534e00502834902802834e00504f00501b02802834e005010005", - "0x501401300702002801400534e00501400501802801400534e00502801f", - "0x2801700534e00504d03000734702803000534e00502834802804d00534e", - "0x500b00502d02800a00534e00500a00500b02801800534e005017005023", - "0x501800534e0050180050c002800700534e00500700534602800b00534e", - "0x8602802834e00504e00534b02802834e00502800702801800700b00a00a", - "0x734c00b00a0311a002834c00534e00534c00534402834c00534e005028", - "0x534e00502807b02802834e00502800702834a01c00741c01b34b00734e", - "0x534602801b00534e00501b00502d02834b00534e00534b00500b028349", - "0x2834734802001f00a34e00534900701b34b00a0b602800700534e005007", - "0x2300507f02802834e00502800702802d00541d02300534e007347005083", - "0x280860c000734e00534600503c02834600534e00502834902802834e005", - "0x34e00534400522202834400534e00508600504002802834e0050c0005036", - "0x2d02801f00534e00501f00500b02834200534e0051a00052240281a0005", - "0x34e0053420050c002834800534e00534800534602802000534e005020005", - "0x34e00502d00502302802834e00502800702834234802001f00a005342005", - "0x34602802000534e00502000502d02801f00534e00501f00500b028032005", - "0x3234802001f00a00503200534e0050320050c002834800534e005348005", - "0x34f00534e00502823002834100534e00502834902802834e005028007028", - "0x2834802803300534e00534f34100702002834f00534e00534f005018028", - "0x534e00503c00502302803c00534e00503300c00734702800c00534e005", - "0x534602834a00534e00534a00502d02801c00534e00501c00500b028036", - "0x2803600734a01c00a00503600534e0050360050c002800700534e005007", - "0x2804000534e00502834902802834e00503100504502802834e005028007", - "0x522204000702002822200534e00522200501802822200534e005028230", - "0x2822a00534e00522422600734702822600534e00502834802822400534e", - "0x505000502d02805100534e00505100500b02823000534e00522a005023", - "0x523000534e0052300050c002800700534e00500700534602805000534e", - "0xa00734e00700502800700502802834e00502802802823000705005100a", - "0x2800f00534e00503100503102802834e00502800702805005100741e00b", - "0x2804e00541f04f01000734e00700f00505102800a00534e00500a00500b", - "0x534e00501000504f02801300534e00504f00505002802834e005028007", - "0x542004d01400734e00701000505102801300534e005013005018028010", - "0x501400504f02801700534e00504d00505002802834e005028007028030", - "0x34c01800734e00701400505102801700534e00501700501802801400534e", - "0x34c00501b02802834e00501800534b02802834e00502800702834b005421", - "0x2834902802834e00501700501c02802834e00501300501c02802834e005", - "0x2801c00534e00501c00501802801c00534e00502801f02801b00534e005", - "0x34a34900734702834900534e00502834802834a00534e00501c01b007020", - "0xa00534e00500a00500b02802000534e00501f00502302801f00534e005", - "0x200050c002800700534e00500700534602800b00534e00500b00502d028", - "0x34b00534b02802834e00502800702802000700b00a00a00502000534e005", - "0x1a002834800534e00534800534402834800534e00502808602802834e005", - "0x2802834e00502800702834602d00742202334700734e00734800b00a031", - "0x860c000708c02808600534e00501700500f0280c000534e00501300500f", - "0x34700534e00534700500b02834400534e00534400501802834400534e005", - "0x502834902802834e0050280070281a000542302834e00734400531d028", - "0x2002803200534e00503200501802803200534e0050282f302834200534e", - "0x34f00503602803334f00734e00534100503c02834100534e005032342007", - "0x2803c00534e00500c00522202800c00534e00503300504002802834e005", - "0x502300502d02834700534e00534700500b02803600534e00503c005224", - "0x503600534e0050360050c002800700534e00500700534602802300534e", - "0x34902802834e0051a000531c02802834e00502800702803600702334700a", - "0x22200534e00522200501802822200534e0050280b902804000534e005028", - "0x22600734702822600534e00502834802822400534e005222040007020028", - "0x534e00534700500b02823000534e00522a00502302822a00534e005224", - "0x50c002800700534e00500700534602802300534e00502300502d028347", - "0x501c02802834e00502800702823000702334700a00523000534e005230", - "0x23002804600534e00502834902802834e00501700501c02802834e005013", - "0x34e00504804600702002804800534e00504800501802804800534e005028", - "0x2302823700534e00504704500734702804500534e005028348028047005", - "0x34e00534600502d02802d00534e00502d00500b02823a00534e005237005", - "0xa00523a00534e00523a0050c002800700534e005007005346028346005", - "0x501c02802834e00503000534b02802834e00502800702823a00734602d", - "0x1802823e00534e00502804602823d00534e00502834902802834e005013", - "0x34e00502834802824100534e00523e23d00702002823e00534e00523e005", - "0x2824700534e00524600502302824600534e005241243007347028243005", - "0x500700534602800b00534e00500b00502d02800a00534e00500a00500b", - "0x2800702824700700b00a00a00524700534e0052470050c002800700534e", - "0x2804702824a00534e00502834902802834e00504e00534b02802834e005", - "0x534e00524b24a00702002824b00534e00524b00501802824b00534e005", - "0x502302825a00534e00524c25800734702825800534e00502834802824c", - "0x534e00500b00502d02800a00534e00500a00500b02805200534e00525a", - "0xa00a00505200534e0050520050c002800700534e00500700534602800b", - "0x502834902802834e00503100504502802834e00502800702805200700b", - "0x2002805d00534e00505d00501802805d00534e00502823002800900534e", - "0x505a05b00734702805b00534e00502834802805a00534e00505d009007", - "0x2805100534e00505100500b02829b00534e00505e00502302805e00534e", - "0x529b0050c002800700534e00500700534602805000534e00505000502d", - "0x502800700502802834e00502802802829b00705005100a00529b00534e", - "0x503100503102802834e00502800702805005100742400b00a00734e007", - "0x505102800a00534e00500a00500b02802834e00502800a02800f00534e", - "0x504f00524a02802834e00502800702804e00542504f01000734e00700f", - "0x2804d00534e00501300524b02801400534e00501000504f02801300534e", - "0x24c02803000534e00502801402802834e005028007028028426005028013", - "0x34e00501700524b02801400534e00504e00504f02801700534e005030005", - "0x2802834e00502800702834c00542701800534e00704d00525802804d005", - "0x1b00534e00502834902834b00534e00501800505002802834e00502834c", - "0xa00500b02834a00534e00534b00500f02801c00534e005014005040028", - "0x1c00534e00501c00525a02800b00534e00500b00502d02800a00534e005", - "0xa00b05202834a00534e00534a00501802801b00534e00501b005226028", - "0x542834800534e00702000500902802001f34903134e00534a01b01c00b", - "0x2d00505a02802d02300734e00534800505d02802834e005028007028347", - "0x534e00502300503102802834e0050280070280c000542934600534e007", - "0x2802834e00502800702834200542a1a034400734e007086005051028086", - "0x2834e00534600503602802834e0051a000501b02802834e00534400534b", - "0x34e00534100501802834100534e00502801f02803200534e005028349028", - "0x34702803300534e00502834802834f00534e005341032007020028341005", - "0x534900500b02803c00534e00500c00502302800c00534e00534f033007", - "0x2800700534e00500700534602801f00534e00501f00502d02834900534e", - "0x2802834e00502800702803c00701f34900a00503c00534e00503c0050c0", - "0x534e00503600534402803600534e00502808602802834e00534200534b", - "0x502800702822622400742b22204000734e00703601f3490311a0028036", - "0x502d02804000534e00504000500b02822a00534e00502807b02802834e", - "0x534e00534600522602800700534e00500700534602822200534e005222", - "0x470052f002804704804623000a34e00534622a00722204000b2f1028346", - "0x23a00534e00502834902802834e00502800702823700542c04500534e007", - "0x23a00702002802834e00523d00508d02823e23d00734e0050450052ef028", - "0x34e00524300503602824624300734e00524100503c02824100534e00523e", - "0x522402824a00534e00524700522202824700534e005246005040028028", - "0x534e00504600502d02823000534e00523000500b02824b00534e00524a", - "0x23000a00524b00534e00524b0050c002804800534e005048005346028046", - "0x500b02824c00534e00523700502302802834e00502800702824b048046", - "0x534e00504800534602804600534e00504600502d02823000534e005230", - "0x34e00502800702824c04804623000a00524c00534e00524c0050c0028048", - "0x34e00502823002825800534e00502834902802834e005346005036028028", - "0x2805200534e00525a25800702002825a00534e00525a00501802825a005", - "0x505d00502302805d00534e00505200900734702800900534e005028348", - "0x2822600534e00522600502d02822400534e00522400500b02805a00534e", - "0x722622400a00505a00534e00505a0050c002800700534e005007005346", - "0x34e00502300504502802834e0050c000504802802834e00502800702805a", - "0x2801302805e00534e00501f00502d02805b00534e00534900500b028028", - "0x500b02829b00534e00534700502302802834e00502800702802842d005", - "0x534e00500700534602801f00534e00501f00502d02834900534e005349", - "0x34e00502800702829b00701f34900a00529b00534e00529b0050c0028007", - "0x34e00501400534b02802834e00534c00504802802834e00502834c028028", - "0x2834902805e00534e00500b00502d02805b00534e00500a00500b028028", - "0x282e800534e0052e80050180282e800534e0050280470282a900534e005", - "0x6006200734702806200534e00502834802806000534e0052e82a9007020", - "0x5b00534e00505b00500b02805f00534e00506100502302806100534e005", - "0x5f0050c002800700534e00500700534602805e00534e00505e00502d028", - "0x3100504502802834e00502800702805f00705e05b00a00505f00534e005", - "0x501802832600534e00502823002831800534e00502834902802834e005", - "0x534e00502834802804200534e00532631800702002832600534e005326", - "0xb02806b00534e00533200502302833200534e005042069007347028069", - "0x34e00500700534602805000534e00505000502d02805100534e005051005", - "0x502802802806b00705005100a00506b00534e00506b0050c0028007005", - "0x502800702805005100742e00b00a00734e00700502800700502802834e", - "0x5102800a00534e00500a00500b02800f00534e00503100503102802834e", - "0x1000534b02802834e00502800702804e00542f04f01000734e00700f005", - "0x2801f02801300534e00502834902802834e00504f00501b02802834e005", - "0x534e00501401300702002801400534e00501400501802801400534e005", - "0x502302801700534e00504d03000734702803000534e00502834802804d", - "0x534e00500b00502d02800a00534e00500a00500b02801800534e005017", - "0xa00a00501800534e0050180050c002800700534e00500700534602800b", - "0x502808602802834e00504e00534b02802834e00502800702801800700b", - "0x734e00734c00b00a0311a002834c00534e00534c00534402834c00534e", - "0x2834900534e00502834902802834e00502800702834a01c00743001b34b", - "0x501f34900702002801f00534e00501f00501802801f00534e0050282ee", - "0x2834700534e00502034800734702834800534e00502834802802000534e", - "0x501b00502d02834b00534e00534b00500b02802300534e005347005023", - "0x502300534e0050230050c002800700534e00500700534602801b00534e", - "0x23002802d00534e00502834902802834e00502800702802300701b34b00a", - "0x34e00534602d00702002834600534e00534600501802834600534e005028", - "0x2302834400534e0050c008600734702808600534e0050283480280c0005", - "0x34e00534a00502d02801c00534e00501c00500b0281a000534e005344005", - "0xa0051a000534e0051a00050c002800700534e00500700534602834a005", - "0x2834902802834e00503100504502802834e0050280070281a000734a01c", - "0x2803200534e00503200501802803200534e00502823002834200534e005", - "0x34134f00734702834f00534e00502834802834100534e005032342007020", - "0x5100534e00505100500b02800c00534e00503300502302803300534e005", - "0xc0050c002800700534e00500700534602805000534e00505000502d028", - "0x2800700502802834e00502802802800c00705005100a00500c00534e005", - "0x3100503102802834e00502800702805005100743100b00a00734e007005", - "0x1000734e00700f00505102800a00534e00500a00500b02800f00534e005", - "0x4f02801300534e00504f00505002802834e00502800702804e00543204f", - "0x34e00701000505102801300534e00501300501802801000534e005010005", - "0x2802834e00501400534b02802834e00502800702803000543304d014007", - "0x1700534e00502834902802834e00501300501c02802834e00504d00501b", - "0x1801700702002801800534e00501800501802801800534e00502801f028", - "0x1b00534e00534c34b00734702834b00534e00502834802834c00534e005", - "0xb00502d02800a00534e00500a00500b02801c00534e00501b005023028", - "0x1c00534e00501c0050c002800700534e00500700534602800b00534e005", - "0x2802834e00503000534b02802834e00502800702801c00700b00a00a005", - "0x34a00b00a0311a002834a00534e00534a00534402834a00534e005028086", - "0x501300500f02802834e00502800702834802000743401f34900734e007", - "0x2d02834900534e00534900500b02802300534e00502807b02834700534e", - "0x2301f34900a2ed02834700534e00534700501802801f00534e00501f005", - "0x702834400543508600534e0070c00050830280c034602d03134e005347", - "0x3c0281a000534e00502834902802834e00508600507f02802834e005028", - "0x34e00503200504002802834e00534200503602803234200734e0051a0005", - "0xb02803300534e00534f00522402834f00534e005341005222028341005", - "0x34e00500700534602834600534e00534600502d02802d00534e00502d005", - "0x502800702803300734602d00a00503300534e0050330050c0028007005", - "0x2d02802d00534e00502d00500b02800c00534e00534400502302802834e", - "0x34e00500c0050c002800700534e00500700534602834600534e005346005", - "0x34e00501300501c02802834e00502800702800c00734602d00a00500c005", - "0x503600501802803600534e00502823002803c00534e005028349028028", - "0x2822200534e00502834802804000534e00503603c00702002803600534e", - "0x2000500b02822600534e00522400502302822400534e005040222007347", - "0x700534e00500700534602834800534e00534800502d02802000534e005", - "0x2834e00502800702822600734802000a00522600534e0052260050c0028", - "0x534e00502804702822a00534e00502834902802834e00504e00534b028", - "0x34802804600534e00523022a00702002823000534e005230005018028230", - "0x34e00504700502302804700534e00504604800734702804800534e005028", - "0x34602800b00534e00500b00502d02800a00534e00500a00500b028045005", - "0x4500700b00a00a00504500534e0050450050c002800700534e005007005", - "0x23700534e00502834902802834e00503100504502802834e005028007028", - "0x23a23700702002823a00534e00523a00501802823a00534e005028230028", - "0x24100534e00523d23e00734702823e00534e00502834802823d00534e005", - "0x5000502d02805100534e00505100500b02824300534e005241005023028", - "0x24300534e0052430050c002800700534e00500700534602805000534e005", - "0x734e00700502800700502802834e00502802802824300705005100a005", - "0xf00534e00503100503102802834e00502800702805005100743600b00a", - "0x4e00543704f01000734e00700f00505102800a00534e00500a00500b028", - "0x34e00501000504f02801300534e00504f00505002802834e005028007028", - "0x43804d01400734e00701000505102801300534e005013005018028010005", - "0x504d00501b02802834e00501400534b02802834e005028007028030005", - "0x502801f02801700534e00502834902802834e00501300501c02802834e", - "0x34c00534e00501801700702002801800534e00501800501802801800534e", - "0x1b00502302801b00534e00534c34b00734702834b00534e005028348028", - "0xb00534e00500b00502d02800a00534e00500a00500b02801c00534e005", - "0xb00a00a00501c00534e00501c0050c002800700534e005007005346028", - "0x34e00502808602802834e00503000534b02802834e00502800702801c007", - "0x34900734e00734a00b00a0311a002834a00534e00534a00534402834a005", - "0x2834700534e00501300500f02802834e00502800702834802000743901f", - "0x34e00501f00502d02834900534e00534900500b02802300534e00502807b", - "0x3134e00534702301f34900a2ec02834700534e00534700501802801f005", - "0x2834e00502800702834400543a08600534e0070c00050830280c034602d", - "0x34e0051a000503c0281a000534e00502834902802834e00508600507f028", - "0x22202834100534e00503200504002802834e005342005036028032342007", - "0x34e00502d00500b02803300534e00534f00522402834f00534e005341005", - "0xc002800700534e00500700534602834600534e00534600502d02802d005", - "0x2302802834e00502800702803300734602d00a00503300534e005033005", - "0x34e00534600502d02802d00534e00502d00500b02800c00534e005344005", - "0xa00500c00534e00500c0050c002800700534e005007005346028346005", - "0x2834902802834e00501300501c02802834e00502800702800c00734602d", - "0x2803600534e00503600501802803600534e00502823002803c00534e005", - "0x4022200734702822200534e00502834802804000534e00503603c007020", - "0x2000534e00502000500b02822600534e00522400502302822400534e005", - "0x2260050c002800700534e00500700534602834800534e00534800502d028", - "0x4e00534b02802834e00502800702822600734802000a00522600534e005", - "0x501802823000534e00502804702822a00534e00502834902802834e005", - "0x534e00502834802804600534e00523022a00702002823000534e005230", - "0xb02804500534e00504700502302804700534e005046048007347028048", - "0x34e00500700534602800b00534e00500b00502d02800a00534e00500a005", - "0x502800702804500700b00a00a00504500534e0050450050c0028007005", - "0x502823002823700534e00502834902802834e00503100504502802834e", - "0x23d00534e00523a23700702002823a00534e00523a00501802823a00534e", - "0x24100502302824100534e00523d23e00734702823e00534e005028348028", - "0x5000534e00505000502d02805100534e00505100500b02824300534e005", - "0x5005100a00524300534e0052430050c002800700534e005007005346028", - "0x743b00b00a00734e00700502800700502802834e005028028028243007", - "0x502800a02800f00534e00503100503102802834e005028007028050051", - "0x43c04f01000734e00700f00505102800a00534e00500a00500b02802834e", - "0x1300500f02801300534e00504f00505002802834e00502800702804e005", - "0x3000534e00501000504f02804d00534e00501400501002801400534e005", - "0x2834e00502800702802843d00502801302801700534e00504d00504e028", - "0x504e00504f02834c00534e00501800504d02801800534e005028014028", - "0x43e34b00534e00701700503002801700534e00534c00504e02803000534e", - "0x543f34a01c00734e00734b00a00724702802834e00502800702801b005", - "0x703000505102801c00534e00501c00500b02802834e005028007028349", - "0x534e00502000505002802834e00502800702834800544002001f00734e", - "0x505102834700534e00534700501802801f00534e00501f00504f028347", - "0x502d00505002802834e00502800702834600544102d02300734e00701f", - "0x280c000534e0050c000501802802300534e00502300504f0280c000534e", - "0x2834c02802834e0050280070281a000544234408600734e007023005051", - "0x501c02802834e00534400501b02802834e00508600534b02802834e005", - "0x34902802834e00534700501c02802834e00534a00505b02802834e0050c0", - "0x3200534e00503200501802803200534e00502801f02834200534e005028", - "0x34f00734702834f00534e00502834802834100534e005032342007020028", - "0x534e00501c00500b02800c00534e00503300502302803300534e005341", - "0x50c002800700534e00500700534602800b00534e00500b00502d02801c", - "0x2834c02802834e00502800702800c00700b01c00a00500c00534e00500c", - "0x534402803c00534e00502808602802834e0051a000534b02802834e005", - "0x22422200744304003600734e00703c00b01c0311a002803c00534e00503c", - "0x2834e00502800a02822600534e0050c000500f02802834e005028007028", - "0x531d02803600534e00503600500b02822a22600734e0052260050bf028", - "0x2834e00534700501c02802834e00502800702823000544402834e00722a", - "0x34e00504000502d02802834e00522600501c02802834e00534a00505b028", - "0x502800702802844500502801302804800534e005007005346028046005", - "0x34a0052eb02804700534e00502834902802834e00523000531c02802834e", - "0x34e00523704700702002823700534e0050450052ea02804534a00734e005", - "0x2823e23d00734e00523d0050bf02823d00534e00534700500f02823a005", - "0x24322600708c02824300534e00502823d02824100534e00523e23a007020", - "0x534e00524624100702002824600534e00524600501802824600534e005", - "0x504002802834e00524a00503602824b24a00734e00524700503c028247", - "0x23d34a00704000b05e02824c00534e00524c00525a02824c00534e00524b", - "0x4502802834e00502800702805a05d00903144605225a25803134e00724c", - "0x534e00525a00534602804600534e00525800502d02802834e005052005", - "0x34e00505b00503c02805b00534e00502834902802834e00502834c028048", - "0x2220282a900534e00529b00504002802834e00505e00503602829b05e007", - "0x34e00503600500b02806000534e0052e80052240282e800534e0052a9005", - "0xc002804800534e00504800534602804600534e00504600502d028036005", - "0x34c02802834e00502800702806004804603600a00506000534e005060005", - "0x6100534e00505a06200734702806200534e00502834802802834e005028", - "0x900502d02803600534e00503600500b02805f00534e005061005023028", - "0x5f00534e00505f0050c002805d00534e00505d00534602800900534e005", - "0x2802834e0050c000501c02802834e00502800702805f05d00903600a005", - "0x31800534e00502834902802834e00534700501c02802834e00534a00505b", - "0x32631800702002832600534e00532600501802832600534e005028230028", - "0x33200534e00504206900734702806900534e00502834802804200534e005", - "0x22400502d02822200534e00522200500b02806b00534e005332005023028", - "0x6b00534e00506b0050c002800700534e00500700534602822400534e005", - "0x34b02802834e00502834c02802834e00502800702806b00722422200a005", - "0x2802834e00534a00505b02802834e00534700501c02802834e005346005", - "0x534e00500600501802800600534e00502829b02806a00534e005028349", - "0x734702807300534e00502834802807100534e00500606a007020028006", - "0x34e00501c00500b02807600534e00533100502302833100534e005071073", - "0xc002800700534e00500700534602800b00534e00500b00502d02801c005", - "0x34c02802834e00502800702807600700b01c00a00507600534e005076005", - "0x34902802834e00534a00505b02802834e00534800534b02802834e005028", - "0x7900534e00507900501802807900534e00502804602807700534e005028", - "0x32f00734702832f00534e00502834802833000534e005079077007020028", - "0x534e00501c00500b02807c00534e00504300502302804300534e005330", - "0x50c002800700534e00500700534602800b00534e00500b00502d02801c", - "0x534b02802834e00502800702807c00700b01c00a00507c00534e00507c", - "0x702802844700502801302807b00534e00534900500b02802834e005030", - "0xb02802834e00503000534b02802834e00501b00504802802834e005028", - "0x2808100534e00502834902802834e00502834c02807b00534e00500a005", - "0x532c08100702002832c00534e00532c00501802832c00534e005028047", - "0x2832a00534e00508307f00734702807f00534e00502834802808300534e", - "0x500b00502d02807b00534e00507b00500b02832900534e00532a005023", - "0x532900534e0053290050c002800700534e00500700534602800b00534e", - "0x34902802834e00503100504502802834e00502800702832900700b07b00a", - "0x32700534e00532700501802832700534e00502823002832800534e005028", - "0x32400734702832400534e00502834802832500534e005327328007020028", - "0x534e00505100500b02808e00534e00532000502302832000534e005325", - "0x50c002800700534e00500700534602805000534e00505000502d028051", - "0x700502802834e00502802802808e00705005100a00508e00534e00508e", - "0x503102802834e00502800702800f05000744805100b00734e007007005", - "0x734e00701000505102800b00534e00500b00500b02801000534e00500a", - "0x2801400534e00504e00505002802834e00502800702801300544904e04f", - "0x704f00505102801400534e00501400501802804f00534e00504f00504f", - "0x534e00503000505002802834e00502800702801700544a03004d00734e", - "0x505102801800534e00501800501802804d00534e00504d00504f028018", - "0x534b00505002802834e00502800702801b00544b34b34c00734e00704d", - "0x2801c00534e00501c00501802834c00534e00534c00504f02801c00534e", - "0x534b02802834e00502800702801f00544c34934a00734e00734c005051", - "0x1c02802834e00501c00501c02802834e00534900501b02802834e00534a", - "0x2802000534e00502834902802834e00501400501c02802834e005018005", - "0x534802000702002834800534e00534800501802834800534e00502801f", - "0x2802d00534e00534702300734702802300534e00502834802834700534e", - "0x500b00500b02802800534e0050280052e902834600534e00502d005023", - "0x2803100534e00503100534602805100534e00505100502d02800b00534e", - "0x2834e00502800702834603105100b02800b00534600534e0053460050c0", - "0x34e0050c00053440280c000534e00502808602802834e00501f00534b028", - "0x280070283421a000744d34408600734e0070c005100b0311a00280c0005", - "0x2834100534e00501800500f02803200534e00501400500f02802834e005", - "0x34e00508600500b02803300534e00502807b02834f00534e00501c00500f", - "0x34602802800534e0050280052e902834400534e00534400502d028086005", - "0x34e00534100501802803200534e00503200501802803100534e005031005", - "0x34103203303102834408600f05302834f00534e00534f005018028341005", - "0x22600544e22400534e00722200508302822204003603c00c00b34e00534f", - "0x22a00534e00502834902802834e00522400507f02802834e005028007028", - "0x4600504002802834e00523000503602804623000734e00522a00503c028", - "0x4500534e00504700522402804700534e00504800522202804800534e005", - "0x3c00502d02800c00534e00500c00500b02803600534e0050360052e9028", - "0x4500534e0050450050c002804000534e00504000534602803c00534e005", - "0x534e00522600502302802834e00502800702804504003c00c03600b005", - "0x502d02800c00534e00500c00500b02803600534e0050360052e9028237", - "0x534e0052370050c002804000534e00504000534602803c00534e00503c", - "0x34e00501c00501c02802834e00502800702823704003c00c03600b005237", - "0x34e00502834902802834e00501400501c02802834e00501800501c028028", - "0x702002823d00534e00523d00501802823d00534e00502823002823a005", - "0x34e00523e24100734702824100534e00502834802823e00534e00523d23a", - "0xb02802800534e0050280052e902824600534e005243005023028243005", - "0x34e00503100534602834200534e00534200502d0281a000534e0051a0005", - "0x280070282460313421a002800b00524600534e0052460050c0028031005", - "0x501c02802834e00501400501c02802834e00501b00534b02802834e005", - "0x1802824a00534e00502829b02824700534e00502834902802834e005018", - "0x34e00502834802824b00534e00524a24700702002824a00534e00524a005", - "0x2825a00534e00525800502302825800534e00524b24c00734702824c005", - "0x505100502d02800b00534e00500b00500b02802800534e0050280052e9", - "0x525a00534e00525a0050c002803100534e00503100534602805100534e", - "0x2802834e00501700534b02802834e00502800702825a03105100b02800b", - "0x900534e00502804602805200534e00502834902802834e00501400501c", - "0x2834802805d00534e00500905200702002800900534e005009005018028", - "0x534e00505b00502302805b00534e00505d05a00734702805a00534e005", - "0x502d02800b00534e00500b00500b02802800534e0050280052e902805e", - "0x534e00505e0050c002803100534e00503100534602805100534e005051", - "0x34e00501300534b02802834e00502800702805e03105100b02800b00505e", - "0x52a90050180282a900534e00502804702829b00534e005028349028028", - "0x2806000534e0050283480282e800534e0052a929b0070200282a900534e", - "0x280052e902806100534e00506200502302806200534e0052e8060007347", - "0x5100534e00505100502d02800b00534e00500b00500b02802800534e005", - "0xb02800b00506100534e0050610050c002803100534e005031005346028", - "0x502834902802834e00500a00504502802834e005028007028061031051", - "0x2002831800534e00531800501802831800534e00502823002805f00534e", - "0x532604200734702804200534e00502834802832600534e00531805f007", - "0x2802800534e0050280052e902833200534e00506900502302806900534e", - "0x503100534602800f00534e00500f00502d02805000534e00505000500b", - "0x2802833203100f05002800b00533200534e0053320050c002803100534e", - "0x702801000f00744f05005100734e00703100500700502802834e005028", - "0xb02802834e00502800a02804f00534e00500b00503102802834e005028", - "0x702801400545001304e00734e00704f00505102805100534e005051005", - "0x3000534e00504d00500f02804d00534e00501300505002802834e005028", - "0x4e00505102803000534e00503000501802804e00534e00504e00504f028", - "0x34e00501800524a02802834e00502800702834c00545101801700734e007", - "0x1302801c00534e00534b00524b02801b00534e00501700504f02834b005", - "0x524c02834a00534e00502801402802834e005028007028028452005028", - "0x534e00534900524b02801b00534e00534c00504f02834900534e00534a", - "0x5002802834e00502800702802000545301f00534e00701c00525802801c", - "0x34e00534700501802834700534e00534800500f02834800534e00501f005", - "0x280070280860c034603145402d02300734e0073470510072fd028347005", - "0x1a034400734e00701b00505102802300534e00502300500b02802834e005", - "0x504f02803200534e0051a000524a02802834e005028007028342005455", - "0x2802845600502801302834f00534e00503200524b02834100534e005344", - "0xc00534e00503300524c02803300534e00502801402802834e005028007", - "0x34f00525802834f00534e00500c00524b02834100534e00534200504f028", - "0x534e00503c00505002802834e00502800702803600545703c00534e007", - "0x72fd02822200534e00522200501802822200534e00504000500f028040", - "0xb02802834e00502800702804623022a03145822622400734e007222023", - "0x702804500545904704800734e00734100505102822400534e005224005", - "0x501b02802834e00504800534b02802834e00502834c02802834e005028", - "0x1c02802834e00502d0052fc02802834e0052260052fc02802834e005047", - "0x2823a00534e00502801f02823700534e00502834902802834e005030005", - "0x502834802823d00534e00523a23700702002823a00534e00523a005018", - "0x24300534e00524100502302824100534e00523d23e00734702823e00534e", - "0x70052f502822400534e00522400500b02802800534e0050280052e9028", - "0xa00534e00500a00534602805000534e00505000502d02800700534e005", - "0x502800702824300a05000722402805100524300534e0052430050c0028", - "0x24600534402824600534e00502808602802834e00504500534b02802834e", - "0x2824c24b00745a24a24700734e0072460502240311a002824600534e005", - "0x25800534e00522602d00737202802834e00502834c02802834e005028007", - "0x24700500b02805200534e00502807b02825a00534e005258030007373028", - "0x700534e0050070052f502824a00534e00524a00502d02824700534e005", - "0x25a00537402800a00534e00500a00534602802800534e0050280052e9028", - "0x5a05d00905134e00525a05200a02800724a2470500dc02825a00534e005", - "0x2834e0050280070282e800545b2a900534e00729b00508302829b05e05b", - "0x34e00506000503c02806000534e00502834902802834e0052a900507f028", - "0x22202805f00534e00506100504002802834e005062005036028061062007", - "0x34e00505b0052e902832600534e00531800522402831800534e00505f005", - "0x2d02805a00534e00505a0052f502800900534e00500900500b02805b005", - "0x34e0053260050c002805e00534e00505e00534602805d00534e00505d005", - "0x2e800502302802834e00502800702832605e05d05a00905b051005326005", - "0x900534e00500900500b02805b00534e00505b0052e902804200534e005", - "0x5e00534602805d00534e00505d00502d02805a00534e00505a0052f5028", - "0x4205e05d05a00905b05100504200534e0050420050c002805e00534e005", - "0x2802834e0052260052fc02802834e00502834c02802834e005028007028", - "0x6900534e00502834902802834e00503000501c02802834e00502d0052fc", - "0x33206900702002833200534e00533200501802833200534e005028230028", - "0x600534e00506b06a00734702806a00534e00502834802806b00534e005", - "0x24b00500b02802800534e0050280052e902807100534e005006005023028", - "0x24c00534e00524c00502d02800700534e0050070052f502824b00534e005", - "0x24b02805100507100534e0050710050c002800a00534e00500a005346028", - "0x52fc02802834e0052300052fc02802834e00502800702807100a24c007", - "0x2fc02802834e00503000501c02802834e00534100534b02802834e005046", - "0x2802845c00502801302807300534e00522a00500b02802834e00502d005", - "0x2802834e00534100534b02802834e00503600504802802834e005028007", - "0x534e00502300500b02802834e00502d0052fc02802834e00503000501c", - "0x34e00502800702802845d00502801302833100534e005073005376028073", - "0x501b00534b02802834e0050860052fc02802834e0050c00052fc028028", - "0x2801302807600534e00534600500b02802834e00503000501c02802834e", - "0x1b00534b02802834e00502000504802802834e00502800702802845e005", - "0x37602807600534e00505100500b02802834e00503000501c02802834e005", - "0x2845f00502801302807700534e00533100537602833100534e005076005", - "0x534e00505100500b02802834e00501400534b02802834e005028007028", - "0x534e00502804702807900534e00502834902802834e00502834c028077", - "0x34802832f00534e00533007900702002833000534e005330005018028330", - "0x34e00507c00502302807c00534e00532f04300734702804300534e005028", - "0x2f502807700534e00507700500b02802800534e0050280052e902807b005", - "0x34e00500a00534602805000534e00505000502d02800700534e005007005", - "0x702807b00a05000707702805100507b00534e00507b0050c002800a005", - "0x23002808100534e00502834902802834e00500b00504502802834e005028", - "0x34e00532c08100702002832c00534e00532c00501802832c00534e005028", - "0x2302832a00534e00508307f00734702807f00534e005028348028083005", - "0x34e00500f00500b02802800534e0050280052e902832900534e00532a005", - "0x34602801000534e00501000502d02800700534e0050070052f502800f005", - "0x1000700f02805100532900534e0053290050c002800a00534e00500a005", - "0x746000b00a00734e00700502800700502802834e00502802802832900a", - "0x502800a02800f00534e00503100503102802834e005028007028050051", - "0x46104f01000734e00700f00505102800a00534e00500a00500b02802834e", - "0x1300500f02801300534e00504f00505002802834e00502800702804e005", - "0x3000534e00501000504f02804d00534e00501400501002801400534e005", - "0x2834e00502800702802846200502801302801700534e00504d00504e028", - "0x504e00504f02834c00534e00501800504d02801800534e005028014028", - "0x46334b00534e00701700503002801700534e00534c00504e02803000534e", - "0x546434a01c00734e00734b00a00724702802834e00502800702801b005", - "0x703000505102801c00534e00501c00500b02802834e005028007028349", - "0x534e00502000505002802834e00502800702834800546502001f00734e", - "0x501802801f00534e00501f00504f02802300534e00534700500f028347", - "0x280070280c000546634602d00734e00701f00505102802300534e005023", - "0x2834400534e00502d00504f02808600534e00534600524a02802834e005", - "0x2802834e0050280070280284670050280130281a000534e00508600524b", - "0x34e0050c000504f02803200534e00534200524c02834200534e005028014", - "0x546834100534e0071a00052580281a000534e00503200524b028344005", - "0x503300500f02803300534e00534100505002802834e00502800702834f", - "0x3c00734e00700c01c0072fd02800c00534e00500c00501802800c00534e", - "0x3c00534e00503c00500b02802834e005028007028224222040031469036", - "0x24a02802834e00502800702823000546a22a22600734e007344005051028", - "0x34e00504600524b02804800534e00522600504f02804600534e00522a005", - "0x534e00502801402802834e00502800702802846b005028013028047005", - "0x524b02804800534e00523000504f02823700534e00504500524c028045", - "0x502800702823d00546c23a00534e00704700525802804700534e005237", - "0x1802824100534e00523e00500f02823e00534e00523a00505002802834e", - "0x24a24703146d24624300734e00724103c0072fd02824100534e005241005", - "0x704800505102824300534e00524300500b02802834e00502800702824b", - "0x2802834e00502834c02802834e00502800702825a00546e25824c00734e", - "0x2834e0052460052fc02802834e00525800501b02802834e00524c00534b", - "0x34e0050360052fc02802834e00534a00505b02802834e00502300501c028", - "0x500900501802800900534e00502801f02805200534e005028349028028", - "0x2805a00534e00502834802805d00534e00500905200702002800900534e", - "0x24300500b02805e00534e00505b00502302805b00534e00505d05a007347", - "0x700534e00500700534602800b00534e00500b00502d02824300534e005", - "0x2834e00502800702805e00700b24300a00505e00534e00505e0050c0028", - "0x34e00529b00534402829b00534e00502808602802834e00525a00534b028", - "0x2800702806206000746f2e82a900734e00729b00b2430311a002829b005", - "0x3600737202806100534e00502834902802834e00502834c02802834e005", - "0x34e0053180050c702831800534e00505f02300737302805f00534e005246", - "0xc902804200534e00504200537402802834e0053260050c6028042326007", - "0x6b0050cf02806b33200734e0050690050cb02806904200734e005042005", - "0x600534e00506a06100702002806a00534e00533200500f02802834e005", - "0x730052e702802834e00507100501c02807307100734e0050420050cb028", - "0x534e0050770050b002807700534e00533100537702807633100734e005", - "0xb002832f00534e00507600537702833000534e005079006007020028079", - "0x34e0050282f402807c00534e00504333000702002804300534e00532f005", - "0x4002802834e00508100503602832c08100734e00507c00503c02807b005", - "0x34e00508300525a02807b00534e00507b00501802808300534e00532c005", - "0x34e00708307b34a0072e800b05e0282a900534e0052a900500b028083005", - "0x532900504502802834e00502800702832532732803147032932a07f031", - "0x3602808e32000734e00532400503c02832400534e00502834902802834e", - "0x534e00531f00522202831f00534e00508e00504002802834e005320005", - "0x502d0282a900534e0052a900500b02808c00534e00531e00522402831e", - "0x534e00508c0050c002832a00534e00532a00534602807f00534e00507f", - "0x31d00534e00502834802802834e00502800702808c32a07f2a900a00508c", - "0x500b02808a00534e00531c00502302831c00534e00532531d007347028", - "0x534e00532700534602832800534e00532800502d0282a900534e0052a9", - "0x34e00502800702808a3273282a900a00508a00534e00508a0050c0028327", - "0x34e00502300501c02802834e0052460052fc02802834e00502834c028028", - "0x34e00502834902802834e0050360052fc02802834e00534a00505b028028", - "0x702002831a00534e00531a00501802831a00534e00502823002831b005", - "0x34e00531908800734702808800534e00502834802831900534e00531a31b", - "0x2d02806000534e00506000500b02836c00534e005090005023028090005", - "0x34e00536c0050c002800700534e00500700534602806200534e005062005", - "0x34e00524a0052fc02802834e00502800702836c00706206000a00536c005", - "0x50360052fc02802834e00504800534b02802834e00524b0052fc028028", - "0x24700500b02802834e00534a00505b02802834e00502300501c02802834e", - "0x23d00504802802834e00502800702802847100502801302831500534e005", - "0x501c02802834e0050360052fc02802834e00504800534b02802834e005", - "0x2831500534e00503c00500b02802834e00534a00505b02802834e005023", - "0x2802834e00502800702802847200502801302831400534e005315005376", - "0x2834e00534400534b02802834e0052240052fc02802834e0052220052fc", - "0x34e00504000500b02802834e00502300501c02802834e00534a00505b028", - "0x34e00534f00504802802834e005028007028028473005028013028313005", - "0x502300501c02802834e00534a00505b02802834e00534400534b028028", - "0x37602831400534e00531300537602831300534e00501c00500b02802834e", - "0x34b02802834e00502800702802847400502801302831200534e005314005", - "0x31200534e00501c00500b02802834e00534a00505b02802834e005348005", - "0x31000534e00502804602831100534e00502834902802834e00502834c028", - "0x2834802808d00534e00531031100702002831000534e005310005018028", - "0x534e00530e00502302830e00534e00508d30f00734702830f00534e005", - "0x534602800b00534e00500b00502d02831200534e00531200500b02830d", - "0x2830d00700b31200a00530d00534e00530d0050c002800700534e005007", - "0x30c00534e00534900500b02802834e00503000534b02802834e005028007", - "0x2802834e00501b00504802802834e005028007028028475005028013028", - "0x2834e00502834c02830c00534e00500a00500b02802834e00503000534b", - "0x34e00530800501802830800534e00502804702830b00534e005028349028", - "0x34702809400534e00502834802808700534e00530830b007020028308005", - "0x530c00500b02830700534e00509600502302809600534e005087094007", - "0x2800700534e00500700534602800b00534e00500b00502d02830c00534e", - "0x2802834e00502800702830700700b30c00a00530700534e0053070050c0", - "0x30600534e00502823002809900534e00502834902802834e005031005045", - "0x2834802809700534e00530609900702002830600534e005306005018028", - "0x534e00530400502302830400534e00509730500734702830500534e005", - "0x534602805000534e00505000502d02805100534e00505100500b028302", - "0x2830200705005100a00530200534e0053020050c002800700534e005007", - "0x2800f05000747605100b00734e00700702800700502802834e005028028", - "0x534e00500b00500b02801000534e00500a00503102802834e005028007", - "0x2802834e00502800702801300547704e04f00734e00701000505102800b", - "0x1400534e00502834902802834e00504e00501b02802834e00504f00534b", - "0x4d01400702002804d00534e00504d00501802804d00534e00502801f028", - "0x1800534e00503001700734702801700534e00502834802803000534e005", - "0x500537802800b00534e00500b00500b02834c00534e005018005023028", - "0x3100534e00503100534602805100534e00505100502d02800500534e005", - "0x34e00502800702834c03105100500b00b00534c00534e00534c0050c0028", - "0x534b00534402834b00534e00502808602802834e00501300534b028028", - "0x702834934a00747801c01b00734e00734b05100b0311a002834b00534e", - "0x2800500534e00500500537802801f00534e00502807b02802834e005028", - "0x1c00500a2e102803100534e00503100534602801c00534e00501c00502d", - "0x508302801b00534e00501b00500b02802334734802000a34e00501f031", - "0x34e00502d00507f02802834e00502800702834600547902d00534e007023", - "0x503602834408600734e0050c000503c0280c000534e005028349028028", - "0x34200534e0051a00052220281a000534e00534400504002802834e005086", - "0x2000537802801b00534e00501b00500b02803200534e005342005224028", - "0x34700534e00534700534602834800534e00534800502d02802000534e005", - "0x34e00502800702803234734802001b00b00503200534e0050320050c0028", - "0x537802801b00534e00501b00500b02834100534e005346005023028028", - "0x534e00534700534602834800534e00534800502d02802000534e005020", - "0x502800702834134734802001b00b00534100534e0053410050c0028347", - "0x3300501802803300534e00502823002834f00534e00502834902802834e", - "0x3c00534e00502834802800c00534e00503334f00702002803300534e005", - "0x500b02804000534e00503600502302803600534e00500c03c007347028", - "0x534e00534900502d02800500534e00500500537802834a00534e00534a", - "0x34a00b00504000534e0050400050c002803100534e005031005346028349", - "0x2834902802834e00500a00504502802834e005028007028040031349005", - "0x2822400534e00522400501802822400534e00502823002822200534e005", - "0x22622a00734702822a00534e00502834802822600534e005224222007020", - "0x5000534e00505000500b02804600534e00523000502302823000534e005", - "0x3100534602800f00534e00500f00502d02800500534e005005005378028", - "0x2804603100f00505000b00504600534e0050460050c002803100534e005", - "0x2800f05000747a05100b00734e00700700500700502802834e005028028", - "0x534e00500b00500b02801000534e00500a00503102802834e005028007", - "0x2802834e00502800702801300547b04e04f00734e00701000505102800b", - "0x501400501802804f00534e00504f00504f02801400534e00504e005050", - "0x34e00502800702801700547c03004d00734e00704f00505102801400534e", - "0x501400501c02802834e00503000501b02802834e00504d00534b028028", - "0x34c00501802834c00534e00502801f02801800534e00502834902802834e", - "0x1b00534e00502834802834b00534e00534c01800702002834c00534e005", - "0x52e902834a00534e00501c00502302801c00534e00534b01b007347028", - "0x534e00505100502d02800b00534e00500b00500b02802800534e005028", - "0x2800b00534a00534e00534a0050c002803100534e005031005346028051", - "0x2808602802834e00501700534b02802834e00502800702834a03105100b", - "0x34e00734905100b0311a002834900534e00534900534402834900534e005", - "0x534e00501400500f02802834e00502800702834734800747d02001f007", - "0x2000502d02801f00534e00501f00500b02802d00534e00502807b028023", - "0x3100534e00503100534602802800534e0050280052e902802000534e005", - "0xb34e00502302d03102802001f0510d402802300534e005023005018028", - "0x502800702803200547e34200534e0071a00050830281a03440860c0346", - "0x34100503c02834100534e00502834902802834e00534200507f02802834e", - "0xc00534e00503300504002802834e00534f00503602803334f00734e005", - "0x860052e902803600534e00503c00522402803c00534e00500c005222028", - "0xc000534e0050c000502d02834600534e00534600500b02808600534e005", - "0x34608600b00503600534e0050360050c002834400534e005344005346028", - "0x52e902804000534e00503200502302802834e0050280070280363440c0", - "0x534e0050c000502d02834600534e00534600500b02808600534e005086", - "0x8600b00504000534e0050400050c002834400534e0053440053460280c0", - "0x2834902802834e00501400501c02802834e0050280070280403440c0346", - "0x2822400534e00522400501802822400534e00502823002822200534e005", - "0x22622a00734702822a00534e00502834802822600534e005224222007020", - "0x2800534e0050280052e902804600534e00523000502302823000534e005", - "0x3100534602834700534e00534700502d02834800534e00534800500b028", - "0x2804603134734802800b00504600534e0050460050c002803100534e005", - "0x2804800534e00502834902802834e00501300534b02802834e005028007", - "0x504704800702002804700534e00504700501802804700534e005028047", - "0x2823a00534e00504523700734702823700534e00502834802804500534e", - "0x500b00500b02802800534e0050280052e902823d00534e00523a005023", - "0x2803100534e00503100534602805100534e00505100502d02800b00534e", - "0x2834e00502800702823d03105100b02800b00523d00534e00523d0050c0", - "0x534e00502823002823e00534e00502834902802834e00500a005045028", - "0x34802824300534e00524123e00702002824100534e005241005018028241", - "0x34e00524700502302824700534e00524324600734702824600534e005028", - "0x2d02805000534e00505000500b02802800534e0050280052e902824a005", - "0x34e00524a0050c002803100534e00503100534602800f00534e00500f005", - "0x502800700502802834e00502802802824a03100f05002800b00524a005", - "0x503100503102802834e00502800702805005100747f00b00a00734e007", - "0x4f01000734e00700f00505102800a00534e00500a00500b02800f00534e", - "0x504f02801300534e00504f00505002802834e00502800702804e005480", - "0x734e00701000505102801300534e00501300501802801000534e005010", - "0x1b02802834e00501400534b02802834e00502800702803000548104d014", - "0x2801700534e00502834902802834e00501300501c02802834e00504d005", - "0x501801700702002801800534e00501800501802801800534e00502801f", - "0x2801b00534e00534c34b00734702834b00534e00502834802834c00534e", - "0x500b00502d02800a00534e00500a00500b02801c00534e00501b005023", - "0x501c00534e00501c0050c002800700534e00500700534602800b00534e", - "0x8602802834e00503000534b02802834e00502800702801c00700b00a00a", - "0x734a00b00a0311a002834a00534e00534a00534402834a00534e005028", - "0x534e00502834902802834e00502800702834802000748201f34900734e", - "0x34700702002802300534e00502300501802802300534e0050282e0028347", - "0x34600534e00534600501802834600534e0050280d502802d00534e005023", - "0x503c02808600534e00501300500f0280c000534e00534602d007020028", - "0x534e0051a000504002802834e0053440050360281a034400734e0050c0", - "0xa30702834900534e00534900500b02834200534e00534200525a028342", - "0x2834e00502800702800c03334f03148334103200734e00734208600701f", - "0x3600503602804003600734e00503c00503c02803c00534e005028349028", - "0x2822400534e00522200522202822200534e00504000504002802834e005", - "0x503200502d02834900534e00534900500b02822600534e005224005224", - "0x522600534e0052260050c002834100534e00534100534602803200534e", - "0x34702822a00534e00502834802802834e00502800702822634103234900a", - "0x534900500b02804600534e00523000502302823000534e00500c22a007", - "0x2803300534e00503300534602834f00534e00534f00502d02834900534e", - "0x2802834e00502800702804603334f34900a00504600534e0050460050c0", - "0x4700534e00502823002804800534e00502834902802834e00501300501c", - "0x2834802804500534e00504704800702002804700534e005047005018028", - "0x534e00523a00502302823a00534e00504523700734702823700534e005", - "0x534602834800534e00534800502d02802000534e00502000500b02823d", - "0x2823d00734802000a00523d00534e00523d0050c002800700534e005007", - "0x2823e00534e00502834902802834e00504e00534b02802834e005028007", - "0x524123e00702002824100534e00524100501802824100534e005028047", - "0x2824700534e00524324600734702824600534e00502834802824300534e", - "0x500b00502d02800a00534e00500a00500b02824a00534e005247005023", - "0x524a00534e00524a0050c002800700534e00500700534602800b00534e", - "0x34902802834e00503100504502802834e00502800702824a00700b00a00a", - "0x24c00534e00524c00501802824c00534e00502823002824b00534e005028", - "0x25a00734702825a00534e00502834802825800534e00524c24b007020028", - "0x534e00505100500b02800900534e00505200502302805200534e005258", - "0x50c002800700534e00500700534602805000534e00505000502d028051", - "0x700502802834e00502802802800900705005100a00500900534e005009", - "0x503102802834e00502800702804f01000748400f05000734e00700a028", - "0x734e00704e00505102805000534e00505000500b02804e00534e005051", - "0x1b02802834e00501300534b02802834e00502800702804d005485014013", - "0x2801700534e00502801f02803000534e00502834902802834e005014005", - "0x502834802801800534e00501703000702002801700534e005017005018", - "0x1b00534e00534b00502302834b00534e00501834c00734702834c00534e", - "0x70052de02800500534e00500500537a02805000534e00505000500b028", - "0xf00534e00500f00502d02803100534e0050310052dd02800700534e005", - "0x505005000501b00534e00501b0050c002800b00534e00500b005346028", - "0x8602802834e00504d00534b02802834e00502800702801b00b00f031007", - "0x701c00f0500311a002801c00534e00501c00534402801c00534e005028", - "0x534e00502807b02802834e00502800702802001f00748634934a00734e", - "0x52dd02800700534e0050070052de02834a00534e00534a00500b028348", - "0x534e00534900502d02800500534e00500500537a02803100534e005031", - "0x280860c034602d02334705134e00534834900503100734a0512d7028349", - "0x34400507f02802834e0050280070281a000548734400534e007086005083", - "0x2834103200734e00534200503c02834200534e00502834902802834e005", - "0x34e00534f00522202834f00534e00534100504002802834e005032005036", - "0x37a02834700534e00534700500b02800c00534e005033005224028033005", - "0x34e00502d0052dd02802300534e0050230052de02834600534e005346005", - "0xc002800b00534e00500b0053460280c000534e0050c000502d02802d005", - "0x34e00502800702800c00b0c002d02334634705000500c00534e00500c005", - "0x537a02834700534e00534700500b02803c00534e0051a0005023028028", - "0x534e00502d0052dd02802300534e0050230052de02834600534e005346", - "0x50c002800b00534e00500b0053460280c000534e0050c000502d02802d", - "0x2834e00502800702803c00b0c002d02334634705000503c00534e00503c", - "0x34e00504000501802804000534e00502823002803600534e005028349028", - "0x34702822400534e00502834802822200534e005040036007020028040005", - "0x501f00500b02822a00534e00522600502302822600534e005222224007", - "0x2800700534e0050070052de02800500534e00500500537a02801f00534e", - "0x500b00534602802000534e00502000502d02803100534e0050310052dd", - "0x22a00b02003100700501f05000522a00534e00522a0050c002800b00534e", - "0x23000534e00502834902802834e00505100504502802834e005028007028", - "0x4623000702002804600534e00504600501802804600534e005028230028", - "0x4500534e00504804700734702804700534e00502834802804800534e005", - "0x500537a02801000534e00501000500b02823700534e005045005023028", - "0x3100534e0050310052dd02800700534e0050070052de02800500534e005", - "0x2370050c002800b00534e00500b00534602804f00534e00504f00502d028", - "0x2802834e00502802802823700b04f03100700501005000523700534e005", - "0x2802834e00502800702800f05000748805100b00734e007007028007005", - "0x701000505102800b00534e00500b00500b02801000534e00500a005031", - "0x2834e00504f00534b02802834e00502800702801300548904e04f00734e", - "0x534e00502801f02801400534e00502834902802834e00504e00501b028", - "0x34802803000534e00504d01400702002804d00534e00504d00501802804d", - "0x34e00501800502302801800534e00503001700734702801700534e005028", - "0x2d02800500534e00500500537a02800b00534e00500b00500b02834c005", - "0x34e00534c0050c002803100534e00503100534602805100534e005051005", - "0x501300534b02802834e00502800702834c03105100500b00b00534c005", - "0x311a002834b00534e00534b00534402834b00534e00502808602802834e", - "0x37a02802834e00502800702834934a00748a01c01b00734e00734b05100b", - "0x34e00502800a02802001f00734e0050050050da02800500534e005005005", - "0x34700548b34800534e00702000530c02801b00534e00501b00500b028028", - "0x534e00501f00537a02802834e00534800530b02802834e005028007028", - "0x548c34600534e00702d00530c02802d02300734e00501f0050da02801f", - "0x2834e00534600530b02802834e00502834c02802834e0050280070280c0", - "0x3440050360281a034400734e00508600503c02808600534e005028349028", - "0x2803200534e00534200522202834200534e0051a000504002802834e005", - "0x502300537a02801b00534e00501b00500b02834100534e005032005224", - "0x2803100534e00503100534602801c00534e00501c00502d02802300534e", - "0x2834e00502800702834103101c02301b00b00534100534e0053410050c0", - "0x502801302803300534e0050c00052d402834f00534e00502300537a028", - "0x3470052d402834f00534e00501f00537a02802834e00502800702802848d", - "0xb02800c00534e00503300502302802834e00502834c02803300534e005", - "0x34e00501c00502d02834f00534e00534f00537a02801b00534e00501b005", - "0xb00500c00534e00500c0050c002803100534e00503100534602801c005", - "0x23002803c00534e00502834902802834e00502800702800c03101c34f01b", - "0x34e00503603c00702002803600534e00503600501802803600534e005028", - "0x2302822400534e00504022200734702822200534e005028348028040005", - "0x34e00500500537a02834a00534e00534a00500b02822600534e005224005", - "0xc002803100534e00503100534602834900534e00534900502d028005005", - "0x2802834e00502800702822603134900534a00b00522600534e005226005", - "0x23000534e00502823002822a00534e00502834902802834e00500a005045", - "0x2834802804600534e00523022a00702002823000534e005230005018028", - "0x534e00504700502302804700534e00504604800734702804800534e005", - "0x502d02800500534e00500500537a02805000534e00505000500b028045", - "0x534e0050450050c002803100534e00503100534602800f00534e00500f", - "0x34e00502824102800b00534e00502824102804503100f00505000b005045", - "0x700502800700502802834e00502802802802834e005028243028050005", - "0x34e00503100503102802834e00502800702804e04f00748e01000f00734e", - "0x1300505102800f00534e00500f00500b02802834e00502800a028013005", - "0x34e00504d00505002802834e00502800702803000548f04d01400734e007", - "0x4f02834c00534e00501800501002801800534e00501700500f028017005", - "0x2849000502801302801b00534e00534c00504e02834b00534e005014005", - "0x534e00501c00504d02801c00534e00502801402802834e005028007028", - "0x503002801b00534e00534a00504e02834b00534e00503000504f02834a", - "0x500a00b00724602802834e00502800702834900549100a00534e00701b", - "0x502800702834800549202001f00734e00700a00f00724702800a00534e", - "0x49302334700734e00734b00505102801f00534e00501f00500b02802834e", - "0x5000724602805100534e00502300505002802834e00502800702802d005", - "0x534e00534700504f02834600534e00505100500f02805100534e005051", - "0x2802834e0050280070283440054940860c000734e007347005051028347", - "0x51a000524b02834200534e0050c000504f0281a000534e00508600524a", - "0x34e00502801402802834e00502800702802849500502801302803200534e", - "0x24b02834200534e00534400504f02834f00534e00534100524c028341005", - "0x2800702800c00549603300534e00703200525802803200534e00534f005", - "0x2834902803c00534e00503300505002802834e00502834c02802834e005", - "0x22200534e00503c00500f02804000534e00534200504002803600534e005", - "0x4000525a02801000534e00501000502d02801f00534e00501f00500b028", - "0x22200534e00522200501802803600534e00503600522602804000534e005", - "0x34e00722a00500902822a22622403134e00522203604001001f00b052028", - "0x4704800734e00523000505d02802834e005028007028046005497230005", - "0x503102802834e00502800702823700549804500534e00704700505a028", - "0x2800702824100549923e23d00734e00723a00505102823a00534e005048", - "0x503602802834e00523e00501b02802834e00523d00534b02802834e005", - "0x34902802834e00502000505b02802834e00534600501c02802834e005045", - "0x24600534e00524600501802824600534e00502801f02824300534e005028", - "0x24a00734702824a00534e00502834802824700534e005246243007020028", - "0x534e00522400500b02824c00534e00524b00502302824b00534e005247", - "0x50c002800700534e00500700534602822600534e00522600502d028224", - "0x534b02802834e00502800702824c00722622400a00524c00534e00524c", - "0x2825800534e00525800534402825800534e00502808602802834e005241", - "0x2834e00502800702805d00900749a05225a00734e0072582262240311a0", - "0x500700534602805200534e00505200502d02805a00534e00502807b028", - "0x2834600534e00534600501802802000534e0050200052d202800700534e", - "0x5b03134e00504534602005a0070520510d202804500534e005045005226", - "0x549b2a900534e00729b00508302825a00534e00525a00500b02829b05e", - "0x534e00502834902802834e0052a900507f02802834e0050280070282e8", - "0x504002802834e00506200503602806106200734e00506000503c028060", - "0x534e00531800522402831800534e00505f00522202805f00534e005061", - "0x534602805b00534e00505b00502d02825a00534e00525a00500b028326", - "0x2832605e05b25a00a00532600534e0053260050c002805e00534e00505e", - "0x534e00525a00500b02804200534e0052e800502302802834e005028007", - "0x50c002805e00534e00505e00534602805b00534e00505b00502d02825a", - "0x503602802834e00502800702804205e05b25a00a00504200534e005042", - "0x34902802834e00502000505b02802834e00534600501c02802834e005045", - "0x33200534e00533200501802833200534e00502823002806900534e005028", - "0x6a00734702806a00534e00502834802806b00534e005332069007020028", - "0x534e00500900500b02807100534e00500600502302800600534e00506b", - "0x50c002800700534e00500700534602805d00534e00505d00502d028009", - "0x504802802834e00502800702807100705d00900a00507100534e005071", - "0x5b02802834e00534600501c02802834e00504800504502802834e005237", - "0x534e00522600502d02807300534e00522400500b02802834e005020005", - "0x2834e00502000505b02802834e00502800702802849c005028013028331", - "0x522400500b02807600534e00504600502302802834e00534600501c028", - "0x2800700534e00500700534602822600534e00522600502d02822400534e", - "0x2802834e00502800702807600722622400a00507600534e0050760050c0", - "0x2802834e00502000505b02802834e00500c00504802802834e00502834c", - "0x534e00501f00500b02802834e00534200534b02802834e00534600501c", - "0x502829b02807700534e00502834902833100534e00501000502d028073", - "0x33000534e00507907700702002807900534e00507900501802807900534e", - "0x4300502302804300534e00533032f00734702832f00534e005028348028", - "0x33100534e00533100502d02807300534e00507300500b02807c00534e005", - "0x33107300a00507c00534e00507c0050c002800700534e005007005346028", - "0x34e00502d00534b02802834e00502834c02802834e00502800702807c007", - "0x34e00502834902802834e0050500052a902802834e00502000505b028028", - "0x702002808100534e00508100501802808100534e00502804602807b005", - "0x34e00532c08300734702808300534e00502834802832c00534e00508107b", - "0x2d02801f00534e00501f00500b02832a00534e00507f00502302807f005", - "0x34e00532a0050c002800700534e00500700534602801000534e005010005", - "0x34e0050500052a902802834e00502800702832a00701001f00a00532a005", - "0x502801302832900534e00534800500b02802834e00534b00534b028028", - "0x50500052a902802834e00534900504802802834e00502800702802849d", - "0xf00500b02802834e00500b0052a902802834e00534b00534b02802834e", - "0x2804702832800534e00502834902802834e00502834c02832900534e005", - "0x534e00532732800702002832700534e00532700501802832700534e005", - "0x502302832000534e00532532400734702832400534e005028348028325", - "0x534e00501000502d02832900534e00532900500b02808e00534e005320", - "0x32900a00508e00534e00508e0050c002800700534e005007005346028010", - "0x500052a902802834e00503100504502802834e00502800702808e007010", - "0x2823002831f00534e00502834902802834e00500b0052a902802834e005", - "0x534e00531e31f00702002831e00534e00531e00501802831e00534e005", - "0x502302831c00534e00508c31d00734702831d00534e00502834802808c", - "0x534e00504e00502d02804f00534e00504f00500b02808a00534e00531c", - "0x4f00a00508a00534e00508a0050c002800700534e00500700534602804e", - "0x49e00b00a00734e00700502800700502802834e00502802802808a00704e", - "0x500b02800f00534e00503100503102802834e005028007028050051007", - "0x2800702804e00549f04f01000734e00700f00505102800a00534e00500a", - "0x2801000534e00501000504f02801300534e00504f00505002802834e005", - "0x280300054a004d01400734e00701000505102801300534e005013005018", - "0x2802834e00504d00501b02802834e00501400534b02802834e005028007", - "0x1800534e00502801f02801700534e00502834902802834e00501300501c", - "0x2834802834c00534e00501801700702002801800534e005018005018028", - "0x534e00501b00502302801b00534e00534c34b00734702834b00534e005", - "0x534602800b00534e00500b00502d02800a00534e00500a00500b02801c", - "0x2801c00700b00a00a00501c00534e00501c0050c002800700534e005007", - "0x2834a00534e00502808602802834e00503000534b02802834e005028007", - "0x74a101f34900734e00734a00b00a0311a002834a00534e00534a005344", - "0x501300500f02834700534e00502834902802834e005028007028348020", - "0x34600734e00502d00503c02802d00534e00502334700702002802300534e", - "0x8600522202808600534e0050c000504002802834e0053460050360280c0", - "0x34900534e00534900500b0281a000534e00534400522402834400534e005", - "0x1a00050c002800700534e00500700534602801f00534e00501f00502d028", - "0x1300501c02802834e0050280070281a000701f34900a0051a000534e005", - "0x501802803200534e00502823002834200534e00502834902802834e005", - "0x534e00502834802834100534e00503234200702002803200534e005032", - "0xb02800c00534e00503300502302803300534e00534134f00734702834f", - "0x34e00500700534602834800534e00534800502d02802000534e005020005", - "0x502800702800c00734802000a00500c00534e00500c0050c0028007005", - "0x502804702803c00534e00502834902802834e00504e00534b02802834e", - "0x4000534e00503603c00702002803600534e00503600501802803600534e", - "0x22400502302822400534e00504022200734702822200534e005028348028", - "0xb00534e00500b00502d02800a00534e00500a00500b02822600534e005", - "0xb00a00a00522600534e0052260050c002800700534e005007005346028", - "0x34e00502834902802834e00503100504502802834e005028007028226007", - "0x702002823000534e00523000501802823000534e00502823002822a005", - "0x34e00504604800734702804800534e00502834802804600534e00523022a", - "0x2d02805100534e00505100500b02804500534e005047005023028047005", - "0x34e0050450050c002800700534e00500700534602805000534e005050005", - "0x700502800700502802834e00502802802804500705005100a005045005", - "0x34e00503100503102802834e0050280070280500510074a200b00a00734e", - "0x4a304f01000734e00700f00505102800a00534e00500a00500b02800f005", - "0x1300501c02801300534e00504f00505002802834e00502800702804e005", - "0x4d01400734e00701000505102801000534e00501000504f02802834e005", - "0x504f02801700534e00504d00505002802834e0050280070280300054a4", - "0x734e00701400505102801700534e00501700501802801400534e005014", - "0x1b02802834e00501800534b02802834e00502800702834b0054a534c018", - "0x2801b00534e00502834902802834e00501700501c02802834e00534c005", - "0x501c01b00702002801c00534e00501c00501802801c00534e00502801f", - "0x2801f00534e00534a34900734702834900534e00502834802834a00534e", - "0x500b00502d02800a00534e00500a00500b02802000534e00501f005023", - "0x502000534e0050200050c002800700534e00500700534602800b00534e", - "0x8602802834e00534b00534b02802834e00502800702802000700b00a00a", - "0x734800b00a0311a002834800534e00534800534402834800534e005028", - "0x534e00502834902802834e00502800702834602d0074a602334700734e", - "0x3c02834400534e0050860c000702002808600534e00501700500f0280c0", - "0x34e00534200504002802834e0051a00050360283421a000734e005344005", - "0xb02834f00534e00534100522402834100534e005032005222028032005", - "0x34e00500700534602802300534e00502300502d02834700534e005347005", - "0x502800702834f00702334700a00534f00534e00534f0050c0028007005", - "0x502823002803300534e00502834902802834e00501700501c02802834e", - "0x3c00534e00500c03300702002800c00534e00500c00501802800c00534e", - "0x4000502302804000534e00503c03600734702803600534e005028348028", - "0x34600534e00534600502d02802d00534e00502d00500b02822200534e005", - "0x34602d00a00522200534e0052220050c002800700534e005007005346028", - "0x34e00502834902802834e00503000534b02802834e005028007028222007", - "0x702002822600534e00522600501802822600534e005028046028224005", - "0x34e00522a23000734702823000534e00502834802822a00534e005226224", - "0x2d02800a00534e00500a00500b02804800534e005046005023028046005", - "0x34e0050480050c002800700534e00500700534602800b00534e00500b005", - "0x34e00504e00534b02802834e00502800702804800700b00a00a005048005", - "0x504500501802804500534e00502804702804700534e005028349028028", - "0x2823a00534e00502834802823700534e00504504700702002804500534e", - "0xa00500b02823e00534e00523d00502302823d00534e00523723a007347", - "0x700534e00500700534602800b00534e00500b00502d02800a00534e005", - "0x2834e00502800702823e00700b00a00a00523e00534e00523e0050c0028", - "0x534e00502823002824100534e00502834902802834e005031005045028", - "0x34802824600534e00524324100702002824300534e005243005018028243", - "0x34e00524a00502302824a00534e00524624700734702824700534e005028", - "0x34602805000534e00505000502d02805100534e00505100500b02824b005", - "0x24b00705005100a00524b00534e00524b0050c002800700534e005007005", - "0x500510074a700b00a00734e00700502800700502802834e005028028028", - "0x34e00500a00500b02800f00534e00503100503102802834e005028007028", - "0x2834e00502800702804e0054a804f01000734e00700f00505102800a005", - "0x34e00502800a02802834e00501300501c02801300534e00504f005050028", - "0x54a904d01400734e00701000505102801000534e00501000504f028028", - "0x501700500f02801700534e00504d00505002802834e005028007028030", - "0x2834b00534e00501400504f02834c00534e00501800501002801800534e", - "0x2802834e0050280070280284aa00502801302801b00534e00534c00504e", - "0x34e00503000504f02834a00534e00501c00504d02801c00534e005028014", - "0x54ab34900534e00701b00503002801b00534e00534a00504e02834b005", - "0x3470054ac34802000734e00734900a00701702802834e00502800702801f", - "0x34e00734b00505102802000534e00502000500b02802834e005028007028", - "0xc000534e00502d00505002802834e0050280070283460054ad02d023007", - "0x230050510280c000534e0050c000501802802300534e00502300504f028", - "0x2834e00502834c02802834e0050280070281a00054ae34408600734e007", - "0x34e0050c000501c02802834e00534400501b02802834e00508600534b028", - "0x34e00502801f02834200534e00502834902802834e00534800534a028028", - "0x2834100534e00503234200702002803200534e005032005018028032005", - "0x503300502302803300534e00534134f00734702834f00534e005028348", - "0x2800b00534e00500b00502d02802000534e00502000500b02800c00534e", - "0x700b02000a00500c00534e00500c0050c002800700534e005007005346", - "0x2834e0051a000534b02802834e00502834c02802834e00502800702800c", - "0xb0200311a002803c00534e00503c00534402803c00534e005028086028", - "0xc000500f02802834e0050280070282242220074af04003600734e00703c", - "0x23022600734e0052260050bf02822a00534e00502834202822600534e005", - "0x4000b03302803600534e00503600500b02822a00534e00522a00534f028", - "0x2834e0050280070282370450470314b004804600734e00723034822a007", - "0x23d00503c02823d00534e00522623a00702002823a00534e005028349028", - "0x24300534e00524100504002802834e00523e00503602824123e00734e005", - "0x3600500b02824700534e00524600522402824600534e005243005222028", - "0x4800534e00504800534602804600534e00504600502d02803600534e005", - "0x2834e00502800702824704804603600a00524700534e0052470050c0028", - "0x523724a00734702824a00534e00502834802802834e00522600501c028", - "0x2803600534e00503600500b02824c00534e00524b00502302824b00534e", - "0x524c0050c002804500534e00504500534602804700534e00504700502d", - "0x50c000501c02802834e00502800702824c04504703600a00524c00534e", - "0x502823002825800534e00502834902802834e00534800534a02802834e", - "0x5200534e00525a25800702002825a00534e00525a00501802825a00534e", - "0x5d00502302805d00534e00505200900734702800900534e005028348028", - "0x22400534e00522400502d02822200534e00522200500b02805a00534e005", - "0x22422200a00505a00534e00505a0050c002800700534e005007005346028", - "0x34e00534600534b02802834e00502834c02802834e00502800702805a007", - "0x34e00502829b02805b00534e00502834902802834e00534800534a028028", - "0x2829b00534e00505e05b00702002805e00534e00505e00501802805e005", - "0x52e80050230282e800534e00529b2a90073470282a900534e005028348", - "0x2800b00534e00500b00502d02802000534e00502000500b02806000534e", - "0x700b02000a00506000534e0050600050c002800700534e005007005346", - "0x34e00534700500b02802834e00534b00534b02802834e005028007028060", - "0x34e00501f00504802802834e0050280070280284b1005028013028062005", - "0x502834c02806200534e00500a00500b02802834e00534b00534b028028", - "0x5f00501802805f00534e00502804602806100534e00502834902802834e", - "0x32600534e00502834802831800534e00505f06100702002805f00534e005", - "0x500b02806900534e00504200502302804200534e005318326007347028", - "0x534e00500700534602800b00534e00500b00502d02806200534e005062", - "0x34e00502800702806900700b06200a00506900534e0050690050c0028007", - "0x34e00502804702833200534e00502834902802834e00504e00534b028028", - "0x2806a00534e00506b33200702002806b00534e00506b00501802806b005", - "0x507100502302807100534e00506a00600734702800600534e005028348", - "0x2800b00534e00500b00502d02800a00534e00500a00500b02807300534e", - "0x700b00a00a00507300534e0050730050c002800700534e005007005346", - "0x534e00502834902802834e00503100504502802834e005028007028073", - "0x33100702002807600534e00507600501802807600534e005028230028331", - "0x534e00507707900734702807900534e00502834802807700534e005076", - "0x502d02805100534e00505100500b02832f00534e005330005023028330", - "0x534e00532f0050c002800700534e00500700534602805000534e005050", - "0x34e00700502800700502802834e00502802802832f00705005100a00532f", - "0x534e00503100503102802834e0050280070280500510074b200b00a007", - "0x54b304f01000734e00700f00505102800a00534e00500a00500b02800f", - "0x501000504f02801300534e00504f00505002802834e00502800702804e", - "0x4d01400734e00701000505102801300534e00501300501802801000534e", - "0x504f02801700534e00504d00505002802834e0050280070280300054b4", - "0x734e00701400505102801700534e00501700501802801400534e005014", - "0x1b02802834e00501800534b02802834e00502800702834b0054b534c018", - "0x2802834e00501700501c02802834e00501300501c02802834e00534c005", - "0x534e00501c00501802801c00534e00502801f02801b00534e005028349", - "0x734702834900534e00502834802834a00534e00501c01b00702002801c", - "0x34e00500a00500b02802000534e00501f00502302801f00534e00534a349", - "0xc002800700534e00500700534602800b00534e00500b00502d02800a005", - "0x34b02802834e00502800702802000700b00a00a00502000534e005020005", - "0x34800534e00534800534402834800534e00502808602802834e00534b005", - "0x34e00502800702834602d0074b602334700734e00734800b00a0311a0028", - "0x1300500f02808600534e0050c00050db0280c000534e0050282d5028028", - "0x34400734e0053440050bf0281a000534e00501700500f02834400534e005", - "0x534f02834100534e00502834202803200534e0051a03420072dc028342", - "0x534e00503200501802808600534e0050860052cf02834100534e005341", - "0x734e00703208634100702300b03302834700534e00534700500b028032", - "0x4000534e00502834902802834e00502800702803603c00c0314b703334f", - "0x3602822622400734e00522200503c02822200534e005344040007020028", - "0x534e00522a00522202822a00534e00522600504002802834e005224005", - "0x502d02834700534e00534700500b02804600534e005230005224028230", - "0x534e0050460050c002803300534e00503300534602834f00534e00534f", - "0x2834e00534400501c02802834e00502800702804603334f34700a005046", - "0x4700502302804700534e00503604800734702804800534e005028348028", - "0xc00534e00500c00502d02834700534e00534700500b02804500534e005", - "0xc34700a00504500534e0050450050c002803c00534e00503c005346028", - "0x501700501c02802834e00501300501c02802834e00502800702804503c", - "0x23a00501802823a00534e00502823002823700534e00502834902802834e", - "0x23e00534e00502834802823d00534e00523a23700702002823a00534e005", - "0x500b02824300534e00524100502302824100534e00523d23e007347028", - "0x534e00500700534602834600534e00534600502d02802d00534e00502d", - "0x34e00502800702824300734602d00a00524300534e0052430050c0028007", - "0x34e00502834902802834e00501300501c02802834e00503000534b028028", - "0x702002824700534e00524700501802824700534e005028046028246005", - "0x34e00524a24b00734702824b00534e00502834802824a00534e005247246", - "0x2d02800a00534e00500a00500b02825800534e00524c00502302824c005", - "0x34e0052580050c002800700534e00500700534602800b00534e00500b005", - "0x34e00504e00534b02802834e00502800702825800700b00a00a005258005", - "0x505200501802805200534e00502804702825a00534e005028349028028", - "0x2805d00534e00502834802800900534e00505225a00702002805200534e", - "0xa00500b02805b00534e00505a00502302805a00534e00500905d007347", - "0x700534e00500700534602800b00534e00500b00502d02800a00534e005", - "0x2834e00502800702805b00700b00a00a00505b00534e00505b0050c0028", - "0x534e00502823002805e00534e00502834902802834e005031005045028", - "0x3480282a900534e00529b05e00702002829b00534e00529b00501802829b", - "0x34e00506000502302806000534e0052a92e80073470282e800534e005028", - "0x34602805000534e00505000502d02805100534e00505100500b028062005", - "0x6200705005100a00506200534e0050620050c002800700534e005007005", - "0xf0500074b805100b00734e00700502800700502802834e00502834c028", - "0x500b00500b02801000a00734e00500a0050bf02802834e005028007028", - "0x2802834e00502800702804f0054b902834e00701000531d02800b00534e", - "0x504e0070072cd02804e00534e0050310052ce02802834e00500a00501c", - "0x2800b00534e00500b00500b02801400534e0050130050df02801300534e", - "0x1405100b03100501400534e0050140052db02805100534e00505100502d", - "0x534e00500700503102802834e00504f00531c02802834e005028007028", - "0x280180054ba01703000734e00704d00505102802834e00502800a02804d", - "0x534e00534c00500f02834c00534e00501700505002802834e005028007", - "0x504e02801c00534e00503000504f02801b00534e00534b00501002834b", - "0x2801402802834e0050280070280284bb00502801302834a00534e00501b", - "0x1c00534e00501800504f02801f00534e00534900504d02834900534e005", - "0x34a00503002802000534e00501c00504002834a00534e00501f00504e028", - "0x2802834e00502834c02802834e0050280070283470054bc34800534e007", - "0x2d00a00708c02802d00534e00502823d02802300534e005348031007020", - "0x5100534e00505100502d02800b00534e00500b00500b02834600534e005", - "0x34600501802802300534e00502300522602802000534e00502000525a028", - "0x310053440860c003134e00534602302005100b00b05202834600534e005", - "0x500a00501c02802834e00502834c02802834e0050280070283440860c0", - "0x72cd0281a000534e0053470050e102802834e00503100503602802834e", - "0x34e00500b00500b02803200534e0053420050df02834200534e0051a0020", - "0x3100503200534e0050320052db02805100534e00505100502d02800b005", - "0x3100503602802834e00500a00501c02802834e00502800702803205100b", - "0x2823002834100534e00502834902802834e00500700504502802834e005", - "0x534e00534f34100702002834f00534e00534f00501802834f00534e005", - "0x52d802803c00534e00503300c00734702800c00534e005028348028033", - "0x534e00500f00502d02805000534e00505000500b02803600534e00503c", - "0x2834e00502834c02803600f05003100503600534e0050360052db02800f", - "0x2834e0050280070280500510074bd00b00a00734e007005028007005028", - "0xf00505102800a00534e00500a00500b02800f00534e005031005031028", - "0x34e00504f00505002802834e00502800702804e0054be04f01000734e007", - "0x2002801400534e00501400501802801400534e00501300500f028013005", - "0x500a00500b02803000534e00501000504002804d00534e005014007007", - "0x2804d00534e00504d00522602800b00534e00500b00502d02800a00534e", - "0x34c01801703134e00503004d00b00a00a06902803000534e00503000525a", - "0x1402802834e00504e00534b02802834e00502800702834c018017031005", - "0x34e00501b0050e302801b00534e00534b0070072d902834b00534e005028", - "0x2da02800b00534e00500b00502d02800a00534e00500a00500b02801c005", - "0x504502802834e00502800702801c00b00a03100501c00534e00501c005", - "0x23002834a00534e00502834902802834e00500700503602802834e005031", - "0x34e00534934a00702002834900534e00534900501802834900534e005028", - "0x2cb02834800534e00501f02000734702802000534e00502834802801f005", - "0x34e00505000502d02805100534e00505100500b02834700534e005348005", - "0x34e00502834c02834705005103100534700534e0053470052da028050005", - "0x34e0050280070280500510074bf00b00a00734e007005028007005028028", - "0x505102800a00534e00500a00500b02800f00534e005007005031028028", - "0x504f00505002802834e00502800702804e0054c004f01000734e00700f", - "0x2801400534e00501400501802801400534e00501300500f02801300534e", - "0xa00500b02803000534e00501000504002804d00534e005014031007020", - "0x3000534e00503000525a02800b00534e00500b00502d02800a00534e005", - "0x1801703134e00504d03000b00a00a07302804d00534e00504d005226028", - "0x2802834e00504e00534b02802834e00502800702834c01801703100534c", - "0x501b0050e302801b00534e00534b0310072d902834b00534e005028014", - "0x2800b00534e00500b00502d02800a00534e00500a00500b02801c00534e", - "0x3602802834e00502800702801c00b00a03100501c00534e00501c0052da", - "0x2834a00534e00502834902802834e00500700504502802834e005031005", - "0x534934a00702002834900534e00534900501802834900534e005028230", - "0x2834800534e00501f02000734702802000534e00502834802801f00534e", - "0x505000502d02805100534e00505100500b02834700534e0053480052cb", - "0x700508d02834705005103100534700534e0053470052da02805000534e", - "0x501802800b00534e00502823a02800a00534e00502834902802834e005", - "0x34e00505100503c02805100534e00500b00a00702002800b00534e00500b", - "0x25a02801000534e00500f00504002802834e00505000503602800f050007", - "0x50100052c302804f01000734e0050100052c302801000534e005010005", - "0x3004d0314c101401300734e00704e04f00502800a2c502804e01000734e", - "0x1401303109602801300534e00501300502d02802834e005028007028017", - "0x282c002802834e00502800702801c01b34b0314c234c01800734e007031", - "0x34a00534e00534a00501802801800534e00501800502d02834a00534e005", - "0x280070283473480200314c301f34900734e00701034a34c01800a307028", - "0x2c002802d00534e0050230050db02802300534e0050282d502802834e005", - "0x34900534e00534900502d0280c000534e00502834202834600534e005028", - "0x34600501802802d00534e00502d0052cf0280c000534e0050c000534f028", - "0x1a00314c434408600734e00734602d0c001f34900b03302834600534e005", - "0x34e0050282bf02834100534e00502834902802834e005028007028032342", - "0x2803300534e00534f34100702002834f00534e00534f00501802834f005", - "0x503c0050e902803c00534e00503300c00734702800c00534e005028348", - "0x2834400534e00534400534602808600534e00508600502d02803600534e", - "0x34802802834e00502800702803634408603100503600534e0050360052bd", - "0x34e0052220050e902822200534e00503204000734702804000534e005028", - "0x2bd02834200534e0053420053460281a000534e0051a000502d028224005", - "0x2834802802834e0050280070282243421a003100522400534e005224005", - "0x534e00522a0050e902822a00534e00534722600734702822600534e005", - "0x52bd02834800534e00534800534602802000534e00502000502d028230", - "0x1000504502802834e00502800702823034802003100523000534e005230", - "0x2804800534e00501c04600734702804600534e00502834802802834e005", - "0x501b00534602834b00534e00534b00502d02804700534e0050480050e9", - "0x502800702804701b34b03100504700534e0050470052bd02801b00534e", - "0x502834802802834e00503100507c02802834e00501000504502802834e", - "0x23a00534e0052370050e902823700534e00501704500734702804500534e", - "0x23a0052bd02803000534e00503000534602804d00534e00504d00502d028", - "0x502800700502802834e00502834c02823a03004d03100523a00534e005", - "0x500b0052bb02802834e00502800702804f0100074c500f05000734e007", - "0x3100734e0050310052bb02801300534e00504e0052ba02804e00b00734e", - "0x280284c602834e0070130140072b702805000534e00505000500b028014", - "0x34e00504d00504002804d05100734e00505100506a02802834e005028007", - "0x2801800534e00501700504002801700a00734e00500a00506a028030005", - "0x502800702834a01c01b0314c734b34c00734e00701803000700f00a2c5", - "0x502d02834900534e00534900532502834900534e0050280ec02802834e", - "0x73490310500312b602834b00534e00534b00534602834c00534e00534c", - "0x34e00501f00500b02802834e0050280070283473480074c802001f00734e", - "0x32502834b00534e00534b00534602834c00534e00534c00502d02801f005", - "0x34e00500b00532502800a00534e00500a00504f02802000534e005020005", - "0x5100b00a02034b34c01f05032402805100534e00505100504f02800b005", - "0x2802834e0050280070280c034602d02300a0050c034602d02300a34e005", - "0x2834e00500b00532902802834e00505100534b02802834e005347005329", - "0x534e0050282b302808600534e00502834902802834e00500a00534b028", - "0x3480281a000534e00534408600702002834400534e005344005018028344", - "0x34e0050320052b202803200534e0051a034200734702834200534e005028", - "0x34602834c00534e00534c00502d02834800534e00534800500b028341005", - "0x34134b34c34800a00534100534e0053410052b102834b00534e00534b005", - "0x2834e00500b00532902802834e00505100534b02802834e005028007028", - "0x534e00502834802802834e00503100532902802834e00500a00534b028", - "0xb02800c00534e0050330052b202803300534e00534a34f00734702834f", - "0x34e00501c00534602801b00534e00501b00502d02805000534e005050005", - "0x502800702800c01c01b05000a00500c00534e00500c0052b102801c005", - "0xa00534b02802834e00500b00532902802834e00505100534b02802834e", - "0x2803600534e00503c0310072b002803c00534e00502801402802834e005", - "0x500f00502d02805000534e00505000500b02804000534e0050360052af", - "0x504000534e0050400052b102800700534e00500700534602800f00534e", - "0x32902802834e00505100534b02802834e00502800702804000700f05000a", - "0x2802834e00503100532902802834e00500a00534b02802834e00500b005", - "0x534e00522400501802822400534e00502823002822200534e005028349", - "0x734702822a00534e00502834802822600534e005224222007020028224", - "0x34e00501000500b02804600534e0052300052b202823000534e00522622a", - "0x2b102800700534e00500700534602804f00534e00504f00502d028010005", - "0x700534e00500500503102804600704f01000a00504600534e005046005", - "0x24a02802834e00502800702800b0054c900a03100734e007007005051028", - "0x34e00505100524b02805000534e00503100504f02805100534e00500a005", - "0x534e00502801402802834e0050280070280284ca00502801302800f005", - "0x524b02805000534e00500b00504f02804f00534e00501000524c028010", - "0x34e00504e00504002804e05000734e00505000506a02800f00534e00504f", - "0x2802834e00502800702804d0054cb01400534e00700f005258028013005", - "0x501700501802801700534e00503000500f02803000534e005014005050", - "0x502800702834b0054cc34c01800734e00701702800732a02801700534e", - "0x505102801800534e00501800500b02802834e00501300504502802834e", - "0x501c00524a02802834e00502800702834a0054cd01c01b00734e007050", - "0x2802000534e00534900524b02801f00534e00501b00504f02834900534e", - "0x24c02834800534e00502801402802834e0050280070280284ce005028013", - "0x34e00534700524b02801f00534e00534a00504f02834700534e005348005", - "0x2802d00534e00502300504002802301f00734e00501f00506a028020005", - "0x34600505002802834e0050280070280c00054cf34600534e007020005258", - "0x34400534e00534400501802834400534e00508600500f02808600534e005", - "0x2802834e0050280070280320054d03421a000734e00734401800732a028", - "0x34e00701f0050510281a000534e0051a000500b02802834e00502d005045", - "0xc00534e00534f00505002802834e0050280070280330054d134f341007", - "0x34100504f02803600534e00503c00501002803c00534e00500c00500f028", - "0x70280284d200502801302822200534e00503600504e02804000534e005", - "0x2822600534e00522400504d02822400534e00502801402802834e005028", - "0x504000504002822200534e00522600504e02804000534e00503300504f", - "0x2834e0050280070280460054d323000534e00722200503002822a00534e", - "0x2802834e0050280070280450054d404704800734e0072301a0007247028", - "0x500b02823a00534e0052370052ab02823700534e00504734234c0312ae", - "0x534e00523a0050f602822a00534e00522a00525a02804800534e005048", - "0x2802834e00534c00532902802834e00502800702823a22a04803100523a", - "0x284d500502801302823d00534e00504500500b02802834e005342005329", - "0x2834e00534c00532902802834e00504600504802802834e005028007028", - "0x34e00502801402823d00534e0051a000500b02802834e005342005329028", - "0xf602822a00534e00522a00525a02824100534e00523e0050f802823e005", - "0x532902802834e00502800702824122a23d03100524100534e005241005", - "0x2824300534e00503200500b02802834e00501f00534b02802834e00534c", - "0x32902802834e0050c000504802802834e0050280070280284d6005028013", - "0x24300534e00501800500b02802834e00501f00534b02802834e00534c005", - "0x502d00525a02824700534e0052460050f802824600534e005028014028", - "0x502800702824702d24303100524700534e0052470050f602802d00534e", - "0x2801302824a00534e00534b00500b02802834e00505000534b02802834e", - "0x5000534b02802834e00504d00504802802834e0050280070280284d7005", - "0xf802824b00534e00502801402824a00534e00502800500b02802834e005", - "0x34e00524c0050f602801300534e00501300525a02824c00534e00524b005", - "0x534e00502824102800a00534e00502824102824c01324a03100524c005", - "0x34e00502824102804f00534e00502824102800f00534e005028241028051", - "0x502824302801700534e00502824102804d00534e005028060028013005", - "0x1800505102801800534e00500700503102802834e00502834c02802834e", - "0x34e00534b00505002802834e00502800702801b0054d834b34c00734e007", - "0x2801c00534e00501000500f02801000534e00501004f007246028010005", - "0x2801f0054d934934a00734e00734c00505102834c00534e00534c00504f", - "0x534e00502000500f02802000534e00534900505002802834e005028007", - "0x504e02802300534e00534a00504f02834700534e005348005010028348", - "0x2801402802834e0050280070280284da00502801302802d00534e005347", - "0x2300534e00501f00504f0280c000534e00534600504d02834600534e005", - "0x504002808602300734e00502300506a02802d00534e0050c000504e028", - "0x4db05000534e00702d00503002802834e00502800a02834400534e005086", - "0x724702805000534e00505000f00724602802834e0050280070281a0005", - "0x34400504502802834e0050280070283410054dc03234200734e007050028", - "0x3334f00734e00702300505102834200534e00534200500b02802834e005", - "0x504f02803c00534e00503300524a02802834e00502800702800c0054dd", - "0x280284de00502801302804000534e00503c00524b02803600534e00534f", - "0x22400534e00522200524c02822200534e00502801402802834e005028007", - "0x3600504002804000534e00522400524b02803600534e00500c00504f028", - "0x34e0050280070282300054df22a00534e00704000525802822600534e005", - "0xf02803100534e00503100a00724602803100534e00522a005050028028", - "0x2370450314e004704800734e0070463420072fd02804600534e005031005", - "0x522600525a02804800534e00504800500b02802834e00502800702823a", - "0x534e00723e0052a802823e23d00734e0052260480072aa02822600534e", - "0x2824724600734e0052410052a702802834e0050280070282430054e1241", - "0x24600503102802834e00502800702824a0054e201400534e0072470050fa", - "0x734e00724b00505102801400534e00501404d00704202824b00534e005", - "0x2803000534e00525800505002802834e00502800702825a0054e325824c", - "0x24c00505102803000534e00503001700724602824c00534e00524c00504f", - "0x34e00500900505002802834e00502800702805d0054e400905200734e007", - "0x2804e00534e00504e01300724602805200534e00505200504f02804e005", - "0x505002802834e00502800702805e0054e505b05a00734e007052005051", - "0x534e00504e00500f02829b00534e00503000500f02800b00534e00505b", - "0x4f0282e800534e00500b00500f02800b00534e00500b0510072460282a9", - "0x70280610054e606206000734e00705a00505102805a00534e00505a005", - "0x31800534e00506000504f02805f00534e00506200524a02802834e005028", - "0x2834e0050280070280284e700502801302832600534e00505f00524b028", - "0x506100504f02806900534e00504200524c02804200534e005028014028", - "0x4e833200534e00732600525802832600534e00506900524b02831800534e", - "0x50280fc02806a00534e00533200505002802834e00502800702806b005", - "0x2807300534e00506a00500f02807100534e00531800504002800600534e", - "0x507100525a02800500534e00500500502d02823d00534e00523d00500b", - "0x2807300534e00507300501802800600534e0050060050fb02807100534e", - "0x534e0070770052a602807707633103134e00507300607100523d00b0f9", - "0x2804332f00734e0050790052a502802834e0050280070283300054e9079", - "0x502800702807b0054ea07c00534e00704300510202802834e00502800a", - "0x10102802834e00508100510302832c08100734e00507c00510402802834e", - "0x34e00532f00503102807f00534e0050830052a402808300534e00532c005", - "0x1302832800534e00507f0052a302832900534e00532a00504f02832a005", - "0x3102832700534e00507b00510a02802834e0050280070280284eb005028", - "0x34e0053270052a302832900534e00532500504f02832500534e00532f005", - "0x2802834e0050280070283200054ec32400534e00732800510b028328005", - "0x524a02802834e00502800702831e0054ed31f08e00734e007329005051", - "0x534e00508c00524b02831d00534e00508e00504f02808c00534e00531f", - "0x8a00534e00502801402802834e0050280070280284ee00502801302831c", - "0x31b00524b02831d00534e00531e00504f02831b00534e00508a00524c028", - "0x31900534e00731c00525802831a00534e00531d00504002831c00534e005", - "0x500f02809000534e00531900505002802834e0050280070280880054ef", - "0x34e00736c3310072fd02836c00534e00536c00501802836c00534e005090", - "0x34e00531500500b02802834e0050280070283113123130314f0314315007", - "0x8d31000734e00531a3150072aa02831a00534e00531a00525a028315005", - "0x52a702802834e00502800702830e0054f130f00534e00708d0052a8028", - "0x280070283080054f230b00534e00730c0050fa02830c30d00734e00530f", - "0x9609400734e00708700505102808700534e00530d00503102802834e005", - "0x504f02809900534e00509600524a02802834e0050280070283070054f3", - "0x280284f400502801302809700534e00509900524b02830600534e005094", - "0x30400534e00530500524c02830500534e00502801402802834e005028007", - "0x30600506a02809700534e00530400524b02830600534e00530700504f028", - "0x534e00709700525802830100534e00530200504002830230600734e005", - "0xf0282ff00534e0050a200505002802834e0050280070283000054f50a2", - "0x72fe3100071090282fe00534e0052fe0050180282fe00534e0052ff005", - "0x2834e00530100504502802834e0050280070282fa0054f62fc2fd00734e", - "0x2f80054f70a92f900734e0073060050510282fd00534e0052fd00500b028", - "0x34e0052f900504f0280b000534e0050a900524a02802834e005028007028", - "0x50280070280284f80050280130282f700534e0050b000524b0280ac005", - "0x504f0280b400534e0052f500524c0282f500534e00502801402802834e", - "0x534e0050ac0050400282f700534e0050b400524b0280ac00534e0052f8", - "0x5002802834e0050280070280b90054f92f300534e0072f70052580280b6", - "0x34e0052f00050180282f000534e0052f100500f0282f100534e0052f3005", - "0x34e0050280070282ed0054fa2ee2ef00734e0072f02fd0071090282f0005", - "0x72aa0280b600534e0050b600525a0282ef00534e0052ef00500b028028", - "0x70282ea0054fb2eb00534e0070bf0052a80280bf2ec00734e0050b62ef", - "0x534e0070530050fa0280532e900734e0052eb0052a702802834e005028", - "0x1c01410c02802834e00502834c02802834e0050280070283730054fc372", - "0x3740052a102837400534e0053722ee2fc30b3143242e82a929b014047032", - "0x534e00537600502502837600534e0050dc2e90072a00280dc00534e005", - "0x511302807600534e00507600502d0282ec00534e0052ec00500b0280c7", - "0x502834c02802834e0050280070280c70762ec0310050c700534e0050c7", - "0x2fc00522a02802834e0052ee00522a02802834e00501c00501c02802834e", - "0x511202802834e0053140052fc02802834e00530b00504502802834e005", - "0x1c02802834e0052a900501c02802834e0052e800501c02802834e005324", - "0x2802834e0050470052fc02802834e00501400504502802834e00529b005", - "0x50c62e90072a00280c600534e00537300511102802834e00503200505b", - "0x282ec00534e0052ec00500b0280cb00534e0050c90050250280c900534e", - "0xcb0762ec0310050cb00534e0050cb00511302807600534e00507600502d", - "0x2802834e00503200505b02802834e00502834c02802834e005028007028", - "0x2834e0052fc00522a02802834e0052ee00522a02802834e00501c00501c", - "0x34e00532400511202802834e0053140052fc02802834e00530b005045028", - "0x529b00501c02802834e0052a900501c02802834e0052e800501c028028", - "0x2ea00529f02802834e0050470052fc02802834e00501400504502802834e", - "0x7600534e00507600502d0282ec00534e0052ec00500b0280cf00534e005", - "0x2802834e0050280070280cf0762ec0310050cf00534e0050cf005113028", - "0x2834e00501c00501c02802834e00503200505b02802834e0050470052fc", - "0x34e0053140052fc02802834e00530b00504502802834e0052fc00522a028", - "0x52a900501c02802834e0052e800501c02802834e005324005112028028", - "0x2ed00500b02802834e00501400504502802834e00529b00501c02802834e", - "0xb900504802802834e0050280070280284fd0050280130282e700534e005", - "0x501c02802834e00503200505b02802834e0050470052fc02802834e005", - "0x2fc02802834e00530b00504502802834e0052fc00522a02802834e00501c", - "0x2802834e0052e800501c02802834e00532400511202802834e005314005", - "0x2834e00501400504502802834e00529b00501c02802834e0052a900501c", - "0x534e00502801402802834e00502834c0282e700534e0052fd00500b028", - "0x2502837800534e0052f40b60072a00282f400534e005377005111028377", - "0x34e0052e100511302807600534e00507600502d0282e100534e005378005", - "0x2834e0050470052fc02802834e0050280070282e10762e70310052e1005", - "0x34e00530600534b02802834e00501c00501c02802834e00503200505b028", - "0x53140052fc02802834e00530b00504502802834e005014005045028028", - "0x2a900501c02802834e0052e800501c02802834e00532400511202802834e", - "0x130280d400534e0052fa00500b02802834e00529b00501c02802834e005", - "0x52fc02802834e00530000504802802834e0050280070280284fe005028", - "0x34b02802834e00501c00501c02802834e00503200505b02802834e005047", - "0x2802834e00530b00504502802834e00501400504502802834e005306005", - "0x2834e0052e800501c02802834e00532400511202802834e0053140052fc", - "0x34e00531000500b02802834e00529b00501c02802834e0052a900501c028", - "0x52e00051110282e000534e00502801402802834e00502834c0280d4005", - "0x2de00534e00537a00502502837a00534e0050d53010072a00280d500534e", - "0x760d40310052de00534e0052de00511302807600534e00507600502d028", - "0x2834e0050470052fc02802834e00502834c02802834e0050280070282de", - "0x34e00501400504502802834e00501c00501c02802834e00503200505b028", - "0x52e800501c02802834e00532400511202802834e0053140052fc028028", - "0x30800511102802834e00529b00501c02802834e0052a900501c02802834e", - "0x534e0052d70050250282d700534e0052dd30d0072a00282dd00534e005", - "0x511302807600534e00507600502d02831000534e00531000500b0280da", - "0x502834c02802834e0050280070280da0763100310050da00534e0050da", - "0x1c00501c02802834e00503200505b02802834e0050470052fc02802834e", - "0x52fc02802834e00529b00501c02802834e00501400504502802834e005", - "0x1c02802834e0052e800501c02802834e00532400511202802834e005314", - "0x534e00531000500b0282d400534e00530e00529f02802834e0052a9005", - "0x3100310052d400534e0052d400511302807600534e00507600502d028310", - "0x53110052fc02802834e0053120052fc02802834e0050280070282d4076", - "0x1c00501c02802834e00503200505b02802834e0050470052fc02802834e", - "0x501c02802834e00501400504502802834e0052a900501c02802834e005", - "0xb02802834e0052e800501c02802834e00532400511202802834e00529b", - "0x4802802834e0050280070280284ff0050280130282d200534e005313005", - "0x2802834e00503200505b02802834e0050470052fc02802834e005088005", - "0x2834e00501400504502802834e0052a900501c02802834e00501c00501c", - "0x34e0052e800501c02802834e00532400511202802834e00529b00501c028", - "0x34e00502801402802834e00502834c0282d200534e00533100500b028028", - "0x280db00534e0052d531a0072a00282d500534e0050d20051110280d2005", - "0x52dc00511302807600534e00507600502d0282dc00534e0050db005025", - "0x2834e00502834c02802834e0050280070282dc0762d20310052dc00534e", - "0x34e00501c00501c02802834e00503200505b02802834e0050470052fc028", - "0x529b00501c02802834e00501400504502802834e0052a900501c028028", - "0x502d0282cf00534e00533100500b02802834e0052e800501c02802834e", - "0x534e00532900504f0282cd00534e00532000511d0282ce00534e005076", - "0x2834e0050470052fc02802834e0050280070280285000050280130280df", - "0x34e0052a900501c02802834e00501c00501c02802834e00503200505b028", - "0x52e800501c02802834e00529b00501c02802834e005014005045028028", - "0x2d02833100534e00533100500b0282db00534e00533000529f02802834e", - "0x282db0763310310052db00534e0052db00511302807600534e005076005", - "0x2fc02802834e00506b00504802802834e00502834c02802834e005028007", - "0x2802834e00503200505b02802834e0052e800501c02802834e005047005", - "0x2834e00501400504502802834e0052a900501c02802834e00501c00501c", - "0x34e00523d00500b0280e100534e00502801402802834e00529b00501c028", - "0x4f0282cd00534e0050e100511d0282ce00534e00500500502d0282cf005", - "0x34e0052cd0051110282d800534e0050df0050400280df00534e005318005", - "0x282da00534e0050e30050250280e300534e0052d92d80072a00282d9005", - "0x52da0051130282ce00534e0052ce00502d0282cf00534e0052cf00500b", - "0x2834e00502834c02802834e0050280070282da2ce2cf0310052da00534e", - "0x34e00503200505b02802834e0050510052a902802834e0050470052fc028", - "0x501400504502802834e00503000501c02802834e00501c00501c028028", - "0x5e0050400282cb00534e00502801402802834e00504e00501c02802834e", - "0x534e0052c52c30072a00282c500534e0052cb0051110282c300534e005", - "0x502d02823d00534e00523d00500b0282bf00534e0052c00050250282c0", - "0x70282bf00523d0310052bf00534e0052bf00511302800500534e005005", - "0x52a902802834e0050470052fc02802834e00502834c02802834e005028", - "0x1c02802834e00501c00501c02802834e00503200505b02802834e005051", - "0x2802834e0050130052a902802834e00501400504502802834e005030005", - "0x34e0050e90051110282bd00534e00505d0050400280e900534e005028014", - "0x282b700534e0052ba0050250282ba00534e0052bb2bd0072a00282bb005", - "0x52b700511302800500534e00500500502d02823d00534e00523d00500b", - "0x2834e00502834c02802834e0050280070282b700523d0310052b700534e", - "0x34e00503200505b02802834e0050510052a902802834e0050470052fc028", - "0x501400504502802834e0050170052a902802834e00501c00501c028028", - "0x25a0050400280ec00534e00502801402802834e0050130052a902802834e", - "0x534e0052b32b60072a00282b300534e0050ec0051110282b600534e005", - "0x502d02823d00534e00523d00500b0282b100534e0052b20050250282b2", - "0x70282b100523d0310052b100534e0052b100511302800500534e005005", - "0x52a902802834e0050470052fc02802834e00502834c02802834e005028", - "0x2a902802834e00501c00501c02802834e00503200505b02802834e005051", - "0x2802834e00504d00531802802834e0050130052a902802834e005017005", - "0x2af0050250282af00534e0052b02460072a00282b000534e00524a005111", - "0x500534e00500500502d02823d00534e00523d00500b0282ae00534e005", - "0x2802834e0050280070282ae00523d0310052ae00534e0052ae005113028", - "0x2802834e0050510052a902802834e0050470052fc02802834e00502834c", - "0x2834e0050170052a902802834e00501c00501c02802834e00503200505b", - "0x34e00524300529f02802834e0050130052a902802834e00504d005318028", - "0x11302800500534e00500500502d02823d00534e00523d00500b0282ab005", - "0x52fc02802834e0050280070282ab00523d0310052ab00534e0052ab005", - "0x5b02802834e0050510052a902802834e00523a0052fc02802834e005237", - "0x2802834e0050170052a902802834e00501c00501c02802834e005032005", - "0x534e00504500500b02802834e0050130052a902802834e00504d005318", - "0x2834e00523000504802802834e0050280070280285010050280130280f6", - "0x34e00501c00501c02802834e00503200505b02802834e0050510052a9028", - "0x50130052a902802834e00504d00531802802834e0050170052a9028028", - "0x2834c0280f600534e00534200500b02802834e00500a0052a902802834e", - "0x2a00282aa00534e0050f80051110280f800534e00502801402802834e005", - "0x500500502d0282a700534e0052a80050250282a800534e0052aa226007", - "0x50280070282a70050f60310052a700534e0052a700511302800500534e", - "0x2300534b02802834e0050510052a902802834e00500a0052a902802834e", - "0x531802802834e0050170052a902802834e00501c00501c02802834e005", - "0x280fa00534e00534100500b02802834e0050130052a902802834e00504d", - "0x2a902802834e0051a000504802802834e005028007028028502005028013", - "0x2802834e00502300534b02802834e0050510052a902802834e00500a005", - "0x2834e00504d00531802802834e0050170052a902802834e00501c00501c", - "0x34e00502800500b02802834e00500f0052a902802834e0050130052a9028", - "0x50fc0051110280fc00534e00502801402802834e00502834c0280fa005", - "0x2a600534e0050f90050250280f900534e0050fb3440072a00280fb00534e", - "0x50fa0310052a600534e0052a600511302800500534e00500500502d028", - "0x34e0050510052a902802834e00500a0052a902802834e0050280070282a6", - "0x504d00531802802834e0050170052a902802834e00504f0052a9028028", - "0x502801402802834e00500f0052a902802834e0050130052a902802834e", - "0x2810400534e0052a500511102810200534e00501b0050400282a500534e", - "0x2800500b02810100534e00510300502502810300534e0051041020072a0", - "0x10100534e00510100511302800500534e00500500502d02802800534e005", - "0x2801300534e0050282e802804f00534e005028119028101005028031005", - "0x34c00534e00502811802801700534e00502811902804d00534e005028241", - "0x2802834e00503100508d02802834e00502834c02802834e005028243028", - "0x34e00502800702834934a01c03150301b04e34b03134e00700700500729e", - "0x529c02801f00534e00501b00512102801b00534e00501b00511f028028", - "0x529902802000534e00502000529a02801403001034802000b34e00501f", - "0x34e00502300531102802d02300734e00534700529802834700534e005020", - "0x530f02802834e0053460053110280c034600734e00500a005298028028", - "0x34e00508600512602808602d00734e00502d00512402802d00534e00502d", - "0x2ba02802834e00534200505b02802834e0051a00053290283421a0344031", - "0x53410051260283410c000734e0050c000512402803200534e005344005", - "0x2802834e00500c00505b02802834e00503300532902800c03334f03134e", - "0x534e00534b00502d02802834e00502800a02803c00534e00534f0052ba", - "0x12302834800534e00534800512502804e00534e00504e01300732602834b", - "0x4d00724602803000534e00503001700712302801000534e00501004f007", - "0x34e00502800702802850402834e00703c0320072b702801400534e005014", - "0x503000505b02802834e00500f00501c02802834e00501400501c028028", - "0x5100501c02802834e00500b00531202802834e00505000501c02802834e", - "0x529502802834e00534c00529702802834e00501000505b02802834e005", - "0x1302802834e00502d00531102802834e0050c000531102802834e005348", - "0x2803602d00734e00502d00512402802834e005028007028028505005028", - "0x22400505b02802834e00504000532902822422204003134e005036005126", - "0x22a0c000734e0050c000512402822600534e0052220052ba02802834e005", - "0x505b02802834e00523000532902804804623003134e00522a005126028", - "0x2834e0070472260072b702804700534e0050460052ba02802834e005048", - "0x500f00501c02802834e00501400501c02802834e005028007028028506", - "0xb00531202802834e00505000501c02802834e00503000505b02802834e", - "0x529702802834e00501000505b02802834e00505100501c02802834e005", - "0x31102802834e0050c000531102802834e00534800529502802834e00534c", - "0x512602802834e00502800702802850700502801302802834e00502d005", - "0x34e00523700532902802834e00504500532902823a23704503134e00502d", - "0x512602823e00534e00523d0052ea02823d00534e00523a00512c028028", - "0x34e00524300532902802834e00524100532902824624324103134e0050c0", - "0x708c02824a00534e0052470052ea02824700534e00524600512c028028", - "0x34e00724b00531d02824b00534e00524b00501802824b00534e00524a23e", - "0x29402801800534e00534800512b02802834e00502800702824c005508028", - "0x25800531202825a25800734e00501800513102801800534e00501834c007", - "0x2802834e00505200531202800905200734e00500b00513102802834e005", - "0x2a929b05e05b05a01434e00505d00529302805d25a00734e00525a005130", - "0x505e0052fc02802834e00505b00505b02804232631805f0610620602e8", - "0x2e800501c02802834e0052a900501c02802834e00529b00504502802834e", - "0x52fc02802834e00506200511202802834e00506000501c02802834e005", - "0x22a02802834e00531800522a02802834e00505f00504502802834e005061", - "0x6900534e00505a00500f02802834e00504200504502802834e005326005", - "0x7100606a06b01434e00533200529302833200900734e005009005130028", - "0x60052fc02802834e00506a00505b02807c04332f330079077076331073", - "0x501c02802834e00507300501c02802834e00507100504502802834e005", - "0x2fc02802834e00507700511202802834e00507600501c02802834e005331", - "0x2802834e00532f00522a02802834e00533000504502802834e005079005", - "0x534e00506b00500f02802834e00507c00504502802834e00504300522a", - "0x31d02808100534e00508100501802808100534e00507b06900708c02807b", - "0x34e00525a00513002802834e00502800702832c00550902834e007081005", - "0x31f08e32032432532732832932a07f01434e00508300529302808325a007", - "0x504502802834e0053290052fc02802834e00507f00501c02831d08c31e", - "0x1c02802834e00532500501c02802834e00532700501c02802834e005328", - "0x2802834e00508e0052fc02802834e00532000511202802834e005324005", - "0x2834e00508c00522a02802834e00531e00522a02802834e00531f005045", - "0x531c0052ea02831c00534e00532a00512c02802834e00531d005045028", - "0x31a01434e00531b00529302831b00900734e00500900513002808a00534e", - "0x2802834e00531a00501c02830f08d31031131231331431536c090088319", - "0x2834e00536c00501c02802834e00509000504502802834e0050880052fc", - "0x34e00531300511202802834e00531400501c02802834e00531500501c028", - "0x531000522a02802834e00531100504502802834e0053120052fc028028", - "0x31900512c02802834e00530f00504502802834e00508d00522a02802834e", - "0x534e00530d08a00708c02830d00534e00530e0052ea02830e00534e005", - "0x2830b00550a02834e00730c00531d02830c00534e00530c00501802830c", - "0x34e00530800529302830825a00734e00525a00513002802834e005028007", - "0x34e00508700501c0283000a2301302304305097306099307096094087014", - "0x509900501c02802834e00530700504502802834e00509400505b028028", - "0x30500511202802834e00509700501c02802834e00530600501c02802834e", - "0x522a02802834e00530200504502802834e0053040052fc02802834e005", - "0x37702802834e00530000504502802834e0050a200522a02802834e005301", - "0x52fe0052930282fe00900734e0050090051300282ff00534e005096005", - "0x52fd00501c0282f30b60b42f52f70ac0b02f80a92f92fa2fc2fd01434e", - "0xa900501c02802834e0052f900504502802834e0052fc00505b02802834e", - "0x511202802834e0050b000501c02802834e0052f800501c02802834e005", - "0x22a02802834e0052f500504502802834e0052f70052fc02802834e0050ac", - "0x2802834e0052f300504502802834e0050b600522a02802834e0050b4005", - "0x2800702802850b02834e0070b92ff0072910280b900534e0052fa005377", - "0x505b02802834e00500f00501c02802834e00501400501c02802834e005", - "0x31202802834e00525a00531202802834e00505000501c02802834e005030", - "0x2802834e00505100501c02802834e00501000505b02802834e005009005", - "0x2f125a00734e00525a00513002802834e00502800702802850c005028013", - "0x3743733720532e92ea2eb0bf2ec2ed2ee2ef2f001434e0052f1005293028", - "0x34e0052ee0052fc02802834e0052ef00505b02802834e0052f000501c028", - "0x52eb00501c02802834e0050bf00501c02802834e0052ec00501c028028", - "0x5300504502802834e0052e90052fc02802834e0052ea00511202802834e", - "0x504502802834e00537300522a02802834e00537200522a02802834e005", - "0xdc00734e0050dc0052c30280dc00534e0052ed00529002802834e005374", - "0x51300280c600534e0050c70050060280c700534e005376005031028376", - "0x2e13782f43772e70cf0cb01434e0050c90052930280c900900734e005009", - "0x2834e0050cf00505b02802834e0050cb00501c0282dd2de37a0d52e00d4", - "0x34e00537800501c02802834e0052f400501c02802834e0052e70052fc028", - "0x52e00052fc02802834e0050d400511202802834e0052e100501c028028", - "0x2de00522a02802834e00537a00522a02802834e0050d500504502802834e", - "0x2c30282d700534e00537700529002802834e0052dd00504502802834e005", - "0x52d40050060282d400534e0050da0050310280da2d700734e0052d7005", - "0x282d200534e0052d200534f0280c600534e0050c600534f0282d200534e", - "0x34e00502834c02802834e00502800702802850d02834e0072d20c6007136", - "0x503000505b02802834e00500f00501c02802834e00501400501c028028", - "0x900531202802834e00525a00531202802834e00505000501c02802834e", - "0x504502802834e00505100501c02802834e00501000505b02802834e005", - "0x280d200534e00502800500b02802834e0050dc00504502802834e0052d7", - "0x2802834e00502800702802850e0050280130282d500534e00534b00502d", - "0x534e00534b00502d02802800534e00502800500b02802834e00502834c", - "0xa1380282d700534e0052d700525a0280dc00534e0050dc00525a02834b", - "0x550f2ce00534e0072cf0051370282cf2dc0db03134e0052d70dc34b028", - "0x50450280e12db0df03134e0052ce00513502802834e0050280070282cd", - "0x5102d800534e0070e100528f02802834e0052db00504502802834e0050df", - "0x503000505b02802834e0052d800504802802834e0050280070282d9005", - "0x900531202802834e00525a00531202802834e00505000501c02802834e", - "0x501c02802834e00505100501c02802834e00501000505b02802834e005", - "0x280d200534e0050db00500b02802834e00501400501c02802834e00500f", - "0x52d500528e0280e300534e0050d20053760282d500534e0052dc00502d", - "0x52d900504802802834e0050280070280285110050280130282da00534e", - "0x2c52c301434e0052cb0052930282cb25a00734e00525a00513002802834e", - "0x5b02802834e0052c300501c0282b22b32b60ec2b72ba2bb2bd0e92bf2c0", - "0x2802834e0052bf00504502802834e0052c00052fc02802834e0052c5005", - "0x2834e0052ba00511202802834e0052bb00501c02802834e0052bd00501c", - "0x34e0052b600522a02802834e0050ec00504502802834e0052b70052fc028", - "0x50e900500f02802834e0052b200504502802834e0052b300522a028028", - "0x2af01434e0052b00052930282b000900734e0050090051300282b100534e", - "0x2802834e0052af00501c0282a60f90fb0fc0fa2a72a82aa0f80f62ab2ae", - "0x2834e0050f600504502802834e0052ab0052fc02802834e0052ae00505b", - "0x34e0052a700511202802834e0052a800501c02802834e0052aa00501c028", - "0x50fb00522a02802834e0050fc00504502802834e0050fa0052fc028028", - "0xf800500f02802834e0052a600504502802834e0050f900522a02802834e", - "0x534e00510200501802810200534e0052a52b100708c0282a500534e005", - "0x513002802834e00502800702810400551202834e00710200531d028102", - "0x10c10910b10a2a32a410101434e00510300529302810325a00734e00525a", - "0x2834e0052a400505b02802834e00510100501c0281111121130252a02a1", - "0x34e00510b00501c02802834e00510a00504502802834e0052a30052fc028", - "0x52a00052fc02802834e0052a100511202802834e00510c00501c028028", - "0x11200522a02802834e00511300522a02802834e00502500504502802834e", - "0x13002829f00534e00510900500f02802834e00511100504502802834e005", - "0x29c12111f29e11811901434e00511d00529302811d00900734e005009005", - "0x34e00511800505b02802834e00511900501c02812312512612429829929a", - "0x512100501c02802834e00511f00504502802834e00529e0052fc028028", - "0x2980052fc02802834e00529900511202802834e00529a00501c02802834e", - "0x522a02802834e00512600522a02802834e00512400504502802834e005", - "0x2829700534e00529c00500f02802834e00512300504502802834e005125", - "0x29500531d02829500534e00529500501802829500534e00529729f00708c", - "0x25a00734e00525a00513002802834e00502800702812c00551302834e007", - "0x28e28f13513713813629029129313013129401434e00512b00529302812b", - "0x51300052fc02802834e00513100505b02802834e00529400501c02828d", - "0x29000501c02802834e00529100501c02802834e00529300504502802834e", - "0x504502802834e0051370052fc02802834e00513800511202802834e005", - "0x4502802834e00528e00522a02802834e00528f00522a02802834e005135", - "0x734e00500900513002813f00534e00513600500f02802834e00528d005", - "0x28428614d14b14a14814614f28928a28b01434e00513e00529302813e009", - "0x2890052fc02802834e00528a00505b02802834e00528b00501c028157288", - "0x501c02802834e00514600501c02802834e00514f00504502802834e005", - "0x4502802834e00514d0052fc02802834e00514b00511202802834e005148", - "0x2802834e00528800522a02802834e00528400522a02802834e005286005", - "0x515613f00708c02815600534e00514a00500f02802834e005157005045", - "0x551402834e00715500531d02815500534e00515500501802815500534e", - "0x15300529302815325a00734e00525a00513002802834e005028007028154", - "0x15200501c02827a27b27c27d27e27f28028128216115015115201434e005", - "0x504502802834e0051500052fc02802834e00515100505b02802834e005", - "0x1c02802834e00528100501c02802834e00528200501c02802834e005161", - "0x2802834e00527d00504502802834e00527e0052fc02802834e005280005", - "0x2834e00527a00504502802834e00527b00522a02802834e00527c00522a", - "0x513e02816c16a00734e00516a00513f02816a00534e00527f00528d028", - "0x734e00500900513002816e00534e00527800528b02827800534e00516c", - "0x26e51527227327414327617417217116f01434e005277005293028277009", - "0x1720052fc02802834e00517100505b02802834e00516f00501c028179024", - "0x501c02802834e00527600501c02802834e00517400504502802834e005", - "0x4502802834e0052720052fc02802834e00527400501c02802834e005143", - "0x2802834e00502400522a02802834e00526e00522a02802834e005515005", - "0x34e00527500513f02827500534e00527300528d02802834e005179005045", - "0x2826800534e00526900528b02826900534e00526b00513e02826b275007", - "0x26816e00713602826800534e00526800534f02816e00534e00516e00534f", - "0x1c02802834e00503000505b02802834e00502800702802851602834e007", - "0x2802834e00500900531202802834e00525a00531202802834e005050005", - "0x2834e00500f00501c02802834e00505100501c02802834e00501000505b", - "0x34e00516a00511202802834e00527500511202802834e00501400501c028", - "0x2801302826600534e0052dc00502d02826700534e0050db00500b028028", - "0x502d0280db00534e0050db00500b02802834e005028007028028517005", - "0x534e00527500528a02816a00534e00516a00528a0282dc00534e0052dc", - "0x34e00718100514f02818117f26503134e00527516a2dc0db00a289028275", - "0x18626403134e00518200514602802834e005028007028184005518182005", - "0x718700528f02802834e00518600511202802834e005264005112028187", - "0x2802834e00518900504802802834e00502800702826300551918900534e", - "0x2834e00501000505b02802834e00500900531202802834e00525a005312", - "0x34e00501400501c02802834e00500f00501c02802834e00505100501c028", - "0x526500500b02802834e00503000505b02802834e00505000501c028028", - "0x2819000534e00526700537602826600534e00517f00502d02826700534e", - "0x2802834e00502800702802851a00502801302818f00534e00526600528e", - "0x519100529302819125a00734e00525a00513002802834e005263005048", - "0x519200501c02825725919d19b25b19919725c26a26018a25f19201434e", - "0x26000504502802834e00518a0052fc02802834e00525f00505b02802834e", - "0x501c02802834e00525c00501c02802834e00526a00501c02802834e005", - "0x22a02802834e00519b00504502802834e00519900511202802834e005197", - "0x2802834e00525700504502802834e00525900522a02802834e00519d005", - "0x25300529302825300900734e00500900513002825500534e00525b005377", - "0x25200501c02823923b1aa1a823c2402421a424424524824925201434e005", - "0x504502802834e0052480052fc02802834e00524900505b02802834e005", - "0x1c02802834e0051a400501c02802834e00524400501c02802834e005245", - "0x2802834e0051a800504502802834e00524000511202802834e005242005", - "0x2834e00523900504502802834e00523b00522a02802834e0051aa00522a", - "0x702802851b02834e00723825500729102823800534e00523c005377028", - "0x5b02802834e00500900531202802834e00525a00531202802834e005028", - "0x2802834e00500f00501c02802834e00505100501c02802834e005010005", - "0x2834e00503000505b02802834e00505000501c02802834e00501400501c", - "0x502801302823100534e00517f00502d02823500534e00526500500b028", - "0x529302822f25a00734e00525a00513002802834e00502800702802851c", - "0x501c02821a1bc21f22022822318b2251b71b52271b322d01434e00522f", - "0x4502802834e0052270052fc02802834e0051b300505b02802834e00522d", - "0x2802834e00522500501c02802834e0051b700501c02802834e0051b5005", - "0x2834e0052280052fc02802834e00522300511202802834e00518b00501c", - "0x34e00521a00504502802834e0051bc00522a02802834e00521f00522a028", - "0x310281bf21900734e0052190052c302821900534e005220005290028028", - "0x34e00500900513002821600534e00521700500602821700534e0051bf005", - "0x1ca20a20c1c720d21420e1c521121201434e005213005293028213009007", - "0x52fc02802834e00521100505b02802834e00521200501c0281ce2081cc", - "0x1c02802834e00521400501c02802834e00520e00504502802834e0051c5", - "0x2802834e00520c00511202802834e0051c700501c02802834e00520d005", - "0x2834e00520800522a02802834e0051cc00522a02802834e00520a0052fc", - "0x52060052c302820600534e0051ca00529002802834e0051ce005045028", - "0x20000534e00520100500602820100534e00520b00503102820b20600734e", - "0x21600713602820000534e00520000534f02821600534e00521600534f028", - "0x2802834e00525a00531202802834e00502800702802851d02834e007200", - "0x2834e00505100501c02802834e00501000505b02802834e005009005312", - "0x34e00505000501c02802834e00501400501c02802834e00500f00501c028", - "0x521900504502802834e00520600504502802834e00503000505b028028", - "0x130281fe00534e00517f00502d0281ff00534e00526500500b02802834e", - "0x2d02826500534e00526500500b02802834e00502800702802851e005028", - "0x34e00520600525a02821900534e00521900525a02817f00534e00517f005", - "0x71fb0051370281fb1fc1fd03134e00520621917f26500a138028206005", - "0x1f403134e0051d500513502802834e0050280070281f600551f1d500534e", - "0x1ef00528f02802834e0051f100504502802834e0051f40050450281ef1f1", - "0x2834e0051ec00504802802834e0050280070281e50055201ec00534e007", - "0x34e00500f00501c02802834e00505100501c02802834e00501000505b028", - "0x503000505b02802834e00505000501c02802834e00501400501c028028", - "0x1fd00500b02802834e00525a00531202802834e00500900531202802834e", - "0x1f200534e0051ff0053760281fe00534e0051fc00502d0281ff00534e005", - "0x2834e00502800702802852100502801302800000534e0051fe00528e028", - "0x52200529302852225a00734e00525a00513002802834e0051e5005048028", - "0x52300501c02852e52d52c52b52a52952852735352652552452301434e005", - "0x504502802834e0055250052fc02802834e00552400505b02802834e005", - "0x1c02802834e00552700501c02802834e00535300501c02802834e005526", - "0x2802834e00552a0052fc02802834e00552900511202802834e005528005", - "0x2834e00552e00504502802834e00552d00522a02802834e00552b005045", - "0x529302853000900734e00500900513002852f00534e00552c005148028", - "0x501c02853b35153a53953853735253653553453353253101434e005530", - "0x4502802834e0055330052fc02802834e00553200505b02802834e005531", - "0x2802834e00553600501c02802834e00553500501c02802834e005534005", - "0x2834e0055380052fc02802834e00553700511202802834e00535200501c", - "0x34e00553b00504502802834e00535100522a02802834e005539005045028", - "0x2802853d02834e00753c52f00713602853c00534e00553a005148028028", - "0x2802834e00505100501c02802834e00501000505b02802834e005028007", - "0x2834e00505000501c02802834e00501400501c02802834e00500f00501c", - "0x34e00525a00531202802834e00500900531202802834e00503000505b028", - "0x2801302853f00534e0051fc00502d02853e00534e0051fd00500b028028", - "0x29302854125a00734e00525a00513002802834e005028007028028540005", - "0x1c02854d54c54b54a54954854754654554454354235401434e005541005", - "0x2802834e0055430052fc02802834e00554200505b02802834e005354005", - "0x2834e00554600501c02802834e00554500501c02802834e005544005045", - "0x34e0055490052fc02802834e00554800511202802834e00554700501c028", - "0x554d00504502802834e00554b00522a02802834e00554a005045028028", - "0x2854e00900734e00500900513002835000534e00554c00514802802834e", - "0x2855b55a55955855755655555455355255155054f01434e00554e005293", - "0x2834e0055510052fc02802834e00555000505b02802834e00554f00501c", - "0x34e00555400501c02802834e00555300501c02802834e005552005045028", - "0x55570052fc02802834e00555600511202802834e00555500501c028028", - "0x55b00504502802834e00555900522a02802834e00555800504502802834e", - "0x55d02834e00755c35000713602855c00534e00555a00514802802834e005", - "0x34e00505100501c02802834e00501000505b02802834e005028007028028", - "0x505000501c02802834e00501400501c02802834e00500f00501c028028", - "0x25a00531202802834e00500900531202802834e00503000505b02802834e", - "0x2855f00534e0051fc00502d02855e00534e0051fd00500b02802834e005", - "0x56256101434e00525a00529302802834e005028007028028560005028013", - "0x5b02802834e00556100501c02856d56c56b56a569568567566565564563", - "0x2802834e00556400504502802834e0055630052fc02802834e005562005", - "0x2834e00556700501c02802834e00556600501c02802834e00556500501c", - "0x34e00556a00504502802834e0055690052fc02802834e005568005112028", - "0x556d00529002802834e00556c00522a02802834e00556b00522a028028", - "0x57000534e00556f00503102856f56e00734e00556e0052c302856e00534e", - "0x57535657457357201434e00500900529302857100534e005570005006028", - "0x557300505b02802834e00557200501c02857c57b57a579357578577576", - "0x57500501c02802834e00535600504502802834e0055740052fc02802834e", - "0x511202802834e00557700501c02802834e00557600501c02802834e005", - "0x22a02802834e00557900504502802834e0053570052fc02802834e005578", - "0x57d00534e00557c00529002802834e00557b00522a02802834e00557a005", - "0x500602857f00534e00557e00503102857e57d00734e00557d0052c3028", - "0x534e00558000534f02857100534e00557100534f02858000534e00557f", - "0x505b02802834e00502800702802858102834e007580571007136028580", - "0x1c02802834e00500f00501c02802834e00505100501c02802834e005010", - "0x2802834e00503000505b02802834e00505000501c02802834e005014005", - "0x534e0051fd00500b02802834e00556e00504502802834e00557d005045", - "0x34e00502800702802858400502801302858300534e0051fc00502d028582", - "0x525a0281fc00534e0051fc00502d0281fd00534e0051fd00500b028028", - "0x57d56e1fc1fd00a13802857d00534e00557d00525a02856e00534e00556e", - "0x2800702858a00558958800534e00758700513702858758658503134e005", - "0x2834e00558b00504502835b58c58b03134e00558800513502802834e005", - "0x702858f00558e58d00534e00735b00528f02802834e00558c005045028", - "0x1c02802834e00500f00501c02802834e00558d00504802802834e005028", - "0x2802834e00503000505b02802834e00505000501c02802834e005014005", - "0x534e00558500500b02802834e00501000505b02802834e00505100501c", - "0x34e00502800702802858400502801302858300534e00558600502d028582", - "0x59000708c02859000534e0050100052ea02802834e00558f005048028028", - "0x2834e00759100531d02859100534e00559100501802859100534e005051", - "0x708c02859300534e0050300052ea02802834e00502800702835c005592", - "0x34e00759400531d02859400534e00559400501802859400534e005050593", - "0x2859700534e00500f01400708c02802834e005028007028596005595028", - "0x2800702859900559802834e00759700531d02859700534e005597005018", - "0x14b02859b00534e00559a00514a02859a00534e00502801402802834e005", - "0x34e00558600502d02858500534e00558500500b02859c00534e00559b005", - "0xa00559c00534e00559c00514d02804e00534e00504e005346028586005", - "0x2834902802834e00559900531c02802834e00502800702859c04e586585", - "0x2859e00534e00559e00501802859e00534e00502828602859d00534e005", - "0x59f5a00073470285a000534e00502834802859f00534e00559e59d007020", - "0x58500534e00558500500b0285a200534e0055a10052840285a100534e005", - "0x5a200514d02804e00534e00504e00534602858600534e00558600502d028", - "0x59600531c02802834e0050280070285a204e58658500a0055a200534e005", - "0x2834902802834e00501400501c02802834e00500f00501c02802834e005", - "0x285a400534e0055a40050180285a400534e0050282880285a300534e005", - "0x5a55a60073470285a600534e0050283480285a500534e0055a45a3007020", - "0x58500534e00558500500b0285a800534e0055a70052840285a700534e005", - "0x5a800514d02804e00534e00504e00534602858600534e00558600502d028", - "0x35c00531c02802834e0050280070285a804e58658500a0055a800534e005", - "0x501c02802834e00501400501c02802834e00500f00501c02802834e005", - "0x1570285a900534e00502834902802834e00503000505b02802834e005050", - "0x34e0055aa5a90070200285aa00534e0055aa0050180285aa00534e005028", - "0x2840285ad00534e0055ab5ac0073470285ac00534e0050283480285ab005", - "0x34e00558600502d02858500534e00558500500b0285ae00534e0055ad005", - "0xa0055ae00534e0055ae00514d02804e00534e00504e005346028586005", - "0x501c02802834e00500f00501c02802834e0050280070285ae04e586585", - "0x1c02802834e00503000505b02802834e00505000501c02802834e005014", - "0x5af00534e00558500500b02802834e00501000505b02802834e005051005", - "0x50280130285b000534e00558a0052d402836000534e00558600502d028", - "0x505100501c02802834e00501000505b02802834e0050280070280285b1", - "0x5000501c02802834e00501400501c02802834e00500f00501c02802834e", - "0x531202802834e00500900531202802834e00503000505b02802834e005", - "0x36000534e0051fc00502d0285af00534e0051fd00500b02802834e00525a", - "0x2834e0050280070280285b10050280130285b000534e0051f60052d4028", - "0x34e00501000505b02802834e00500900531202802834e00525a005312028", - "0x501400501c02802834e00500f00501c02802834e00505100501c028028", - "0x26500500b02802834e00503000505b02802834e00505000501c02802834e", - "0x5b000534e0051840052d402836000534e00517f00502d0285af00534e005", - "0x2802834e00515400531c02802834e0050280070280285b1005028013028", - "0x2834e00525a00531202802834e00505000501c02802834e00503000505b", - "0x34e00505100501c02802834e00501000505b02802834e005009005312028", - "0x50db00500b02802834e00501400501c02802834e00500f00501c028028", - "0x280070280285b40050280130285b300534e0052dc00502d0285b200534e", - "0x501c02802834e00503000505b02802834e00512c00531c02802834e005", - "0x5b02802834e00500900531202802834e00525a00531202802834e005050", - "0x2802834e00500f00501c02802834e00505100501c02802834e005010005", - "0x34e0052dc00502d0285b500534e0050db00500b02802834e00501400501c", - "0x34e00510400531c02802834e0050280070280285b6005028013028361005", - "0x525a00531202802834e00505000501c02802834e00503000505b028028", - "0x5100501c02802834e00501000505b02802834e00500900531202802834e", - "0x500b02802834e00501400501c02802834e00500f00501c02802834e005", - "0x280285b90050280130285b800534e0052dc00502d0285b700534e0050db", - "0x2802834e00505000501c02802834e00503000505b02802834e005028007", - "0x2834e00501000505b02802834e00500900531202802834e00525a005312", - "0x34e00501400501c02802834e00500f00501c02802834e00505100501c028", - "0x52d402836000534e0052dc00502d0285af00534e0050db00500b028028", - "0x534e0055af00500b0285ba00534e0055b00052840285b000534e0052cd", - "0x514d02804e00534e00504e00534602836000534e00536000502d0285af", - "0x531c02802834e0050280070285ba04e3605af00a0055ba00534e0055ba", - "0x5b02802834e00500f00501c02802834e00501400501c02802834e00530b", - "0x2802834e00525a00531202802834e00505000501c02802834e005030005", - "0x2834e00505100501c02802834e00501000505b02802834e005009005312", - "0x2802834e00532c00531c02802834e00502800702802850c005028013028", - "0x2834e00503000505b02802834e00500f00501c02802834e00501400501c", - "0x34e00500900531202802834e00525a00531202802834e00505000501c028", - "0x34e00502834c02802834e00505100501c02802834e00501000505b028028", - "0x53760282da00534e00534b00502d0280e300534e00502800500b028028", - "0x534e0055b70053760285b800534e0052da00528e0285b700534e0050e3", - "0x528e0285b200534e0055b500537602836100534e0055b800528e0285b5", - "0x534e0055b300528e02819000534e0055b20053760285b300534e005361", - "0x537602823100534e00518f00528e02823500534e00519000537602818f", - "0x534e0051f200537602800000534e00523100528e0281f200534e005235", - "0x528e02855e00534e00553e00537602853f00534e00500000528e02853e", - "0x534e00555f00528e02858200534e00555e00537602855f00534e00553f", - "0x55bc0050180285bc00534e0050281560285bb00534e005028349028583", - "0x285be00534e0050283480285bd00534e0055bc5bb0070200285bc00534e", - "0x58200500b0285c000534e0055bf0052840285bf00534e0055bd5be007347", - "0x4e00534e00504e00534602858300534e00558300502d02858200534e005", - "0x2834e0050280070285c004e58358200a0055c000534e0055c000514d028", - "0x34e00500f00501c02802834e00501400501c02802834e00524c00531c028", - "0x500b00531202802834e00505000501c02802834e00503000505b028028", - "0x34c00529702802834e00501000505b02802834e00505100501c02802834e", - "0x502834902802834e00502834c02802834e00534800529502802834e005", - "0x200285c200534e0055c20050180285c200534e0050281550285c100534e", - "0x55c35c40073470285c400534e0050283480285c300534e0055c25c1007", - "0x2802800534e00502800500b0285c600534e0055c50052840285c500534e", - "0x55c600514d02804e00534e00504e00534602834b00534e00534b00502d", - "0x504d0052a902802834e0050280070285c604e34b02800a0055c600534e", - "0xf00501c02802834e00500a00531102802834e00501700515402802834e", - "0x531202802834e00505000501c02802834e00534c00529702802834e005", - "0x5f02802834e00504f00515402802834e00505100501c02802834e00500b", - "0x534e0053495c70073470285c700534e00502834802802834e005013005", - "0x502d02802800534e00502800500b02836500534e0055c80052840285c8", - "0x534e00536500514d02834a00534e00534a00534602801c00534e00501c", - "0x534e00502834902802834e00500700508d02836534a01c02800a005365", - "0x2002804f00534e00501000531e02801003100734e00503100515302800f", - "0x4e00702002801300b00734e00500b0050bf02804e00534e00504f00f007", - "0x4d00534e00504d00501802804d00534e00502815202801400534e005013", - "0x510050bf02801700534e00502823d02803000534e00504d014007020028", - "0x34e00534c00501802834c00534e0050170180072dc02801805100734e005", - "0xbf02801b00534e00502823d02834b00534e00534c03000702002834c005", - "0x34a00501802834a00534e00501b01c0072dc02801c05000734e005050005", - "0x734e00534900503c02834900534e00534a34b00702002834a00534e005", - "0x515302834800534e00502000504002802834e00501f00503602802001f", - "0x34700502800b08702834800534e00534800525a02834703100734e005031", - "0x2802834e0050280070283440860c00315c934602d02303134e00734800a", - "0x34e0050511a00070200281a000534e00502834902802834e005346005045", - "0x34f34100734e00503200503c02803200534e005050342007020028342005", - "0x502300502d02803300534e00534f00504002802834e005341005036028", - "0x703300b03102d02300b08702803300534e00503300525a02802300534e", - "0x3600522202802834e0050280070282242220400315ca03603c00c03134e", - "0xc00534e00500c00502d02822a00534e00522600522402822600534e005", - "0x3c00c03100522a00534e00522a0050c002803c00534e00503c005346028", - "0x522423000734702823000534e00502834802802834e00502800702822a", - "0x2804000534e00504000502d02804800534e00504600502302804600534e", - "0x4822204003100504800534e0050480050c002822200534e005222005346", - "0x2834e00500b00501c02802834e00505100501c02802834e005028007028", - "0x534e00502834802802834e00505000501c02802834e00503100507c028", - "0x2d02823700534e00504500502302804500534e005344047007347028047", - "0x34e0052370050c002808600534e0050860053460280c000534e0050c0005", - "0x3100500702800a15102802834e00502834c0282370860c0031005237005", - "0x505100509902800a00534e00500a00500b02805005100b00a00a34e005", - "0x505000534e00505000515002800b00534e00500b00502d02805100534e", - "0x34c02802834e00502824302800a00534e00502816102805000b05100a00a", - "0x702800f0500075cb05100b00734e00700502800700502802834e005028", - "0x4f00700734e00500700528102801000534e00502828202802834e005028", - "0x5cc01304e00734e00701004f00b03128002801000534e0050100052fa028", - "0x502d02804e00534e00504e00500b02802834e00502800702804d014007", - "0x501305104e0312f902801300534e0050130052fa02805100534e005051", - "0x502800702834c0055cd03100534e0070180050a902801801703003134e", - "0x727e02834b00534e00534b0052fa02834b00534e00502827f02802834e", - "0x34a0075ce01c01b00734e00734b00703003128002803100534e00503100a", - "0x501700502d02801b00534e00501b00500b02802834e005028007028349", - "0x3134e00501c01701b0312f902801c00534e00501c0052fa02801700534e", - "0x2834e0050280070280230055cf34700534e0073480050a902834802001f", - "0x502d0052fa02834600534e0053470052f802802d00534e00502827f028", - "0x534401f00727c0283440860c003134e00534602d00727d02802d00534e", - "0x281a000534e0051a000500b02834200534e0050c00050b00281a000534e", - "0x50310052f802802834e0050280070280320055d002834e00734200531d", - "0x702803c00c0075d103334f00734e0070863411a003127b02834100534e", - "0x4000534e00503600516a02803600534e00503300527a02802834e005028", - "0x4000516c02802000534e00502000502d02834f00534e00534f00500b028", - "0x503c0052fc02802834e00502800702804002034f03100504000534e005", - "0x22400501802822400534e00502827802822200534e00502834902802834e", - "0x22a00534e00502834802822600534e00522422200702002822400534e005", - "0x500b02804600534e00523000516e02823000534e00522622a007347028", - "0x534e00504600516c02802000534e00502000502d02800c00534e00500c", - "0x2802834e00503200531c02802834e00502800702804602000c031005046", - "0x4800534e00502834902802834e00503100527702802834e0050860052fc", - "0x4704800702002804700534e00504700501802804700534e00502816f028", - "0x23a00534e00504523700734702823700534e00502834802804500534e005", - "0x2000502d0281a000534e0051a000500b02823d00534e00523a00516e028", - "0x2800702823d0201a003100523d00534e00523d00516c02802000534e005", - "0xb02823e00534e00502300516e02802834e00503100527702802834e005", - "0x34e00523e00516c02802000534e00502000502d02801f00534e00501f005", - "0x2834e0053490052fc02802834e00502800702823e02001f03100523e005", - "0x534e00502817102824100534e00502834902802834e005031005277028", - "0x34802824600534e00524324100702002824300534e005243005018028243", - "0x34e00524a00516e02824a00534e00524624700734702824700534e005028", - "0x16c02801700534e00501700502d02834a00534e00534a00500b02824b005", - "0x52fc02802834e00502800702824b01734a03100524b00534e00524b005", - "0x2824c00534e00534c00516e02802834e00500a00517202802834e005007", - "0x524c00516c02801700534e00501700502d02803000534e00503000500b", - "0x34e00504d0052fc02802834e00502800702824c01703003100524c00534e", - "0x34e00502834902802834e00500a00517202802834e0050070052fc028028", - "0x702002825a00534e00525a00501802825a00534e005028171028258005", - "0x34e00505200900734702800900534e00502834802805200534e00525a258", - "0x2d02801400534e00501400500b02805a00534e00505d00516e02805d005", - "0x2805a05101403100505a00534e00505a00516c02805100534e005051005", - "0x2802834e00500a00517202802834e0050070052fc02802834e005028007", - "0x534e00505e00501802805e00534e00502823002805b00534e005028349", - "0x73470282a900534e00502834802829b00534e00505e05b00702002805e", - "0x34e00505000500b02806000534e0052e800516e0282e800534e00529b2a9", - "0x3100506000534e00506000516c02800f00534e00500f00502d028050005", - "0x502828202800a00534e00502817402802834e00502834c02806000f050", - "0x2805000534e00505100b00714302805100534e00502827602800b00534e", - "0x502827202800f00534e00505000a00727302805000534e005050005274", - "0x2802834e00504f00526e02804e04f00734e00500f00551502801000534e", - "0x500500502d02802800534e00502800500b02801300534e00504e005024", - "0x2801000534e00501000527502801300534e00501300517902800500534e", - "0x1700534e00703000526902803004d01403134e00501001300502800a26b", - "0x2801b34b34c03134e00501700526802802834e0050280070280180055d2", - "0x1c00534e00502832802802834e00501b00504802802834e00534c005267", - "0x504d00502d02801400534e00501400500b02834a00534e005028342028", - "0x2801c00534e00501c00532502834b00534e00534b00527502804d00534e", - "0x1f34903134e00534a01c34b04d01400b26602834a00534e00534a00534f", - "0x17f02802834e0050280070283470055d334800534e007020005265028020", - "0x34e00502300518102802834e00502d00504802802d02300734e005348005", - "0x26402808600534e0050c000518402802834e0053460051820280c0346007", - "0x34e00502800702834f3410320315d43421a034403134e00708600701f031", - "0x52fa02803c00534e00502818702800c03300734e005342005186028028", - "0x534e0051a000534602834400534e00534400502d02803300534e005033", - "0x280285d502834e00703c03300729102800c00534e00500c0052fa0281a0", - "0x2802834e00500c0052fc02802834e00503100508d02802834e005028007", - "0x534e00504000501802804000534e00502818902803600534e005028349", - "0x734702822400534e00502834802822200534e005040036007020028040", - "0x34e00534900500b02822a00534e0052260050e902822600534e005222224", - "0x2bd0281a000534e0051a000534602834400534e00534400502d028349005", - "0x26302802834e00502800702822a1a034434900a00522a00534e00522a005", - "0x34e0050280070280285d602834e00723000c00729102823000534e005028", - "0x34e00502818902804600534e00502834902802834e00503100508d028028", - "0x2804700534e00504804600702002804800534e005048005018028048005", - "0x52370050e902823700534e00504704500734702804500534e005028348", - "0x2834400534e00534400502d02834900534e00534900500b02823a00534e", - "0x1a034434900a00523a00534e00523a0052bd0281a000534e0051a0005346", - "0x534e0050280ec02823d00534e00502827202802834e00502800702823a", - "0x18102824100534e00523e23d00719002823e00534e00523e00532502823e", - "0x34e00524600518402802834e00524300518202824624300734e005241005", - "0x24a03134e0072471a034403126402824700534e00524700518f028247005", - "0x2834e00524c00519102802834e00502800702805225a2580315d724c24b", - "0x534e00502819202800900534e00502834902802834e00503100508d028", - "0x34802805a00534e00505d00900702002805d00534e00505d00501802805d", - "0x34e00505e0050e902805e00534e00505a05b00734702805b00534e005028", - "0x34602824a00534e00524a00502d02834900534e00534900500b02829b005", - "0x29b24b24a34900a00529b00534e00529b0052bd02824b00534e00524b005", - "0x52a90050360282e82a900734e00505200503c02802834e005028007028", - "0x34602825800534e00525800502d0282e800534e0052e800504f02802834e", - "0x70280610055d806206000734e0072e800505102825a00534e00525a005", - "0x2805f00534e00506200505002802834e00506000534b02802834e005028", - "0x34e00531800501802832600534e00502825f02831800534e00505f00500f", - "0x2804200534e00504200501802804200534e00532631800708c028318005", - "0x34e00502801402802834e0050280070280690055d902834e00704200531d", - "0x2806a00534e00506b00526002806b00534e00533203100718a028332005", - "0x525a00534602825800534e00525800502d02834900534e00534900500b", - "0x2800702806a25a25834900a00506a00534e00506a0052bd02825a00534e", - "0x2834902802834e00503100508d02802834e00506900531c02802834e005", - "0x2807100534e00507100501802807100534e00502826a02800600534e005", - "0x7333100734702833100534e00502834802807300534e005071006007020", - "0x34900534e00534900500b02807700534e0050760050e902807600534e005", - "0x770052bd02825a00534e00525a00534602825800534e00525800502d028", - "0x6100534b02802834e00502800702807725a25834900a00507700534e005", - "0x2825c02807900534e00502834902802834e00503100508d02802834e005", - "0x534e00533007900702002833000534e00533000501802833000534e005", - "0x50e902807c00534e00532f04300734702804300534e00502834802832f", - "0x534e00525800502d02834900534e00534900500b02807b00534e00507c", - "0x34900a00507b00534e00507b0052bd02825a00534e00525a005346028258", - "0x34900500b02802834e00503100508d02802834e00502800702807b25a258", - "0x8300534e00534100534602832c00534e00503200502d02808100534e005", - "0x2834e0050280070280285da00502801302807f00534e00534f005226028", - "0x32a00507602832932a00734e00534700533102802834e00503100508d028", - "0x2832c00534e00501f00502d02808100534e00534900500b02802834e005", - "0x5da00502801302807f00534e00532900522602808300534e005007005346", - "0x34e00501800533102802834e00503100508d02802834e005028007028028", - "0x2d02808100534e00501400500b02802834e005328005076028327328007", - "0x34e00532700522602808300534e00500700534602832c00534e00504d005", - "0xe902832400534e00507f32500734702832500534e00502834802807f005", - "0x34e00532c00502d02808100534e00508100500b02832000534e005324005", - "0xa00532000534e0053200052bd02808300534e00508300534602832c005", - "0x2819902800a00534e00502819702802834e00502834c02832008332c081", - "0x534e00500b00a00725b02800b00534e00500b00534f02800b00534e005", - "0x502800500b02800f00534e00502834202805000534e005028342028051", - "0x2805000534e00505000534f02805100534e00505100519b02802800534e", - "0x2804f01000734e00500f05005102800a19d02800f00534e00500f00534f", - "0x502825702802834e0050280070280130055db04e00534e00704f005259", - "0x1703000734e00504e00525302804d00534e00501400525502801400534e", - "0x1800524902834c01800734e00503000525202802834e005017005048028", - "0x2801000534e00501000500b02834b00534e00534c00524802802834e005", - "0x534b00524502800700534e00500700534602800500534e00500500502d", - "0x504d34b00700501000b1a402804d00534e00504d00524402834b00534e", - "0x280070280200055dc01f00534e00734900524202834934a01c01b00a34e", - "0x2834e00534800523c02802334734803134e00501f00524002802834e005", - "0x502d0051aa02802d00534e0053470051a802802834e005023005048028", - "0x860c000f34e00534600523902834600534e00502d00523b02802d00534e", - "0x2834e00534400522a02802834e00508600522a02834f3410323421a0344", - "0x34e00503200522a02802834e00534200522a02802834e0051a000522a028", - "0x34e00502823802802834e00534f00522a02802834e00534100522a028028", - "0x285dd02834e0070330c00071360280c000534e0050c000534f028033005", - "0xc00534e00502834902802834e00503100508d02802834e005028007028", - "0x3c00c00702002803c00534e00503c00501802803c00534e005028189028", - "0x22200534e00503604000734702804000534e00502834802803600534e005", - "0x1c00502d02801b00534e00501b00500b02822400534e0052220050e9028", - "0x22400534e0052240052bd02834a00534e00534a00534602801c00534e005", - "0x2822600534e00502801402802834e00502800702822434a01c01b00a005", - "0x1b00500b02823000534e00522a00526002822a00534e00522603100718a", - "0x34a00534e00534a00534602801c00534e00501c00502d02801b00534e005", - "0x2834e00502800702823034a01c01b00a00523000534e0052300052bd028", - "0x501c00502d02804600534e00501b00500b02802834e00503100508d028", - "0x2804500534e0050200052d402804700534e00534a00534602804800534e", - "0xb02802834e00503100508d02802834e0050280070280285de005028013", - "0x34e00500700534602804800534e00500500502d02804600534e005010005", - "0xb02823700534e0050450050e902804500534e0050130052d4028047005", - "0x34e00504700534602804800534e00504800502d02804600534e005046005", - "0x502834c02823704704804600a00523700534e0052370052bd028047005", - "0xb00527402805100534e00502823102800b00534e00502823502802834e", - "0x705100b03100500a22f02805100534e00505100527402800b00534e005", - "0x1000522d02802834e00502800702801304e04f0315df01000f05003134e", - "0x4d00534e00504d00522702802834e0050140051b302804d01400734e005", - "0x4d0051b502800f00534e00500f00534602805000534e00505000502d028", - "0x2834e0050300051b702802834e0050280070280170055e003000534e007", - "0x534e00502822502801800534e00502834902802834e00500a00508d028", - "0x34802834b00534e00534c01800702002834c00534e00534c00501802834c", - "0x34e00501c0050e902801c00534e00534b01b00734702801b00534e005028", - "0x2f502805000534e00505000502d02802800534e00502800500b02834a005", - "0x34e00534a0052bd02800f00534e00500f00534602800700534e005007005", - "0x501700504802802834e00502800702834a00f00705002800b00534a005", - "0x34900527402801f00534e00502823102834900534e00502818b02802834e", - "0x701f34900f05000a22f02801f00534e00501f00527402834900534e005", - "0x3470051b302802834e00502800702834602d0230315e134734802003134e", - "0x281920280c000534e00502834902802834e00500a00508d02802834e005", - "0x534e0050860c000702002808600534e00508600501802808600534e005", - "0x50e902834200534e0053441a00073470281a000534e005028348028344", - "0x534e00502000502d02802800534e00502800500b02803200534e005342", - "0x52bd02834800534e00534800534602800700534e0050070052f5028020", - "0x3c02802834e00502800702803234800702002800b00503200534e005032", - "0x34e00534f00504f02802834e00534100503602834f34100734e005346005", - "0x5102802d00534e00502d00534602802300534e00502300502d02834f005", - "0x3300534b02802834e00502800702803c0055e200c03300734e00734f005", - "0x2804000534e00503600500f02803600534e00500c00505002802834e005", - "0x522204000708c02804000534e00504000501802822200534e005028223", - "0x55e302834e00722400531d02822400534e00522400501802822400534e", - "0x534e00502822002822a00534e00502822802802834e005028007028226", - "0x2804823000734e00523000521f02804622a00734e00522a00521f028230", - "0x2d02300a22f02804800534e00504800527402804600534e005046005274", - "0x2802834e00502800702823e23d23a0315e423704504703134e007048046", - "0x504500534602804700534e00504700502d02823700534e005237005227", - "0x2834e0050280070282430055e524100534e0072370051b502804500534e", - "0x702825a25824c0315e624b24a24724600a34e0072410450470311bc028", - "0x2834e00505200519102800905200734e00524a00521a02802834e005028", - "0x900527402802834e00505d00519102805a05d00734e00522a00521a028", - "0x734e00505b00518602805b00900734e00500900521f02800900534e005", - "0x1860282a905a00734e00505a00521f02802834e00529b0052fc02829b05e", - "0x34e00505e00537702802834e0050600052fc0280602e800734e0052a9005", - "0x24600502d02802834e00502800a02806100534e0052e8005377028062005", - "0x24b00534e00524b00527402824700534e00524700534602824600534e005", - "0xa00508d02802834e0050280070280285e702834e007061062007291028", - "0x519102802834e00524b00519102802834e00523000519102802834e005", - "0x280070280285e800502801302802834e00500900519102802834e00505a", - "0x2802834e00505f0052fc02831805f00734e00500900518602802834e005", - "0x531800537702802834e0053260052fc02804232600734e00505a005186", - "0x5e902834e00733206900729102833200534e00504200537702806900534e", - "0x34e00523000519102802834e00500a00508d02802834e005028007028028", - "0x2834e0050280070280285ea00502801302802834e00524b005191028028", - "0x23000521a02802834e00506b00519102806a06b00734e00524b00521a028", - "0x6a00734e00506a00521f02802834e00500600519102807100600734e005", - "0x521f02802834e0050760052fc02807633100734e005073005186028073", - "0x53300052fc02833007900734e00507700518602807707100734e005071", - "0x29102804300534e00507900537702832f00534e00533100537702802834e", - "0x34e00500a00508d02802834e0050280070280285eb02834e00704332f007", - "0x5ea00502801302802834e00506a00519102802834e005071005191028028", - "0x7c0052fc02807b07c00734e00506a00518602802834e005028007028028", - "0x2802834e0050810052fc02832c08100734e00507100518602802834e005", - "0x7f08300729102807f00534e00532c00537702808300534e00507b005377", - "0x34c02802834e00500a00508d02802834e0050280070280285ec02834e007", - "0x1802832900534e00502821902832a00534e00502834902802834e005028", - "0x34e00502834802832800534e00532932a00702002832900534e005329005", - "0x2832400534e0053250050e902832500534e005328327007347028327005", - "0x50070052f502824600534e00524600502d02802800534e00502800500b", - "0x532400534e0053240052bd02824700534e00524700534602800700534e", - "0x2832000534e0050281bf02802834e00502800702832424700724602800b", - "0x34e00531f00518602831f00534e00502821702808e00534e0053200050b0", - "0x21602831d00534e00531e0050b002802834e00508c0052fc02808c31e007", - "0x34e00531c08e00721302808e00534e00508e00501802831c00534e005028", - "0x2831b00534e00531d08a0072dc02808a00534e00508a00501802808a005", - "0x8800534e0050281c502831900534e00502821102831a00534e005028212", - "0x8831903120e02836c00534e00509000530202809000534e005028014028", - "0x534e00502800500b02831400534e00531b00521402831500534e00536c", - "0x534602800700534e0050070052f502824600534e00524600502d028028", - "0x534e00531500520d02831a00534e00531a00527402824700534e005247", - "0x531431531a24700724602805020c02831400534e0053140051c7028315", - "0x534e00708d00520a02802834e00502800a02808d31031131231300b34e", - "0x1cc02830d00534e00530f0051ca02802834e00502800702830e0055ed30f", - "0x34e00502834c02802834e00502800702830b0055ee30c00534e00730d005", - "0x30800a00718a02830800534e00502801402802834e00530c005048028028", - "0x31300534e00531300500b02809400534e00508700526002808700534e005", - "0x31000534602831100534e0053110052f502831200534e00531200502d028", - "0x2809431031131231300b00509400534e0050940052bd02831000534e005", - "0x2809600534e00502834902802834e00500a00508d02802834e005028007", - "0x502801302809900534e00530700522602830700534e00530b096007020", - "0x530e00533102802834e00500a00508d02802834e0050280070280285ef", - "0x2809900534e00509700522602802834e00530600507602809730600734e", - "0x534e00509930500734702830500534e00502834802802834e00502834c", - "0x502d02831300534e00531300500b02830200534e0053040050e9028304", - "0x534e00531000534602831100534e0053110052f502831200534e005312", - "0x502800702830231031131231300b00530200534e0053020052bd028310", - "0xa00508d02802834e00523000519102802834e00522a00519102802834e", - "0x280a200534e00525a30100734702830100534e00502834802802834e005", - "0x524c00502d02802800534e00502800500b02830000534e0050a20050e9", - "0x2825800534e00525800534602800700534e0050070052f502824c00534e", - "0x2834e00502800702830025800724c02800b00530000534e0053000052bd", - "0x34e00523000519102802834e00522a00519102802834e005243005048028", - "0x34e00502823e0282ff00534e00502834902802834e00500a00508d028028", - "0x282fd00534e0052fe2ff0070200282fe00534e0052fe0050180282fe005", - "0x52fa0050e90282fa00534e0052fd2fc0073470282fc00534e005028348", - "0x2804700534e00504700502d02802800534e00502800500b0282f900534e", - "0x52f90052bd02804500534e00504500534602800700534e0050070052f5", - "0x22a00519102802834e0050280070282f904500704702800b0052f900534e", - "0x2834802802834e00500a00508d02802834e00523000519102802834e005", - "0x534e0052f80050e90282f800534e00523e0a90073470280a900534e005", - "0x52f502823a00534e00523a00502d02802800534e00502800500b0280b0", - "0x534e0050b00052bd02823d00534e00523d00534602800700534e005007", - "0x34e00522600531c02802834e0050280070280b023d00723a02800b0050b0", - "0x34e00502826a0280ac00534e00502834902802834e00500a00508d028028", - "0x282f500534e0052f70ac0070200282f700534e0052f70050180282f7005", - "0x50b60050e90280b600534e0052f50b40073470280b400534e005028348", - "0x2802300534e00502300502d02802800534e00502800500b0282f300534e", - "0x52f30052bd02802d00534e00502d00534602800700534e0050070052f5", - "0x3c00534b02802834e0050280070282f302d00702302800b0052f300534e", - "0x2825c0280b900534e00502834902802834e00500a00508d02802834e005", - "0x534e0052f10b90070200282f100534e0052f10050180282f100534e005", - "0x50e90282ee00534e0052f02ef0073470282ef00534e0050283480282f0", - "0x534e00502300502d02802800534e00502800500b0282ed00534e0052ee", - "0x52bd02802d00534e00502d00534602800700534e0050070052f5028023", - "0x8d02802834e0050280070282ed02d00702302800b0052ed00534e0052ed", - "0x534e0050132ec0073470282ec00534e00502834802802834e00500a005", - "0x502d02802800534e00502800500b0282eb00534e0050bf0050e90280bf", - "0x534e00504e00534602800700534e0050070052f502804f00534e00504f", - "0x50282350282eb04e00704f02800b0052eb00534e0052eb0052bd02804e", - "0x27402800a00534e00500a00527402800b00534e00502823102800a00534e", - "0x5f000f05005103134e00700b00a00700500a20802800b00534e00500b005", - "0x2801401300734e00500f0051ce02802834e00502800702804e04f010031", - "0x34e00505100502d02801400534e00501400520b02802834e005013005206", - "0x55f104d00534e00701400520102805000534e005050005346028051005", - "0x34e00503100508d02802834e00504d00520002802834e005028007028030", - "0x501800501802801800534e00502822502801700534e005028349028028", - "0x2834b00534e00502834802834c00534e00501801700702002801800534e", - "0x2800500b02801c00534e00501b0050e902801b00534e00534c34b007347", - "0x5000534e00505000534602805100534e00505100502d02802800534e005", - "0x2834e00502800702801c05005102800a00501c00534e00501c0052bd028", - "0x534e00502823102834a00534e0050281ff02802834e005030005048028", - "0xa20802834900534e00534900527402834a00534e00534a005274028349", - "0x34e00502800702802d0233470315f234802001f03134e00734934a050051", - "0x34e00502834902802834e00503100508d02802834e005348005206028028", - "0x70200280c000534e0050c00050180280c000534e005028192028346005", - "0x34e00508634400734702834400534e00502834802808600534e0050c0346", - "0x2d02802800534e00502800500b02834200534e0051a00050e90281a0005", - "0x34e0053420052bd02802000534e00502000534602801f00534e00501f005", - "0x34e00502d00503c02802834e00502800702834202001f02800a005342005", - "0x2d02834100534e00534100504f02802834e005032005036028341032007", - "0x34e00734100505102802300534e00502300534602834700534e005347005", - "0x2802834e00534f00534b02802834e00502800702800c0055f303334f007", - "0x34e00502822302803600534e00503c00500f02803c00534e005033005050", - "0x2822200534e00504003600708c02803600534e005036005018028040005", - "0x280070282240055f402834e00722200531d02822200534e005222005018", - "0x521f02822a00534e0050281fd02822600534e0050281fe02802834e005", - "0x523000527402804622a00734e00522a00521f02823022600734e005226", - "0x34e00704623002334700a20802804600534e00504600527402823000534e", - "0x504500520b02802834e00502800702823d23a2370315f5045047048031", - "0x2804700534e00504700534602804800534e00504800502d02804500534e", - "0x480311fc02802834e0050280070282410055f623e00534e007045005201", - "0x2834e00502800702825824c24b0315f724a24724624300a34e00723e047", - "0x22600521a02802834e00525a00519102805225a00734e00524700521a028", - "0x5200534e00505200527402802834e00500900519102805d00900734e005", - "0x2fc02805e05b00734e00505a00518602805a05200734e00505200521f028", - "0x34e00529b00518602829b05d00734e00505d00521f02802834e00505e005", - "0x37702806000534e00505b00537702802834e0052e80052fc0282e82a9007", - "0x34e00524600534602824300534e00524300502d02806200534e0052a9005", - "0x285f802834e00706206000729102824a00534e00524a005274028246005", - "0x2834e00522a00519102802834e00503100508d02802834e005028007028", - "0x34e00505200519102802834e00505d00519102802834e00524a005191028", - "0x734e00505200518602802834e0050280070280285f9005028013028028", - "0x2fc02832631800734e00505d00518602802834e0050610052fc02805f061", - "0x534e00532600537702804200534e00505f00537702802834e005318005", - "0x508d02802834e0050280070280285fa02834e007069042007291028069", - "0x1302802834e00524a00519102802834e00522a00519102802834e005031", - "0x2806b33200734e00524a00521a02802834e0050280070280285fb005028", - "0x506a00519102800606a00734e00522a00521a02802834e005332005191", - "0x33107300734e00507100518602807106b00734e00506b00521f02802834e", - "0x7600518602807600600734e00500600521f02802834e0053310052fc028", - "0x33000534e00507300537702802834e0050790052fc02807907700734e005", - "0x70280285fc02834e00732f33000729102832f00534e005077005377028", - "0x19102802834e00500600519102802834e00503100508d02802834e005028", - "0x518602802834e0050280070280285fb00502801302802834e00506b005", - "0x734e00500600518602802834e0050430052fc02807c04300734e00506b", - "0x537702832c00534e00507c00537702802834e00507b0052fc02808107b", - "0x34e0050280070280285fd02834e00708332c00729102808300534e005081", - "0x34e00502821902807f00534e00502834902802834e00503100508d028028", - "0x2832900534e00532a07f00702002832a00534e00532a00501802832a005", - "0x53270050e902832700534e00532932800734702832800534e005028348", - "0x2824300534e00524300502d02802800534e00502800500b02832500534e", - "0x24624302800a00532500534e0053250052bd02824600534e005246005346", - "0x34e0053240050b002832400534e0050281fb02802834e005028007028325", - "0x8e00518602808e00534e0050281d502802834e00532000501c028320005", - "0x8c00534e00531f0050b002802834e00531e0052fc02831e31f00734e005", - "0x534e0050281f402831d00534e0050281f602802834e00508c00501c028", - "0xa20802831c00534e00531c00527402831d00534e00531d00527402831c", - "0x34e0050280070280900883190315fe31a31b08a03134e00731c31d246243", - "0x534602808a00534e00508a00502d02831a00534e00531a00520b028028", - "0x50280070283150055ff36c00534e00731a00520102831b00534e00531b", - "0x50281ec02831300534e0050281ef02831400534e0050281f102802834e", - "0x2808a00534e00508a00502d02802800534e00502800500b02831200534e", - "0x531300527402831400534e00531400527402831b00534e00531b005346", - "0x2836c00534e00536c0051e502831200534e00531200527402831300534e", - "0x30f00500002830f08d31031100a34e00536c31231331431b08a0280501f2", - "0x2834e00530e00552202802834e00502800702830d00560030e00534e007", - "0x30b00526002830b00534e00530c03100718a02830c00534e005028014028", - "0x31000534e00531000502d02831100534e00531100500b02830800534e005", - "0x31031100a00530800534e0053080052bd02808d00534e00508d005346028", - "0x530d0050e902802834e00503100508d02802834e00502800702830808d", - "0x2831000534e00531000502d02831100534e00531100500b02808700534e", - "0x8d31031100a00508700534e0050870052bd02808d00534e00508d005346", - "0x34e00503100508d02802834e00531500504802802834e005028007028087", - "0x509600501802809600534e00502823e02809400534e005028349028028", - "0x2809900534e00502834802830700534e00509609400702002809600534e", - "0x2800500b02809700534e0053060050e902830600534e005307099007347", - "0x31b00534e00531b00534602808a00534e00508a00502d02802800534e005", - "0x2834e00502800702809731b08a02800a00509700534e0050970052bd028", - "0x509030500734702830500534e00502834802802834e00503100508d028", - "0x2802800534e00502800500b02830200534e0053040050e902830400534e", - "0x53020052bd02808800534e00508800534602831900534e00531900502d", - "0x522600519102802834e00502800702830208831902800a00530200534e", - "0x502834802802834e00503100508d02802834e00522a00519102802834e", - "0x30000534e0050a20050e90280a200534e00525830100734702830100534e", - "0x24c00534602824b00534e00524b00502d02802800534e00502800500b028", - "0x702830024c24b02800a00530000534e0053000052bd02824c00534e005", - "0x19102802834e00522600519102802834e00524100504802802834e005028", - "0x282ff00534e00502834902802834e00503100508d02802834e00522a005", - "0x52fe2ff0070200282fe00534e0052fe0050180282fe00534e00502823e", - "0x282fa00534e0052fd2fc0073470282fc00534e0050283480282fd00534e", - "0x504800502d02802800534e00502800500b0282f900534e0052fa0050e9", - "0x52f900534e0052f90052bd02804700534e00504700534602804800534e", - "0x19102802834e00522600519102802834e0050280070282f904704802800a", - "0x280a900534e00502834802802834e00503100508d02802834e00522a005", - "0x2800500b0280b000534e0052f80050e90282f800534e00523d0a9007347", - "0x23a00534e00523a00534602823700534e00523700502d02802800534e005", - "0x2834e0050280070280b023a23702800a0050b000534e0050b00052bd028", - "0x534e00502834902802834e00503100508d02802834e00522400531c028", - "0xac0070200282f700534e0052f70050180282f700534e00502826a0280ac", - "0x534e0052f50b40073470280b400534e0050283480282f500534e0052f7", - "0x502d02802800534e00502800500b0282f300534e0050b60050e90280b6", - "0x534e0052f30052bd02802300534e00502300534602834700534e005347", - "0x2834e00500c00534b02802834e0050280070282f302334702800a0052f3", - "0x534e00502825c0280b900534e00502834902802834e00503100508d028", - "0x3480282f000534e0052f10b90070200282f100534e0052f10050180282f1", - "0x34e0052ee0050e90282ee00534e0052f02ef0073470282ef00534e005028", - "0x34602834700534e00534700502d02802800534e00502800500b0282ed005", - "0x2ed02334702800a0052ed00534e0052ed0052bd02802300534e005023005", - "0x2ec00534e00502834802802834e00503100508d02802834e005028007028", - "0x500b0282eb00534e0050bf0050e90280bf00534e00504e2ec007347028", - "0x534e00504f00534602801000534e00501000502d02802800534e005028", - "0x34e00502834c0282eb04f01002800a0052eb00534e0052eb0052bd02804f", - "0x34e00502800702800f05000760105100b00734e007005028007005028028", - "0x52302804e00534e00504f00500602804f01000734e00500a00503c028028", - "0x534e00501300534f02804e00534e00504e00534f02801300534e005028", - "0x502800702801703000760204d01400734e00701304e00b031524028013", - "0x552502801400534e00501400500b02802834e00504d00522a02802834e", - "0x534c00505002802834e00502800702834b00560334c01800734e007010", - "0x2801b00534e00501b00501802801800534e00501800522602801b00534e", - "0x505002802834e00502800702834900560434a01c00734e007018005525", - "0x534e00501f00501802801c00534e00501c00522602801f00534e00534a", - "0x2802834e00502800702834700560534802000734e00701c00552502801f", - "0x50230050bf02802300534e00502300501802802300534e005348005050", - "0x60602834e00702d00531d02802000534e00502000522602802d02300734e", - "0x1b01400724702802834e00502300501c02802834e005028007028346005", - "0x34e00502000503c02802834e0050280070283440056070860c000734e007", - "0xb02803200534e00534200504002802834e0051a00050360283421a0007", - "0x3334f34103134e00703201f08600705100b05e0280c000534e0050c0005", - "0xb02802834e00503300504502802834e00502800702803603c00c031608", - "0x34e00534f00534602822200534e00534100502d02804000534e0050c0005", - "0x34e00503100508d02802834e005028007028028609005028013028224005", - "0x552602822a00534e00503622600734702822600534e005028348028028", - "0x534e00500c00502d0280c000534e0050c000500b02823000534e00522a", - "0xc000a00523000534e00523000535302803c00534e00503c00534602800c", - "0x3100508d02802834e00502000503602802834e00502800702823003c00c", - "0x2823e02804600534e00502834902802834e00501f00501c02802834e005", - "0x534e00504804600702002804800534e00504800501802804800534e005", - "0x552602823700534e00504704500734702804500534e005028348028047", - "0x534e00505100502d02834400534e00534400500b02823a00534e005237", - "0x34400a00523a00534e00523a00535302800700534e005007005346028051", - "0x502823d02802834e00534600531c02802834e00502800702823a007051", - "0x23e00534e00523e00501802823e00534e00523d02300708c02823d00534e", - "0x1400704302802834e00502800702824100560a02834e00723e00531d028", - "0x502000503c02802834e00502800702824700560b24624300734e00701b", - "0x2824c00534e00524b00504002802834e00524a00503602824b24a00734e", - "0x25a25803134e00724c01f24600705100b08702824300534e00524300500b", - "0x2802834e00505200504502802834e00502800702805a05d00903160c052", - "0x525a00534602805e00534e00525800502d02805b00534e00524300500b", - "0x503100508d02802834e00502800702802860d00502801302829b00534e", - "0x5260282e800534e00505a2a90073470282a900534e00502834802802834e", - "0x34e00500900502d02824300534e00524300500b02806000534e0052e8005", - "0xa00506000534e00506000535302805d00534e00505d005346028009005", - "0x508d02802834e00502000503602802834e00502800702806005d009243", - "0x23e02806200534e00502834902802834e00501f00501c02802834e005031", - "0x34e00506106200702002806100534e00506100501802806100534e005028", - "0x52602832600534e00505f31800734702831800534e00502834802805f005", - "0x34e00505100502d02824700534e00524700500b02804200534e005326005", - "0xa00504200534e00504200535302800700534e005007005346028051005", - "0x501c02802834e00524100531c02802834e005028007028042007051247", - "0x33201f00734e00501f0050bf02806900534e00502852702802834e00501b", - "0x531d02806b00534e00506b00501802806b00534e00506933200708c028", - "0x2834e00501f00501c02802834e00502800702806a00560e02834e00706b", - "0x700534602805100534e00505100502d02801400534e00501400500b028", - "0x2003100705101400b2f102802000534e00502000522602800700534e005", - "0x2802834e00502800702833107307100600a00533107307100600a34e005", - "0x7600534e00502852802802834e00502000503602802834e00506a00531c", - "0x531d02807700534e00507700501802807700534e00507601f00708c028", - "0x2834e00503100508d02802834e00502800702807900560f02834e007077", - "0x34e00532f00501802832f00534e0050282ee02833000534e005028349028", - "0x34702807c00534e00502834802804300534e00532f33000702002832f005", - "0x501400500b02808100534e00507b00552602807b00534e00504307c007", - "0x2800700534e00500700534602805100534e00505100502d02801400534e", - "0x2802834e00502800702808100705101400a00508100534e005081005353", - "0x34e00505100502d02805b00534e00501400500b02802834e00507900531c", - "0x28e02804000534e00505b00537602829b00534e00500700534602805e005", - "0x534e00502823a02822400534e00529b00552902822200534e00505e005", - "0x35302807f00534e00508300552b02808300534e00532c03100752a02832c", - "0x3602802834e00502800702807f22422204000a00507f00534e00507f005", - "0x2802834e00501f00501c02802834e00503100508d02802834e005347005", - "0x32900534e00502823e02832a00534e00502834902802834e00501b00501c", - "0x2834802832800534e00532932a00702002832900534e005329005018028", - "0x534e00532500552602832500534e00532832700734702832700534e005", - "0x534602805100534e00505100502d02801400534e00501400500b028324", - "0x2832400705101400a00532400534e00532400535302800700534e005007", - "0x2802834e00503100508d02802834e00534900503602802834e005028007", - "0x8e00534e00502823e02832000534e00502834902802834e00501b00501c", - "0x2834802831f00534e00508e32000702002808e00534e00508e005018028", - "0x534e00508c00552602808c00534e00531f31e00734702831e00534e005", - "0x534602805100534e00505100502d02801400534e00501400500b02831d", - "0x2831d00705101400a00531d00534e00531d00535302800700534e005007", - "0x2802834e00503100508d02802834e00534b00503602802834e005028007", - "0x534e00508a00501802808a00534e00502823e02831c00534e005028349", - "0x734702831a00534e00502834802831b00534e00508a31c00702002808a", - "0x34e00501400500b02808800534e00531900552602831900534e00531b31a", - "0x35302800700534e00500700534602805100534e00505100502d028014005", - "0x22a02802834e00502800702808800705101400a00508800534e005088005", - "0x2802834e00503100508d02802834e00501000503602802834e005017005", - "0x534e00536c00501802836c00534e00502852c02809000534e005028349", - "0x734702831400534e00502834802831500534e00536c09000702002836c", - "0x34e00503000500b02831200534e00531300552602831300534e005315314", - "0x35302800700534e00500700534602805100534e00505100502d028030005", - "0x3602802834e00502800702831200705103000a00531200534e005312005", - "0x2831100534e00502834902802834e00503100508d02802834e00500a005", - "0x531031100702002831000534e00531000501802831000534e005028230", - "0x2830e00534e00508d30f00734702830f00534e00502834802808d00534e", - "0x500f00502d02805000534e00505000500b02830d00534e00530e005526", - "0x530d00534e00530d00535302800700534e00500700534602800f00534e", - "0xa00734e00700502800700502802834e00502834c02830d00700f05000a", - "0xf03100734e0050310050bf02802834e00502800702805005100761000b", - "0x702801000561102834e00700f00531d02800a00534e00500a00500b028", - "0x34902802834e00503100501c02802834e00500700508d02802834e005028", - "0x4e00534e00504e00501802804e00534e00502852d02804f00534e005028", - "0x1400734702801400534e00502834802801300534e00504e04f007020028", - "0x534e00500a00500b02803000534e00504d0050e902804d00534e005013", - "0xa03100503000534e0050300052bd02800b00534e00500b00502d02800a", - "0x34e00502823d02802834e00501000531c02802834e00502800702803000b", - "0x2800a00534e00500a00500b02801800534e00501703100708c028017005", - "0xb00a00a2ed02801800534e00501800501802800b00534e00500b00502d", - "0x2802834e00502800702801b34b34c03100501b34b34c03134e005018007", - "0x1c00534e00502834902802834e00500700508d02802834e00503100501c", - "0x34a01c00702002834a00534e00534a00501802834a00534e005028230028", - "0x2000534e00534901f00734702801f00534e00502834802834900534e005", - "0x5000502d02805100534e00505100500b02834800534e0050200050e9028", - "0x2834c02834805005103100534800534e0053480052bd02805000534e005", - "0x2800702805005100761200b00a00734e00700502800700502802834e005", - "0xa00534e00500a00500b02800f03100734e0050310050bf02802834e005", - "0x3100501c02802834e00502800702801000561302834e00700f00531d028", - "0x2804e00534e00504f00700718a02804f00534e00502801402802834e005", - "0x500b00502d02800a00534e00500a00500b02801300534e00504e005260", - "0x502800702801300b00a03100501300534e0050130052bd02800b00534e", - "0x3100708c02801400534e00502823d02802834e00501000531c02802834e", - "0x534e00500b00502d02800a00534e00500a00500b02804d00534e005014", - "0x3003134e00504d00700b00a00a2ec02804d00534e00504d00501802800b", - "0x2834e00503100501c02802834e005028007028018017030031005018017", - "0x534e00502823002834c00534e00502834902802834e00500700508d028", - "0x34802801b00534e00534b34c00702002834b00534e00534b00501802834b", - "0x34e00534a0050e902834a00534e00501b01c00734702801c00534e005028", - "0x2bd02805000534e00505000502d02805100534e00505100500b028349005", - "0x52f02800f00534e00502852e02834905005103100534900534e005349005", - "0x504f00553102804e04f00734e00501000553002801000534e00500f005", - "0xbf02801400534e00501300500f02801300534e00504e00553202802834e", - "0x1400703153302801400534e00501400501802804d00b00734e00500b005", - "0x501702800753402801700534e00501700501802801703000734e00504d", - "0x1b00734e00534b00553602834b00534e00534c00553502834c01800734e", - "0x34a00553802834a00534e00501c00553702802834e00501b00535202801c", - "0x534e00501f0050db02801f34900734e00534900553902834900534e005", - "0x534f02834734800734e00534800503202834800534e005028342028020", - "0x534e00501800500b02803000534e0050300052e902834700534e005347", - "0x283440860c003161434602d02303134e00702034703100500a00c028018", - "0x534e0051a03490073510281a000534e00502853a02802834e005028007", - "0x52cf02834800534e00534800534f02802300534e00502300502d028342", - "0x34234802d02300a00c02834600534e00534600501802834200534e005342", - "0x2852e02802834e00502800702803c00c03303161534f34103203134e007", - "0x22200734e00504000553002804000534e00503600552f02803600534e005", - "0x22600500f02822600534e00522400553202802834e005222005531028224", - "0x34e00500b22a03003153302822a00534e00522a00501802822a00534e005", - "0x4800734e00504601800753402804600534e005046005018028046230007", - "0x2dc02823700534e0050450050db02804504700734e005047005539028047", - "0x34e00523d00503202823d00534e00502834202823a00534e005051346007", - "0x2823e00534e00523e00534f02803200534e00503200502d02823e23d007", - "0x52300052e902834f00534e00534f00501802823a00534e00523a005018", - "0x723a23723e34103200b03302804800534e00504800500b02823000534e", - "0x34e00502853a02802834e00502800702824a24724603161624324100734e", - "0x25800534e00505034f0072dc02824c00534e00524b04700735102824b005", - "0x24c0052cf02823d00534e00523d00534f02824100534e00524100502d028", - "0x25824c23d24324100b03302825800534e00525800501802824c00534e005", - "0x502801402802834e00502800702805a05d00903161705225a00734e007", - "0x29b00534e00505e00526002805e00534e00505b00a00718a02805b00534e", - "0x2300052e902825a00534e00525a00502d02804800534e00504800500b028", - "0x29b00534e00529b0052bd02805200534e00505200534602823000534e005", - "0x2834e00500a00508d02802834e00502800702829b05223025a04800b005", - "0x5a0052260282e800534e00505d0053460282a900534e00500900502d028", - "0xa00508d02802834e00502800702802861800502801302806000534e005", - "0x522a02802834e00534f00501c02802834e00504700553b02802834e005", - "0x282a900534e00524600502d02802834e00505000501c02802834e00523d", - "0x34e00502834802806000534e00524a0052260282e800534e005247005346", - "0x2805f00534e0050610050e902806100534e005060062007347028062005", - "0x52300052e90282a900534e0052a900502d02804800534e00504800500b", - "0x505f00534e00505f0052bd0282e800534e0052e800534602823000534e", - "0x2802834e00505100501c02802834e00502800702805f2e82302a904800b", - "0x2834e00500b00501c02802834e00534600501c02802834e00500a00508d", - "0x500c00534602831800534e00503300502d02802834e00505000501c028", - "0x2800702802861900502801302804200534e00503c00522602832600534e", - "0x522a02802834e00500a00508d02802834e00505100501c02802834e005", - "0x53b02802834e00505000501c02802834e00500b00501c02802834e005348", - "0x534e00508600534602831800534e0050c000502d02802834e005349005", - "0x6900734702806900534e00502834802804200534e005344005226028326", - "0x534e00501800500b02806b00534e0053320050e902833200534e005042", - "0x534602803000534e0050300052e902831800534e00531800502d028018", - "0x6b32603031801800b00506b00534e00506b0052bd02832600534e005326", - "0x1000552f02801000534e00502852e02800f05000734e0050510050cb028", - "0x2834e00504e00553102801304e00734e00504f00553002804f00534e005", - "0x500050bf02804d00534e00501400500f02801400534e005013005532028", - "0x503004d03103153302804d00534e00504d00501802803005000734e005", - "0x734e00501802800753402801800534e00501800501802801801700734e", - "0x2834a01c00734e00501b00553602801b00534e00534b00553502834b34c", - "0x34e00534900553802834900534e00534a00553702802834e00501c005352", - "0x2834800534e0050200050db02802001f00734e00501f00553902801f005", - "0x502300534f02802334700734e00534700503202834700534e005028342", - "0x2834c00534e00534c00500b02801700534e0050170052e902802300534e", - "0x280070281a034408603161a0c034602d03134e00734802300a00500a00c", - "0x2803200534e00534201f00735102834200534e00502853a02802834e005", - "0x50320052cf02834700534e00534700534f02802d00534e00502d00502d", - "0x34e00703234734602d00a00c0280c000534e0050c000501802803200534e", - "0x534100502d02802834e00502800702803603c00c03161b03334f341031", - "0x2803300534e00503300501802834f00534e00534f00534602834100534e", - "0x2834e00502800702822a22622403161c22204000734e0070c034c0072fd", - "0x34e00502800702804504704803161d04623000734e0070330400072fd028", - "0x23d00a34e00523722200703153c02823a23700734e00500f0052e7028028", - "0x50b002802834e0052430052fc02802834e00523e0052fc02824324123e", - "0x2fc02824c24b24a24700a34e00523a04623d03153c02824600534e005241", - "0x25800534e00524b0050b002802834e00524c0052fc02802834e00524a005", - "0x505200553002805200534e00525a00552f02825a00534e00502852e028", - "0x2805a00534e00505d00553202802834e00500900553102805d00900734e", - "0x5b01703153302805b00534e00505b00501802805b00534e00505a00500f", - "0x529b23000753402829b00534e00529b00501802829b05e00734e005050", - "0x534e0050600050db0280602e800734e0052e80055390282e82a900734e", - "0x534f02805f06100734e00506100503202806100534e005028342028062", - "0x534e0052470052f502824600534e00524600501802805f00534e00505f", - "0x500b02805e00534e00505e0052e902825800534e005258005018028247", - "0x3161e32631800734e00724606205f34f34100b0330282a900534e0052a9", - "0x2e800735102806b00534e00502853a02802834e005028007028332069042", - "0x534e00506100534f02831800534e00531800502d02806a00534e00506b", - "0x734e00725806a06132631800b03302806a00534e00506a0052cf028061", - "0x7700534e00502801402802834e00502800702807633107303161f071006", - "0x500b02833000534e00507900526002807900534e00507700b00718a028", - "0x534e0052470052f502800600534e00500600502d0282a900534e0052a9", - "0x52bd02807100534e00507100534602805e00534e00505e0052e9028247", - "0x2802834e00502800702833007105e2470062a905100533000534e005330", - "0x34e00533100534602832f00534e00507300502d02802834e00500b00508d", - "0x502800702802862000502801302807c00534e005076005226028043005", - "0x2e800553b02802834e00525800501c02802834e00500b00508d02802834e", - "0x34602832f00534e00504200502d02802834e00506100522a02802834e005", - "0x534e00502834802807c00534e00533200522602804300534e005069005", - "0xb02832c00534e0050810050e902808100534e00507c07b00734702807b", - "0x34e0052470052f502832f00534e00532f00502d0282a900534e0052a9005", - "0x2bd02804300534e00504300534602805e00534e00505e0052e9028247005", - "0x2834e00502800702832c04305e24732f2a905100532c00534e00532c005", - "0x34e00500b00508d02802834e0050450052fc02802834e0050470052fc028", - "0x52220052fc02802834e00505000501c02802834e00500f0050cf028028", - "0x7f00501802807f00534e00502823e02808300534e00502834902802834e", - "0x32900534e00502834802832a00534e00507f08300702002807f00534e005", - "0x500b02832700534e0053280050e902832800534e00532a329007347028", - "0x534e0050070052f502834100534e00534100502d02804800534e005048", - "0x52bd02834f00534e00534f00534602801700534e0050170052e9028007", - "0x2802834e00502800702832734f01700734104805100532700534e005327", - "0x2834e00500b00508d02802834e00522a0052fc02802834e0052260052fc", - "0x34e00503300501c02802834e00505000501c02802834e00500f0050cf028", - "0x532400501802832400534e00502823e02832500534e005028349028028", - "0x2808e00534e00502834802832000534e00532432500702002832400534e", - "0x22400500b02831e00534e00531f0050e902831f00534e00532008e007347", - "0x700534e0050070052f502834100534e00534100502d02822400534e005", - "0x31e0052bd02834f00534e00534f00534602801700534e0050170052e9028", - "0x1c02802834e00502800702831e34f01700734122405100531e00534e005", - "0x2802834e00500f0050cf02802834e00500b00508d02802834e0050c0005", - "0x34e00503c00534602808c00534e00500c00502d02802834e00505000501c", - "0x502800702802862100502801302831c00534e00503600522602831d005", - "0xf0050cf02802834e00500b00508d02802834e00534700522a02802834e", - "0x502d02802834e00501f00553b02802834e00505000501c02802834e005", - "0x534e0051a000522602831d00534e00534400534602808c00534e005086", - "0x50e902831b00534e00531c08a00734702808a00534e00502834802831c", - "0x534e00508c00502d02834c00534e00534c00500b02831a00534e00531b", - "0x534602801700534e0050170052e902800700534e0050070052f502808c", - "0x31d01700708c34c05100531a00534e00531a0052bd02831d00534e00531d", - "0x500a00501802800b00534e00502853f02800a00534e00502853e02831a", - "0x5100534e00700b00a00754102800b00534e00500b00501802800a00534e", - "0x5100554202805100534e00505100535402802834e005028007028028622", - "0x1802801000534e00502854402800f00534e00502854302805000534e005", - "0x701000f00754102801000534e00501000501802800f00534e00500f005", - "0x2804f00534e00504f00535402802834e00502800702802862304f00534e", - "0x1300554602801304e00734e00504e00554502804e00534e00504f005542", - "0x4d00534e00502800537802802834e00502800702801400562402834e007", - "0x2834e00502800702802862500502801302803000534e00504e005547028", - "0x534e00502854a02801700534e00502854902802834e00504e005548028", - "0x34c00734e00501401801702800a54b02801800534e005018005018028018", - "0x554d02834c00534e00534c00537802834b00534e00534b00554c02834b", - "0x534e00501b00554202802834e00502800702802862601b00534e00734b", - "0x2801302803000534e00501c00554702804d00534e00534c00537802801c", - "0x34c00537802834a00534e00502835002802834e005028007028028625005", - "0x3000734e00503000554502803000534e00534a00554702804d00534e005", - "0x554802802834e00502800702801f00562702834e007349005546028349", - "0x702802862800502801302802000534e00505000554702802834e005030", - "0x2834e00502800702834800562902834e00705000554602802834e005028", - "0x62800502801302802000534e00503000554702802834e00501f00554e028", - "0x534e00502854902802834e00503000554802802834e005028007028028", - "0x54f02802300534e00502300554c02802300534e00501f34700754f028347", - "0x702d00554d02802d00534e00502d00554c02802d00534e005348023007", - "0x280c000534e00534600554202802834e00502800702802862a34600534e", - "0x2802834e00502800702802862800502801302802000534e0050c0005547", - "0x34e00702000554602802000534e00508600554702808600534e005028350", - "0x2834902802834e00503100508d02802834e00502800702834400562b028", - "0x2834200534e00534200501802834200534e00502823e0281a000534e005", - "0x3234100734702834100534e00502834802803200534e0053421a0007020", - "0x4d00534e00504d00537802803300534e00534f0050e902834f00534e005", - "0x330052bd02800700534e00500700534602800500534e00500500502d028", - "0x34400555002802834e00502800702803300700504d00a00503300534e005", - "0x3600734e00503600553902803600534e00502855102803c00c00734e005", - "0x22400503202822400534e00502834202822200534e0050400050db028040", - "0x534e0052220052cf02822600534e00522600534f02822622400734e005", - "0x2804704804603162c23022a00734e00700c22222600700500b033028222", - "0x3600534e00503600555202804500534e00502853a02802834e005028007", - "0x534f02822a00534e00522a00502d02823700534e005045036007351028", - "0x23722423022a00b03302823700534e0052370052cf02822400534e005224", - "0x2801402802834e00502800702824324123e03162d23d23a00734e00703c", - "0x534e00524700526002824700534e00524603100718a02824600534e005", - "0x534602823a00534e00523a00502d02804d00534e00504d00537802824a", - "0x2824a23d23a04d00a00524a00534e00524a0052bd02823d00534e00523d", - "0x24b00534e00523e00502d02802834e00503100508d02802834e005028007", - "0x502801302825800534e00524300522602824c00534e005241005346028", - "0x503c00501c02802834e00503100508d02802834e00502800702802862e", - "0x4600502d02802834e00522400522a02802834e00503600553b02802834e", - "0x25800534e00504700522602824c00534e00504800534602824b00534e005", - "0x520050e902805200534e00525825a00734702825a00534e005028348028", - "0x24b00534e00524b00502d02804d00534e00504d00537802800900534e005", - "0x24b04d00a00500900534e0050090052bd02824c00534e00524c005346028", - "0x505000554802802834e00503100508d02802834e00502800702800924c", - "0x5a00501802805a00534e00502823e02805d00534e00502834902802834e", - "0x5e00534e00502834802805b00534e00505a05d00702002805a00534e005", - "0x53780282a900534e00529b0050e902829b00534e00505b05e007347028", - "0x534e00500700534602800500534e00500500502d02802800534e005028", - "0x34e0050280070282a900700502800a0052a900534e0052a90052bd028007", - "0x34e00502823e0282e800534e00502834902802834e00503100508d028028", - "0x2806200534e0050602e800702002806000534e005060005018028060005", - "0x505f0050e902805f00534e00506206100734702806100534e005028348", - "0x2800500534e00500500502d02802800534e00502800537802831800534e", - "0x700502800a00531800534e0053180052bd02800700534e005007005346", - "0x2800702804e04f01003162f00f05005103134e00703100500729e028318", - "0x2801300534e00500f00512102800f00534e00500f00511f02802834e005", - "0x5b02802834e00501400555302801801703004d01400b34e00501300529c", - "0x2802834e00501800501c02802834e00501700505b02802834e005030005", - "0x34e00502852e02834c00534e00504d00512b02804d00534e00504d005125", - "0x2834a01c00734e00501b00553002801b00534e00534b00552f02834b005", - "0x34e00534900500f02834900534e00534a00553202802834e00501c005531", - "0x2801f00534e00501f00501802802000b00734e00500b0050bf02801f005", - "0x53402834700534e00534700501802834734800734e00502001f007031533", - "0x34600553602834600534e00502d00553502802d02300734e005347028007", - "0x34400534e00508600553702802834e0050c00053520280860c000734e005", - "0x50db0283421a000734e0051a00055390281a000534e005344005538028", - "0x34100734e00534100503202834100534e00502834202803200534e005342", - "0x530e02834f00534e00534f00534f02805100534e00505100502d02834f", - "0x534e00502300500b02834800534e0053480052e902834c00534e00534c", - "0x2822204003603163003c00c03303134e00703234f05005100a00c028023", - "0x534e0052241a000735102822400534e00502853a02802834e005028007", - "0x52cf02834100534e00534100534f02803300534e00503300502d028226", - "0x22634100c03300a00c02803c00534e00503c00501802822600534e005226", - "0x529302802834e00502800702804504704803163104623022a03134e007", - "0x501c02825a25824c24b24a24724624324123e23d23a23701434e00534c", - "0x1c02802834e00523d0052fc02802834e00523a00505b02802834e005237", - "0x2802834e00524600501c02802834e00524300501c02802834e005241005", - "0x2834e00524b00504502802834e00524a0052fc02802834e005247005112", - "0x34e00525a00504502802834e00525800522a02802834e00524c00522a028", - "0x2d02800900534e00505200503102805223e00734e00523e0052c3028028", - "0x34e00504600501802823000534e00523000534602822a00534e00522a005", - "0x2834e00502800702805b00563205a05d00734e007009005051028046005", - "0x34e00502855402805e00534e00505a00505002802834e00505d00534b028", - "0x1802829b00534e00529b00534f0282a900534e00523e00503102829b005", - "0x620056330602e800734e00729b2a902303155502805e00534e00505e005", - "0x34e00506000505002806000534e00506000555602802834e005028007028", - "0x553002831800534e00505f00552f02805f00534e00502852e028061005", - "0x534e00504200553202802834e00532600553102804232600734e005318", - "0x3153302833200534e00533200501802833200534e00506900500f028069", - "0x2e800753402806a00534e00506a00501802806a06b00734e00500b332348", - "0x50730050db02807307100734e00507100553902807100600734e00506a", - "0x7700534e00507603c0072dc02807600534e00505e00500f02833100534e", - "0x33000534f02833007900734e00507900503202807900534e005028342028", - "0x6100534e00506100501802807700534e00507700501802833000534e005", - "0x22a00b03302800600534e00500600500b02806b00534e00506b0052e9028", - "0x2834e00502800702808107b07c03163404332f00734e007077331330230", - "0x6100500f02808300534e00532c07100735102832c00534e00502853a028", - "0x534e00532f00502d02832a00534e00507f0460072dc02807f00534e005", - "0x501802808300534e0050830052cf02807900534e00507900534f02832f", - "0x3163532832900734e00732a08307904332f00b03302832a00534e00532a", - "0xa00718a02832000534e00502801402802834e005028007028324325327", - "0x534e00500600500b02831f00534e00508e00526002808e00534e005320", - "0x534602806b00534e00506b0052e902832900534e00532900502d028006", - "0x31f32806b32900600b00531f00534e00531f0052bd02832800534e005328", - "0x534e00532700502d02802834e00500a00508d02802834e005028007028", - "0x2801302831d00534e00532400522602808c00534e00532500534602831e", - "0x7100553b02802834e00500a00508d02802834e005028007028028636005", - "0x501c02802834e00507900522a02802834e00506100501c02802834e005", - "0x8c00534e00507b00534602831e00534e00507c00502d02802834e005046", - "0x31d31c00734702831c00534e00502834802831d00534e005081005226028", - "0x600534e00500600500b02831b00534e00508a0050e902808a00534e005", - "0x8c00534602806b00534e00506b0052e902831e00534e00531e00502d028", - "0x2831b08c06b31e00600b00531b00534e00531b0052bd02808c00534e005", - "0x2802834e00500a00508d02802834e00503c00501c02802834e005028007", - "0x2834e00504600501c02802834e00505e00501c02802834e00500b00501c", - "0x34e00531900501802831900534e00502825c02831a00534e005028349028", - "0x34702809000534e00502834802808800534e00531931a007020028319005", - "0x506200500b02831500534e00536c0050e902836c00534e005088090007", - "0x2834800534e0053480052e902822a00534e00522a00502d02806200534e", - "0x34822a06200b00531500534e0053150052bd02823000534e005230005346", - "0x503c00501c02802834e00505b00534b02802834e005028007028315230", - "0x4600501c02802834e00500b00501c02802834e00500a00508d02802834e", - "0x2825c02831400534e00502834902802834e00523e00504502802834e005", - "0x534e00531331400702002831300534e00531300501802831300534e005", - "0x50e902831000534e00531231100734702831100534e005028348028312", - "0x534e00522a00502d02802300534e00502300500b02808d00534e005310", - "0x52bd02823000534e00523000534602834800534e0053480052e902822a", - "0x1c02802834e00502800702808d23034822a02300b00508d00534e00508d", - "0x2802834e00500b00501c02802834e00500a00508d02802834e00503c005", - "0x34e00504700534602830f00534e00504800502d02802834e00534c005312", - "0x502800702802863700502801302830d00534e00504500522602830e005", - "0xb00501c02802834e00500a00508d02802834e00534100522a02802834e", - "0x502d02802834e0051a000553b02802834e00534c00531202802834e005", - "0x534e00522200522602830e00534e00504000534602830f00534e005036", - "0x50e902830b00534e00530d30c00734702830c00534e00502834802830d", - "0x534e00530f00502d02802300534e00502300500b02830800534e00530b", - "0x52bd02830e00534e00530e00534602834800534e0053480052e902830f", - "0x8d02802834e00502800702830830e34830f02300b00530800534e005308", - "0x2808700534e00502834802802834e00500b00501c02802834e00500a005", - "0x2800500b02809600534e0050940050e902809400534e00504e087007347", - "0x700534e0050070052e902801000534e00501000502d02802800534e005", - "0x1002800b00509600534e0050960052bd02804f00534e00504f005346028", - "0x2855902801000534e00502855802805000534e00502855702809604f007", - "0x2834c02802834e00502824302801400534e00502855a02804e00534e005", - "0x2855c02803000534e00502855c02804d00534e00502855b02802834e005", - "0x34e00501801703004d00a55e02801800534e00502855c02801700534e005", - "0x2863834b00534e00734c00556102834c00534e00534c00555f02834c005", - "0x34e00502856302801c01b00734e00503100556202802834e005028007028", - "0x556402801f00534e00502855c02834900534e00534a00556402834a005", - "0x34700534e00534800556402834800534e00502855c02802000534e00501f", - "0x2034900a56502802d00534e00502300556402802300534e00502855c028", - "0x34e00534600556702801c00534e00501c00556602834600534e00502d347", - "0x6390c000534e00734601c00756802801b00534e00501b00537a028346005", - "0x500b00508d02802834e0050c000556902802834e005028007028086005", - "0x5000556c02802834e00501000556b02802834e00504e00556a02802834e", - "0x2834902802834e00534b00556e02802834e00501400556d02802834e005", - "0x281a000534e0051a00050180281a000534e00502856f02834400534e005", - "0x34203200734702803200534e00502834802834200534e0051a0344007020", - "0x2800534e00502800500b02834f00534e0053410050e902834100534e005", - "0x1b00537a02800700534e0050070052dd02800500534e0050050052de028", - "0x34f00534e00534f0052bd02800a00534e00500a00502d02801b00534e005", - "0x534e00502857002802834e00502800702834f00a01b007005028051005", - "0x3c00556402803c00534e00502855c02800c00534e005033005564028033", - "0x2822200534e00504000556402804000534e00502855c02803600534e005", - "0x22203600c00a56502822600534e00522400556402822400534e00502855c", - "0x34e00722a08600756802822a00534e00522a00556702822a00534e005226", - "0x57202804800534e00502857102802834e00502800702804600563a230005", - "0x4700534e00504700557402804500534e00502857302804700534e005028", - "0x34e00704504734b23004800700505057502804500534e005045005356028", - "0x23700557602802834e00502800702824123e23d23a00a63b237013051031", - "0x5100534e00505105000757702802834e00502800a02824624300734e005", - "0x24a00563c24700534e00724600535702801300534e005013014007578028", - "0x2800702824c00563d24b00534e00724700557902802834e005028007028", - "0x2834e00502800702825a00563e25800534e00724b00557a02802834e005", - "0x502801302800900534e00505200557c02805200534e00525800557b028", - "0x502801302800900534e00525a00557c02802834e00502800702802863f", - "0x502801302800900534e00524c00557c02802834e00502800702802863f", - "0x502834c02800900534e00524a00557c02802834e00502800702802863f", - "0x5a05d00734e00524300557e02804f00534e00500901b00757d02802834e", - "0x534e00502855c02805b00534e00502857002802834e00505d00557f028", - "0x5e05b00a5800282a900534e00502855c02829b00534e00502855c02805e", - "0x506000557f02806206000734e0052e800557e0282e800534e0052a929b", - "0x58302806200534e00506200558202805a00534e00505a00558202802834e", - "0x6100528f02804f00534e00504f04e00758502806100534e00506205a007", - "0x2834e00505f00504802802834e00502800702831800564005f00534e007", - "0x534e00502823a02832600534e00502858602802834e00500b00508d028", - "0x34e00502858802833200534e00502858702806900534e005028342028042", - "0x2800534e00502800500b02806a00534e00506904232603158a02806b005", - "0x6b00534f02833200534e00533200501802806a00534e00506a00558b028", - "0x7100535b02807100600734e00506b33206a02800a58c02806b00534e005", - "0x734e00507300558d02802834e00502800702833100564107300534e007", - "0x502858802807900534e00502858f02802834e005077005048028077076", - "0x2807600534e00507600558b02800600534e00500600500b02833000534e", - "0x7600600a58c02833000534e00533000534f02807900534e005079005018", - "0x702807b00564207c00534e00704300535b02804332f00734e005330079", - "0x2834e00532c00504802832c08100734e00507c00558d02802834e005028", - "0x34e00532f00500b02807f00534e00502858802808300534e005028590028", - "0x34f02808300534e00508300501802808100534e00508100558b02832f005", - "0x35b02832932a00734e00507f08308132f00a58c02807f00534e00507f005", - "0x532800558d02802834e00502800702832700564332800534e007329005", - "0x35c02832000534e00502859102802834e00532400504802832432500734e", - "0x534e00532500558b02832a00534e00532a00500b02808e00534e005028", - "0xa58c02808e00534e00508e00534f02832000534e005320005018028325", - "0x31d00564408c00534e00731e00535b02831e31f00734e00508e32032532a", - "0x8a00534e00502859302831c00534e00502834902802834e005028007028", - "0x558d02831b00534e00508a31c00702002808a00534e00508a005018028", - "0x34e00500f01000759402802834e00531a00504802831a00f00734e00508c", - "0x59902802834e00531900559702808831900734e00500f00559602800f005", - "0x501c02831431536c03134e00509000559a02809008800734e005088005", - "0x31336c00734e00536c00559b02802834e00531400522a02802834e005315", - "0x31100501802831100534e00531200507102831200534e00531300559c028", - "0x534e00536c00559d02831000534e00531131b00702002831100534e005", - "0x559e02800a00534e00500a00502d02831f00534e00531f00500b02808d", - "0x31008d00a31f00a59f02831000534e00531000522602808d00534e00508d", - "0x30c00534e00730d00533202802834e00502800a02830d30e30f03134e005", - "0x4802808730800734e00530c00506b02802834e00502800702830b005645", - "0x34e00509400559a02809408800734e00508800559902802834e005087005", - "0xf02802834e00509900522a02802834e0050960055a0028099307096031", - "0x508800559a02809700534e00530630800702002830600534e005307005", - "0x2802834e00530400501c02802834e0053050055a002830230430503134e", - "0xa20970070200280a200534e00530100507102830100534e005302005148", - "0x70280286460050280130282ff00534e00530000522602830000534e005", - "0x2fd2fe00734e00530b00533102802834e0050880055a102802834e005028", - "0x34e00502834c0282ff00534e0052fd00522602802834e0052fe005076028", - "0x50e90282fa00534e0052ff2fc0073470282fc00534e005028348028028", - "0x534e0050510052de02830f00534e00530f00500b0282f900534e0052fa", - "0x502d02804f00534e00504f00537a02801300534e0050130052dd028051", - "0x30e04f01305130f0510052f900534e0052f90052bd02830e00534e00530e", - "0x34e00531d0050e902802834e00501000556b02802834e0050280070282f9", - "0x2dd02805100534e0050510052de02831f00534e00531f00500b0280a9005", - "0x34e00500a00502d02804f00534e00504f00537a02801300534e005013005", - "0x70280a900a04f01305131f0510050a900534e0050a90052bd02800a005", - "0x282f800534e0053270050e902802834e00501000556b02802834e005028", - "0x50130052dd02805100534e0050510052de02832a00534e00532a00500b", - "0x2800a00534e00500a00502d02804f00534e00504f00537a02801300534e", - "0x34e0050280070282f800a04f01305132a0510052f800534e0052f80052bd", - "0x32f00500b0280b000534e00507b0050e902802834e00501000556b028028", - "0x1300534e0050130052dd02805100534e0050510052de02832f00534e005", - "0xb00052bd02800a00534e00500a00502d02804f00534e00504f00537a028", - "0x56b02802834e0050280070280b000a04f01305132f0510050b000534e005", - "0x534e00500600500b0280ac00534e0053310050e902802834e005010005", - "0x537a02801300534e0050130052dd02805100534e0050510052de028006", - "0x534e0050ac0052bd02800a00534e00500a00502d02804f00534e00504f", - "0x531800504802802834e0050280070280ac00a04f0130510060510050ac", - "0xb00718a0282f700534e00502801402802834e00501000556b02802834e", - "0x534e00502800500b0280b400534e0052f50052600282f500534e0052f7", - "0x537a02801300534e0050130052dd02805100534e0050510052de028028", - "0x534e0050b40052bd02800a00534e00500a00502d02804f00534e00504f", - "0x523e0055a202802834e0050280070280b400a04f0130510280510050b4", - "0x1000556b02802834e00504e00556a02802834e00500b00508d02802834e", - "0x2834902802834e00501400556d02802834e00505000556c02802834e005", - "0x282f300534e0052f30050180282f300534e0050285a30280b600534e005", - "0x34e0050285730282f100534e0050285720280b900534e0052f30b6007020", - "0x3560282f100534e0052f100557402823d00534e00523d0052dd0282f0005", - "0x2ed2ee2ef03134e0052f02f124123d01b00b5a40282f000534e0052f0005", - "0x34e0050b900522602823a00534e00523a0052de02802834e00502800a028", - "0x3570282ee00534e0052ee0052dd0282ef00534e0052ef00537a0280b9005", - "0x72ec00557902802834e0050280070280bf0056472ec00534e0072ed005", - "0x2e900534e0072eb00557a02802834e0050280070282ea0056482eb00534e", - "0x557c02837200534e0052e900557b02802834e005028007028053005649", - "0x557c02802834e00502800702802864a00502801302837300534e005372", - "0x557c02802834e00502800702802864a00502801302837300534e005053", - "0x557c02802834e00502800702802864a00502801302837300534e0052ea", - "0x37400534e0053732ef00757d02802834e00502834c02837300534e0050bf", - "0x3760050e902837600534e0050b90dc0073470280dc00534e005028348028", - "0x23a00534e00523a0052de02802800534e00502800500b0280c700534e005", - "0xa00502d02837400534e00537400537a0282ee00534e0052ee0052dd028", - "0xc700a3742ee23a0280510050c700534e0050c70052bd02800a00534e005", - "0x2834e00500b00508d02802834e0050460055a502802834e005028007028", - "0x34e00505000556c02802834e00501000556b02802834e00504e00556a028", - "0x34e00502834902802834e00534b00556e02802834e00501400556d028028", - "0x70200280c900534e0050c90050180280c900534e0050285a60280c6005", - "0x34e0050cb0cf0073470280cf00534e0050283480280cb00534e0050c90c6", - "0x2de02802800534e00502800500b02837700534e0052e70050e90282e7005", - "0x34e00501b00537a02800700534e0050070052dd02800500534e005005005", - "0x5100537700534e0053770052bd02800a00534e00500a00502d02801b005", - "0x2802834e00500b00508d02802834e00502800702837700a01b007005028", - "0x2834e00505000556c02802834e00501000556b02802834e00504e00556a", - "0x534e00502823e0282f400534e00502834902802834e00501400556d028", - "0x3480282e100534e0053782f400702002837800534e005378005018028378", - "0x34e0052e00050e90282e000534e0052e10d40073470280d400534e005028", - "0x2dd02800500534e0050050052de02802800534e00502800500b0280d5005", - "0x34e00500a00502d02803100534e00503100537a02800700534e005007005", - "0x5a70280d500a0310070050280510050d500534e0050d50052bd02800a005", - "0x34e00503100556402803100534e00502856302800700500734e005028005", - "0x2855c02805100534e00500b00556402800b00534e00502855c02800a005", - "0x2801000534e00502855c02800f00534e00505000556402805000534e005", - "0x5a802804e00534e00504f00f05100a00a56502804f00534e005010005564", - "0x34e00500500537a02804e00534e00504e00556702800700534e005007005", - "0x2834e00502800702801400564b01300534e00704e0070075a9028005005", - "0x2802834e00502800702802864c00502801302802834e0050130055aa028", - "0x534e00504d00514a02804d00534e00502801402802834e0050140055ab", - "0x514d02800500534e00500500537a02801700534e00503000514b028030", - "0x31f02805103100734e0050310052eb02801700500700501700534e005017", - "0x34e00502800702801304e04f03164d01000f05003134e007051005028031", - "0x504002802834e00501400503602804d01400734e00500b00503c028028", - "0x34e00500a0050bf02801703100734e0050310052eb02803000534e00504d", - "0x2801000534e00501000508102805000534e00505000502d02801800a007", - "0x702834934a01c03164e01b34b34c03134e00703001801700f05000b05e", - "0x7c02802834e00500700508d02802834e00501b00504502802834e005028", - "0x2802834e00500a00501c02802834e00503100505b02802834e005010005", - "0x534e00502000501802802000534e00502859302801f00534e005028349", - "0x501802834700534e00502823a02834800534e00502001f007020028020", - "0x534e0050285ac02802300534e00534734800702002834700534e005347", - "0x23702834600534e00502d02300702002802d00534e00502d00501802802d", - "0x34e0050c03460070200280c000534e0050c00050180280c000534e005028", - "0xe90281a000534e00508634400734702834400534e005028348028086005", - "0x34e00534b00534602834c00534e00534c00502d02834200534e0051a0005", - "0x34e00502800702834234b34c03100534200534e0053420052bd02834b005", - "0x504f02802834e00503200503602834103200734e00534900503c028028", - "0x534e00534a00534602801c00534e00501c00502d02834100534e005341", - "0x2802834e00502800702800c00564f03334f00734e0073410055ad02834a", - "0x503c00500f02803c00534e00503300505002803300534e005033005556", - "0x8c02803600534e00503600501802804000534e0050285ae02803600534e", - "0x534f00504f02822200534e00522200501802822200534e005040036007", - "0x2802834e00502800702822400565002834e00722200531d02834f00534e", - "0x534b02802834e00502800702823000565122a22600734e00734f0055ad", - "0x4600534e00522a00505002822a00534e00522a00555602802834e005226", - "0x4700a00708c02804700534e0050285af02804800534e00504600500f028", - "0x4800534e00504800501802804500534e00504500501802804500534e005", - "0x502836002802834e00502800702823700565202834e00704500531d028", - "0x23d00534e00523d00501802823d00534e00523a04800708c02823a00534e", - "0x502801302802834e00502800702823e00565302834e00723d00531d028", - "0x500700508d02802834e00523e00531c02802834e005028007028028654", - "0x502834902802834e00503100505b02802834e00501000507c02802834e", - "0x2002824300534e00524300501802824300534e0050285b002824100534e", - "0x524624700734702824700534e00502834802824600534e005243241007", - "0x2801c00534e00501c00502d02824b00534e00524a0050e902824a00534e", - "0x24b34a01c03100524b00534e00524b0052bd02834a00534e00534a005346", - "0x24c00534e0050282bf02802834e00523700531c02802834e005028007028", - "0x531d02825800534e00525800501802825800534e00524c04800708c028", - "0x703134a01c03131f02802834e00502800702825a00565502834e007258", - "0x50282d502802834e00502800702805e05b05a03165605d00905203134e", - "0x602e800734e0052a90055b30282a900534e00529b0055b202829b00534e", - "0x506200553802806200534e00506000536102802834e0052e80055b5028", - "0x2d02831800534e00502834202805f00534e0050610050db02806100534e", - "0x34e00505f0052cf02831800534e00531800534f02805200534e005052005", - "0x3134e00705f31800905200a00c02805d00534e00505d00508102805f005", - "0x34e00506900501802802834e00502800702806a06b332031657069042326", - "0x31d02804200534e00504200534602832600534e00532600502d028069005", - "0x34e00501000531e02802834e00502800702800600565802834e007069005", - "0x2833100534e00507307100708c02807300534e00505d00531e028071005", - "0x2800702807600565902834e00733100531d02833100534e005331005018", - "0x2807900534e00507700700718a02807700534e00502801402802834e005", - "0x504200534602832600534e00532600502d02833000534e005079005260", - "0x502800702833004232603100533000534e0053300052bd02804200534e", - "0x502834902802834e00500700508d02802834e00507600531c02802834e", - "0x2002804300534e00504300501802804300534e0050285b702832f00534e", - "0x507c07b00734702807b00534e00502834802807c00534e00504332f007", - "0x2832600534e00532600502d02832c00534e0050810050e902808100534e", - "0x32c04232603100532c00534e00532c0052bd02804200534e005042005346", - "0x2834e00500700508d02802834e00500600531c02802834e005028007028", - "0x534e00502834902802834e00501000507c02802834e00505d00507c028", - "0x8300702002807f00534e00507f00501802807f00534e0050285b8028083", - "0x534e00532a32900734702832900534e00502834802832a00534e00507f", - "0x534602832600534e00532600502d02832700534e0053280050e9028328", - "0x702832704232603100532700534e0053270052bd02804200534e005042", - "0x8d02802834e00501000507c02802834e00505d00507c02802834e005028", - "0x534e00506a32500734702832500534e00502834802802834e005007005", - "0x534602833200534e00533200502d02832000534e0053240050e9028324", - "0x702832006b33203100532000534e0053200052bd02806b00534e00506b", - "0x34802802834e00501000507c02802834e00500700508d02802834e005028", - "0x34e00531f0050e902831f00534e00505e08e00734702808e00534e005028", - "0x2bd02805b00534e00505b00534602805a00534e00505a00502d02831e005", - "0x531c02802834e00502800702831e05b05a03100531e00534e00531e005", - "0x5b02802834e00501000507c02802834e00500700508d02802834e00525a", - "0x2831d00534e0050285b002808c00534e00502834902802834e005031005", - "0x502834802831c00534e00531d08c00702002831d00534e00531d005018", - "0x31a00534e00531b0050e902831b00534e00531c08a00734702808a00534e", - "0x31a0052bd02834a00534e00534a00534602801c00534e00501c00502d028", - "0x523000534b02802834e00502800702831a34a01c03100531a00534e005", - "0x3100505b02802834e00501000507c02802834e00500700508d02802834e", - "0x2823e02831900534e00502834902802834e00500a00501c02802834e005", - "0x534e00508831900702002808800534e00508800501802808800534e005", - "0x50e902831500534e00509036c00734702836c00534e005028348028090", - "0x534e00534a00534602801c00534e00501c00502d02831400534e005315", - "0x2834e00502800702831434a01c03100531400534e0053140052bd02834a", - "0x34e00501000507c02802834e00500700508d02802834e00522400531c028", - "0x534f00534b02802834e00500a00501c02802834e00503100505b028028", - "0x31200501802831200534e0050285b002831300534e00502834902802834e", - "0x31000534e00502834802831100534e00531231300702002831200534e005", - "0x502d02830f00534e00508d0050e902808d00534e005311310007347028", - "0x534e00530f0052bd02834a00534e00534a00534602801c00534e00501c", - "0x2802834e00500c00534b02802834e00502800702830f34a01c03100530f", - "0x2834e00503100505b02802834e00501000507c02802834e00500700508d", - "0x534e00502823e02830e00534e00502834902802834e00500a00501c028", - "0x34802830c00534e00530d30e00702002830d00534e00530d00501802830d", - "0x34e0053080050e902830800534e00530c30b00734702830b00534e005028", - "0x2bd02834a00534e00534a00534602801c00534e00501c00502d028087005", - "0x508d02802834e00502800702808734a01c03100508700534e005087005", - "0x1c02802834e00503100505b02802834e00500b00503602802834e005007", - "0x534e00501309400734702809400534e00502834802802834e00500a005", - "0x534602804f00534e00504f00502d02830700534e0050960050e9028096", - "0x3102830704e04f03100530700534e0053070052bd02804e00534e00504e", - "0x702800b00565a00a03100734e00700700505102800700534e005005005", - "0x5000534e00503100504f02805100534e00500a00524a02802834e005028", - "0x2834e00502800702802865b00502801302800f00534e00505100524b028", - "0x500b00504f02804f00534e00501000524c02801000534e005028014028", - "0x4e05000734e00505000506a02800f00534e00504f00524b02805000534e", - "0x2804d00565c01400534e00700f00525802801300534e00504e005040028", - "0x534e00503000500f02803000534e00501400505002802834e005028007", - "0x65d34c01800734e00701702800710902801700534e005017005018028017", - "0x34e00502834202802834e00501300504502802834e00502800702834b005", - "0x34a34c00734e00534c00503202801c05000734e00505000506a02801b005", - "0x1f34900734e00734a01b01c01800a5ba02801b00534e00501b00534f028", - "0x602834805000734e00505000506a02802834e00502800702802000565e", - "0x534700534f02802334c00734e00534c00503202834700534e005348005", - "0x734e00702334734903152402801f00534e00501f00504f02834700534e", - "0x734634c05002d00a5ba02802834e0050280070280860c000765f34602d", - "0x534e00501f00504002802834e0050280070283420056601a034400734e", - "0x75bc02834f00534e0051a000504002834100534e0050320055bb028032", - "0x34e00534400500b02800c00534e0050330055bd02803300534e00534134f", - "0x2834e00502800702800c34400700500c00534e00500c0055be028344005", - "0x534e00502825c02803c00534e00502834902802834e00501f00534b028", - "0x34802804000534e00503603c00702002803600534e005036005018028036", - "0x34e0052240055bf02822400534e00504022200734702822200534e005028", - "0x700522600534e0052260055be02834200534e00534200500b028226005", - "0x501f00534b02802834e00508600522a02802834e005028007028226342", - "0x502834902802834e00534c00522a02802834e00505000534b02802834e", - "0x2002823000534e00523000501802823000534e0050285c002822a00534e", - "0x504604800734702804800534e00502834802804600534e00523022a007", - "0x280c000534e0050c000500b02804500534e0050470055bf02804700534e", - "0x522a02802834e0050280070280450c000700504500534e0050450055be", - "0x25c02823700534e00502834902802834e00505000534b02802834e00534c", - "0x34e00523a23700702002823a00534e00523a00501802823a00534e005028", - "0x5bf02824100534e00523d23e00734702823e00534e00502834802823d005", - "0x34e0052430055be02802000534e00502000500b02824300534e005241005", - "0x2802834e00505000534b02802834e005028007028243020007005243005", - "0x52470130075bc02824700534e0052460055c102824600534e005028014", - "0x2834b00534e00534b00500b02824b00534e00524a0055bd02824a00534e", - "0x504802802834e00502800702824b34b00700524b00534e00524b0055be", - "0x5c102824c00534e00502801402802834e00505000534b02802834e00504d", - "0x525a0055bd02825a00534e0052580130075bc02825800534e00524c005", - "0x505200534e0050520055be02802800534e00502800500b02805200534e", - "0x66105100b00734e00700502800700502802834e00502834c028052028007", - "0xb02801000a00734e00500a0050bf02802834e00502800702800f050007", - "0x502800702804f00566202834e00701000531d02800b00534e00500b005", - "0x75c302804e00534e0050310055c202802834e00500a00501c02802834e", - "0x34e00500b00500b02801400534e0050130055c402801300534e00504e007", - "0x3100501400534e0050140055c502805100534e00505100502d02800b005", - "0xb00500b02802834e00504f00531c02802834e00502800702801405100b", - "0x3134e00500700b0075c602800700534e00500700525a02800b00534e005", - "0x2834e00502800702834c00566301800534e0070170055c702801703004d", - "0xa00708c02801b00534e00502823d02834b00534e0050180310075c8028", - "0x534e00505100502d02804d00534e00504d00500b02801c00534e00501b", - "0x501802834b00534e00534b0050fb02803000534e00503000525a028051", - "0x501f34934a03134e00501c34b03005104d00b0f902801c00534e00501c", - "0x510302802834e00500a00501c02802834e00502800702801f34934a031", - "0x534e0050200300075c302802000534e00534c00536502802834e005031", - "0x502d02804d00534e00504d00500b02834700534e0053480055c4028348", - "0x702834705104d03100534700534e0053470055c502805100534e005051", - "0x4502802834e00503100510302802834e00500a00501c02802834e005028", - "0x2802d00534e00502823002802300534e00502834902802834e005007005", - "0x502834802834600534e00502d02300702002802d00534e00502d005018", - "0x34400534e00508600566402808600534e0053460c00073470280c000534e", - "0x3440055c502800f00534e00500f00502d02805000534e00505000500b028", - "0x502800700502802834e00502834c02834400f05003100534400534e005", - "0x500700503102802834e00502800702805005100766500b00a00734e007", - "0x505102800a00534e00500a00500b02802834e00502800a02800f00534e", - "0x504f00524a02802834e00502800702804e00566604f01000734e00700f", - "0x2804d00534e00501300524b02801400534e00501000504f02801300534e", - "0x24c02803000534e00502801402802834e005028007028028667005028013", - "0x34e00501700524b02801400534e00504e00504f02801700534e005030005", - "0x566834c00534e00704d00525802801800534e00501400504002804d005", - "0x503100503102801b00534e00534c00505002802834e00502800702834b", - "0x34934a00734e00701c00505102801b00534e00501b00501802801c00534e", - "0x504002802000534e00534900505002802834e00502800702801f005669", - "0x534e00502000500f02834700534e00501b00500f02834800534e00534a", - "0x1802802d00534e00502334700708c02802300534e005023005018028023", - "0x34e00702d00531d02834800534e00534800525a02802d00534e00502d005", - "0xa00500b02802834e00502834c02802834e00502800702834600566a028", - "0x1800534e00501800525a02800b00534e00500b00502d02800a00534e005", - "0x860c003134e00534801800b00a00a13802834800534e00534800525a028", - "0x31c02802834e00502834c02802834e0050280070283440860c0031005344", - "0x34200534e0051a00050a20281a000534e00502801402802834e005346005", - "0xb02834100534e00503200566c02803200534e00534234801803166b028", - "0x34e00534100566d02800b00534e00500b00502d02800a00534e00500a005", - "0x2802834e00502834c02802834e00502800702834100b00a031005341005", - "0x2834e00501800504502802834e00501b00501c02802834e00501f00534b", - "0x34e00503300501802803300534e00502823e02834f00534e005028349028", - "0x34702803c00534e00502834802800c00534e00503334f007020028033005", - "0x500a00500b02804000534e00503600536602803600534e00500c03c007", - "0x504000534e00504000566d02800b00534e00500b00502d02800a00534e", - "0x34b00504802802834e00502834c02802834e00502800702804000b00a031", - "0x66b02822400534e00522200530202822200534e00502801402802834e005", - "0xa00500b02822a00534e00522600566c02822600534e005224031018031", - "0x22a00534e00522a00566d02800b00534e00500b00502d02800a00534e005", - "0x4502802834e00503100504502802834e00502800702822a00b00a031005", - "0x2804600534e00502823002823000534e00502834902802834e005007005", - "0x502834802804800534e00504623000702002804600534e005046005018", - "0x23700534e00504500536602804500534e00504804700734702804700534e", - "0x23700566d02805000534e00505000502d02805100534e00505100500b028", - "0x502800700502802834e00502834c02823705005103100523700534e005", - "0x500700513e02802834e00502800702805005100766e00b00a00734e007", - "0x566f02800a00534e00500a00500b02802834e00502800a02800f00534e", - "0x504f00567102802834e00502800702804e00567004f01000734e00700f", - "0x2804d00534e00501300567302801400534e00501000567202801300534e", - "0x67502803000534e00502801402802834e005028007028028674005028013", - "0x34e00501700567302801400534e00504e00567202801700534e005030005", - "0x567734c00534e00704d00567602801800534e00501400510102804d005", - "0x503100513e02801b00534e00534c00567802802834e00502800702834b", - "0x34934a00734e00701c00566f02801b00534e00501b00567902801c00534e", - "0x510102802000534e00534900567802802834e00502800702801f00567a", - "0x34e00534700567c02834701b00734e00501b00567b02834800534e00534a", - "0xf02802834e0053460052fc02802834e00502d00532902834602d023031", - "0x34e00502000567b02802000534e0050200056790280c000534e005023005", - "0x2834e0051a00053290283421a034403134e00508600567c028086020007", - "0x320c000708c02803200534e00534400500f02802834e0053420052fc028", - "0x34800534e00534800528a02834100534e00534100501802834100534e005", - "0x1b00567b02802834e00502800702834f00567d02834e00734100531d028", - "0x500c00501c02803603c00c03134e00503300567c02803301b00734e005", - "0x567b02804000534e00503c0052ba02802834e0050360052fc02802834e", - "0x22400501c02822a22622403134e00522200567c02822202000734e005020", - "0x2b702823000534e0052260052ba02802834e00522a0052fc02802834e005", - "0x34e00502000567f02802834e00502800702802867e02834e007230040007", - "0x2834e00502800702802868000502801302802834e00501b00567f028028", - "0x532902802834e00504600501c02804704804603134e00501b00567c028", - "0x23703134e00502000567c02804500534e00504700537702802834e005048", - "0x23d00537702802834e00523a00532902802834e00523700501c02823d23a", - "0x2834e00502800702802868102834e00723e04500729102823e00534e005", - "0xb02802834e00502834c02802834e005028007028028680005028013028", - "0x34e00501800528a02800b00534e00500b00502d02800a00534e00500a005", - "0x3134e00534801800b00a00a28902834800534e00534800528a028018005", - "0x34e00534f00531c02802834e005028007028246243241031005246243241", - "0x34e00502834c02802834e00501b00567f02802834e00502000567f028028", - "0x1803168202824a00534e0052470050a202824700534e005028014028028", - "0x34e00500a00500b02824c00534e00524b00568302824b00534e00524a348", - "0x3100524c00534e00524c00568402800b00534e00500b00502d02800a005", - "0x501f00568502802834e00502834c02802834e00502800702824c00b00a", - "0x502834902802834e00501b00567f02802834e00501800511202802834e", - "0x2002825a00534e00525a00501802825a00534e00502823e02825800534e", - "0x505200900734702800900534e00502834802805200534e00525a258007", - "0x2800a00534e00500a00500b02805a00534e00505d00568602805d00534e", - "0x5a00b00a03100505a00534e00505a00568402800b00534e00500b00502d", - "0x2802834e00534b00504802802834e00502834c02802834e005028007028", - "0x5e03101803168202805e00534e00505b00530202805b00534e005028014", - "0xa00534e00500a00500b0282a900534e00529b00568302829b00534e005", - "0xb00a0310052a900534e0052a900568402800b00534e00500b00502d028", - "0x34e00503100511202802834e00500700511202802834e0050280070282a9", - "0x506000501802806000534e0050282300282e800534e005028349028028", - "0x2806100534e00502834802806200534e0050602e800702002806000534e", - "0x5100500b02831800534e00505f00568602805f00534e005062061007347", - "0x31800534e00531800568402805000534e00505000502d02805100534e005", - "0xa00734e00700502800700502802834e00502834c028318050051031005", - "0x2800f00534e00500700568802802834e00502800702805005100768700b", - "0x734e00700f00568902800a00534e00500a00500b02802834e00502800a", - "0x2801300534e00504f00568b02802834e00502800702804e00568a04f010", - "0x68e00502801302804d00534e00501300568d02801400534e00501000568c", - "0x34e00503000568f02803000534e00502801402802834e005028007028028", - "0x2402804d00534e00501700568d02801400534e00504e00568c028017005", - "0x2800702834b00569134c00534e00704d00569002801800534e005014005", - "0x2801c00534e00501b00569302801b00534e00534c00569202802834e005", - "0x501c00527402803100534e00503100527502800a00534e00500a00500b", - "0x34e00734900526502834934a00734e00501c03100a03169402801c00534e", - "0x517f02802834e00502834c02802834e00502800702802000569501f005", - "0x534e00534a00500b02802834e00534700504802834734800734e00501f", - "0x527502801800534e00501800517902800b00534e00500b00502d02834a", - "0x3100534602d02303134e00534801800b34a00a26b02834800534e005348", - "0x501800526702802834e00502834c02802834e00502800702834602d023", - "0x2d02834a00534e00534a00500b0280c000534e00502000569602802834e", - "0x280c000b34a0310050c000534e0050c000569702800b00534e00500b005", - "0x1402802834e00534b00504802802834e00502834c02802834e005028007", - "0x534400569902834400534e00508603101803169802808600534e005028", - "0x2800b00534e00500b00502d02800a00534e00500a00500b0281a000534e", - "0x26702802834e0050280070281a000b00a0310051a000534e0051a0005697", - "0x2834200534e00502834902802834e00503100518202802834e005007005", - "0x503234200702002803200534e00503200501802803200534e005028230", - "0x2803300534e00534134f00734702834f00534e00502834802834100534e", - "0x505000502d02805100534e00505100500b02800c00534e005033005696", - "0x502834c02800c05005103100500c00534e00500c00569702805000534e", - "0x2805000534e00505100569a02805100b00734e00500700518102802834e", - "0x34e00500f00569c02805000534e00505000534f02800f00534e00502869b", - "0x34e00504f00522a02804e04f01003134e00500f05002803169d02800f005", - "0x1000500b02801300a00734e00500a00503202802834e00502800a028028", - "0x2834e00502800702801400569f02834e00701300569e02801000534e005", - "0x534e0050280ec02802834e00500a00522a02802834e005031005329028", - "0x2801302801700534e00504d00532502803000534e00501000500b02804d", - "0x502855402802834e0050140056a102802834e0050280070280286a0005", - "0x2834e00701834c00713602834c00a00734e00500a00503202801800534e", - "0x500a00503202834b00534e00502835c02802834e0050280070280286a2", - "0x2834e0050280070280286a302834e00734b01b00713602801b00a00734e", - "0x34a00713602834a00a00734e00500a00503202801c00534e005028523028", - "0x2834900534e0050286a502802834e0050280070280286a402834e00701c", - "0x70280286a602834e00734901f00713602801f00a00734e00500a005032", - "0x34800a00734e00500a00503202802000534e0050286a702802834e005028", - "0x50286a902802834e0050280070280286a802834e007020348007136028", - "0x2834e00734702300713602802300a00734e00500a00503202834700534e", - "0x2d00a00713602802d00534e0050286ab02802834e0050280070280286aa", - "0x518202802834e00502834c02802834e0050280070280286ac02834e007", - "0x34902802834e00503100532902802834e00504e00522a02802834e00500b", - "0xc000534e0050c00050180280c000534e0050286ad02834600534e005028", - "0x34400734702834400534e00502834802808600534e0050c0346007020028", - "0x534e00501000500b02834200534e0051a00056ae0281a000534e005086", - "0x1003100534200534e00534200536a02800500534e00500500502d028010", - "0x503200532502803200534e0050286af02802834e005028007028342005", - "0x500a00522a02802834e0050280070280286b000502801302834100534e", - "0x52ba02834100534e00534f00532502834f00534e0050286b102802834e", - "0x522a02802834e0050280070280286b200502801302803300534e005341", - "0x2803300534e00500c00532502800c00534e0050286b302802834e00500a", - "0x2802834e0050280070280286b400502801302803c00534e0050330052ba", - "0x534e00503600532502803600534e0050286b502802834e00500a00522a", - "0x34e0050280070280286b600502801302804000534e00503c0052ba02803c", - "0x522200532502822200534e0050286b702802834e00500a00522a028028", - "0x280070280286b800502801302822400534e0050400052ba02804000534e", - "0x532502822600534e0050286b902802834e00500a00522a02802834e005", - "0x280286ba00502801302822a00534e0052240052ba02822400534e005226", - "0x2823000534e0050286bb02802834e00500a00522a02802834e005028007", - "0x460056bc02804622a00734e00522a0052bb02822a00534e005230005325", - "0x18202802834e00502834c02802834e0050280070280480056bd02834e007", - "0x2802834e00522a00532902802834e00504e00522a02802834e00500b005", - "0x4500534e00502823e02804700534e00502834902802834e005031005329", - "0x2834802823700534e00504504700702002804500534e005045005018028", - "0x534e00523d0056ae02823d00534e00523723a00734702823a00534e005", - "0x536a02800500534e00500500502d02801000534e00501000500b02823e", - "0x100316be02802834e00502800702823e00501003100523e00534e00523e", - "0x22a2410312b602802834e00524300532902824624324103134e005048031", - "0x24700500b02802834e00502800702824c24b0076bf24a24700734e007246", - "0x2825800534e0050286c002801700534e00524a00532502803000534e005", - "0x70280286c102834e00725825a00713602825a04e00734e00504e005032", - "0x2805200534e00501700b00719002802834e00502834c02802834e005028", - "0x34e00505200527502800900534e00500900534f02800900534e0050286c0", - "0x2800702805e05b0076c205a05d00734e00704e009030031524028052005", - "0x2800500534e00500500502d02805d00534e00505d00500b02802834e005", - "0x505d00a6c302805a00534e00505a00534f02805200534e005052005275", - "0x2802834e0050280070282e82a929b0310052e82a929b03134e00505a052", - "0x6000534e00502834902802834e00505200518202802834e00505e00522a", - "0x6206000702002806200534e00506200501802806200534e0050285c0028", - "0x31800534e00506105f00734702805f00534e00502834802806100534e005", - "0x500502d02805b00534e00505b00500b02832600534e0053180056ae028", - "0x2800702832600505b03100532600534e00532600536a02800500534e005", - "0x50286c402802834e00504e00522a02802834e00502834c02802834e005", - "0x734e0070170420300312b602804200534e00504200532502804200534e", - "0x534e00533200b00719002802834e00502800702806a06b0076c5332069", - "0x56c702807300534e0050710060076c602807100534e005028014028006", - "0x534e00500500502d02806900534e00506900500b02833100534e005073", - "0x2834e00502800702833100506903100533100534e00533100536a028005", - "0x534e00502834902802834e00500b00518202802834e00506a005329028", - "0x7600702002807700534e00507700501802807700534e0050282b3028076", - "0x534e00507933000734702833000534e00502834802807900534e005077", - "0x502d02806b00534e00506b00500b02804300534e00532f0056ae02832f", - "0x702804300506b03100504300534e00504300536a02800500534e005005", - "0x518202802834e00524c00532902802834e00502834c02802834e005028", - "0x2b302807c00534e00502834902802834e00504e00522a02802834e00500b", - "0x34e00507b07c00702002807b00534e00507b00501802807b00534e005028", - "0x6ae02808300534e00508132c00734702832c00534e005028348028081005", - "0x34e00500500502d02824b00534e00524b00500b02807f00534e005083005", - "0x500500525202807f00524b03100507f00534e00507f00536a028005005", - "0x3100734e00503100503202805100534e00500b0056c802800b00a00734e", - "0x2800f0056c902834e00705000569e02805100534e00505100534f028050", - "0x2801000534e0050286ca02802834e00500700522a02802834e005028007", - "0x2800500b02804f00534e00501000a00725b02801000534e00501000534f", - "0x70280286cb00502801302801300534e00504f00519b02804e00534e005", - "0x3202801400534e00502855402802834e00500f0056a102802834e005028", - "0x280070280286cc02834e00701404d00713602804d03100734e005031005", - "0x2801703100734e00503100503202803000534e00502835c02802834e005", - "0x34e0050286ce02802834e0050280070280286cd02834e007030017007136", - "0x1800569c02834b00534e0050286d002834c00534e0050286cf028018005", - "0x34a00534e00534b00534f02801c00534e00534c00534f02801b00534e005", - "0x2834900534e0050286d202802834e0050280070280286d1005028013028", - "0x534e00534900569c02802000534e0050286d402801f00534e0050286d3", - "0x56d502834a00534e00502000534f02801c00534e00501f00534f02801b", - "0x534e00534a00514802834700534e00501c00514802834800534e00501b", - "0x2d00534e0050286d702802834e0050280070280286d6005028013028023", - "0x34e00502d00569c0280c000534e0050286d902834600534e0050286d8028", - "0x69d02802300534e0050c000534f02834700534e00534600534f028348005", - "0x76da02802834e00534400522a0281a034408603134e005348007028031", - "0x73420860076db02834200534e00534200532502834200534e0053471a0", - "0x70233410320316dd02802834e00502800702834f0056dc34103200734e", - "0x500c00a00725b02802834e00502800702803603c0076de00c03300734e", - "0x2801300534e00504000519b02804e00534e00503300500b02804000534e", - "0x502855402822600534e0052240056c802822422200734e005013005252", - "0x2822a00534e00522a00534f02822600534e00522600534f02822a00534e", - "0x2834e0050280070280470480076df04623000734e00722a22604e0316dd", - "0x4623003169d02804500534e00504500569c02804500534e0050286e0028", - "0x34e00523d00507102802834e00523a00522a02823d23a23703134e005045", - "0x708c02824100534e00524100501802824100534e0050286e102823e005", - "0x34e00524300501802822200534e00522200519b02824300534e00523e241", - "0x6da02824700534e0050286e302824600534e0052432220076e2028243005", - "0x24a2370076db02824a00534e00524a00532502824a00534e005247051007", - "0x534e0050286e502802834e0050280070282580056e424c24b00734e007", - "0x6db02805200534e00505200532502805200534e00525a0310076da02825a", - "0x316dd02802834e00502800702805a0056e605d00900734e00705224b007", - "0x25b02802834e0050280070282a929b0076e705e05b00734e00705d24c009", - "0x50602e80076e802806000534e0050280140282e800534e00505e246007", - "0x2805b00534e00505b00500b02806100534e0050620056e902806200534e", - "0x522a02802834e00502800702806105b00700506100534e0050610056ea", - "0x6eb02805f00534e00502834902802834e00524600524902802834e0052a9", - "0x34e00531805f00702002831800534e00531800501802831800534e005028", - "0x6ec02806900534e00532604200734702804200534e005028348028326005", - "0x34e0053320056ea02829b00534e00529b00500b02833200534e005069005", - "0x2802834e00524600524902802834e00502800702833229b007005332005", - "0x6a00534e0050286ed02806b00534e00502834902802834e00524c00522a", - "0x2834802800600534e00506a06b00702002806a00534e00506a005018028", - "0x534e0050730056ec02807300534e00500607100734702807100534e005", - "0x5a00700533100534e0053310056ea02805a00534e00505a00500b028331", - "0x34e00503100522a02802834e00524600524902802834e005028007028331", - "0x507700501802807700534e0050286ed02807600534e005028349028028", - "0x2833000534e00502834802807900534e00507707600702002807700534e", - "0x25800500b02804300534e00532f0056ec02832f00534e005079330007347", - "0x502800702804325800700504300534e0050430056ea02825800534e005", - "0x3100522a02802834e00505100522a02802834e00504700522a02802834e", - "0x286eb02807c00534e00502834902802834e00522200524902802834e005", - "0x534e00507b07c00702002807b00534e00507b00501802807b00534e005", - "0x56ec02808300534e00508132c00734702832c00534e005028348028081", - "0x534e00507f0056ea02804800534e00504800500b02807f00534e005083", - "0x22a02802834e00503600522a02802834e00502800702807f04800700507f", - "0x2802834e00500a00524902802834e00503100522a02802834e005051005", - "0x534e00532900501802832900534e0050286eb02832a00534e005028349", - "0x734702832700534e00502834802832800534e00532932a007020028329", - "0x34e00503c00500b02832400534e0053250056ec02832500534e005328327", - "0x2834e00502800702832403c00700532400534e0053240056ea02803c005", - "0x34e00500a00524902802834e00503100522a02802834e00505100522a028", - "0x34e0050286ed02832000534e00502834902802834e00502300522a028028", - "0x2831f00534e00508e32000702002808e00534e00508e00501802808e005", - "0x508c0056ec02808c00534e00531f31e00734702831e00534e005028348", - "0x531d00534e00531d0056ea02834f00534e00534f00500b02831d00534e", - "0x6ee05100b00734e00700502800700502802834e00502834c02831d34f007", - "0x2800a02801000534e0050310056ef02802834e00502800702800f050007", - "0x702804d0140076f101304e04f03134e00701000b0076f002802834e005", - "0x1700534e00504f00500b02803000534e0050130056f202802834e005028", - "0x502801302834c00534e0050300056f402801800534e00504e0056f3028", - "0x534b0056f602834b00534e00502801402802834e0050280070280286f5", - "0x2801800534e00504d0056f302801700534e00501400500b02801b00534e", - "0x734c0056f702801c00534e00501800524802834c00534e00501b0056f4", - "0x6f902802834e00502834c02802834e0050280070283490056f834a00534e", - "0x6fb34734802003134e00701f00a00705100a6fa02801f00534e00534a005", - "0x2d02801700534e00501700500b02802834e00502800702834602d023031", - "0x34e00501c00524502834800534e00534800534602802000534e005020005", - "0x34e00534701c34802001700b1a402834700534e00534700524402801c005", - "0x523c02802834e0050280070281a03440860c000a0051a03440860c000a", - "0x3200534e00534634200734702834200534e00502834802802834e00501c", - "0x2300502d02801700534e00501700500b02834100534e0050320056fc028", - "0x34100534e0053410056fd02802d00534e00502d00534602802300534e005", - "0x4802802834e00502834c02802834e00502800702834102d02301700a005", - "0x34e00534f00a01c0316fe02834f00534e00502801402802834e005349005", - "0x2d02801700534e00501700500b02800c00534e0050330056ff028033005", - "0x34e00500c0056fd02800700534e00500700534602805100534e005051005", - "0x34e00500a00570002802834e00502800702800c00705101700a00500c005", - "0x34e00502823002803c00534e00502834902802834e00503100523c028028", - "0x2804000534e00503603c00702002803600534e005036005018028036005", - "0x52240056fc02822400534e00504022200734702822200534e005028348", - "0x2800f00534e00500f00502d02805000534e00505000500b02822600534e", - "0x700f05000a00522600534e0052260056fd02800700534e005007005346", - "0x5000570202805000b00734e00500b00570102802834e00502834c028226", - "0x734e00500f00521a02802834e00504f00530002804f01000f03134e005", - "0x3004d00734e00501400518602801401300734e00501300521f02801304e", - "0x701700570302801700534e00504d00537702802834e0050300052fc028", - "0x34b34c00734e00501300518602802834e00502800702801800570402834e", - "0x701b00570302801b00534e00534b00537702802834e00534c0052fc028", - "0x70602802834e00501000519102802834e00502800702801c00570502834e", - "0x2802834e00500a00519102802834e00500b00570702802834e005051005", - "0x2870800502801302834a00534e00502800500b02802834e00504e005191", - "0x2802870a00502801302802834e00501c00570902802834e005028007028", - "0x2802834e00501300519102802834e00501800570902802834e005028007", - "0x502000518602802000534e00502870b02801f34900734e00504e005186", - "0x734e00534700528102802301f00734e00501f00528102834734800734e", - "0x34600734e00702d02302803128002802d00534e00502d0052fa02802d347", - "0xb02802834e0050c00052fc02802834e00502800702834408600770c0c0", - "0x502800702802870d02834e00734701f00729102834600534e005346005", - "0xb00570702802834e00505100570602802834e00501000519102802834e", - "0x52fc02802834e0053480052fc02802834e00500a00519102802834e005", - "0x702802870800502801302834a00534e00534600500b02802834e005349", - "0x34e00734834934603128002834800534e0053480052fa02802834e005028", - "0x2834e0053420052fc02802834e00502800702834103200770e3421a0007", - "0x34e00500b00570702802834e00505100570602802834e005010005191028", - "0x502870f02834a00534e0051a000500b02802834e00500a005191028028", - "0x2800c00534e00503300571102803300534e00534f00571002834f00534e", - "0x50070052f502800500534e00500500502d02803c00534e00500c005712", - "0x503c00534e00503c00571302803100534e00503100534602800700534e", - "0x2802834e0053410052fc02802834e00502800702803c03100700534a00b", - "0x2802834e00502800702802871400502801302803600534e00503200500b", - "0x2834e0053480052fc02802834e00501f0052fc02802834e0053440052fc", - "0x34e00508600500b02802834e0053470052fc02802834e0053490052fc028", - "0x22422200734e00522200521f02822204000734e00501000521a028036005", - "0x22600537702802834e00522a0052fc02822a22600734e005224005186028", - "0x4600571502834e00723000570302802834e00502800a02823000534e005", - "0x50480052fc02804704800734e00522200518602802834e005028007028", - "0x23700571602834e00704500570302804500534e00504700537702802834e", - "0x2802834e00505100570602802834e00502834c02802834e005028007028", - "0x2834e00504000519102802834e00500a00519102802834e00500b005707", - "0x2834e00502800702802871700502801302823a00534e00503600500b028", - "0x2802834e00502800702802871800502801302802834e005237005709028", - "0x2802834e00502834c02802834e00522200519102802834e005046005709", - "0x524100518602824100534e00502870b02823e23d00734e005040005186", - "0x734e00524600528102824723e00734e00523e00528102824624300734e", - "0x24b00734e00724a24703603128002824a00534e00524a0052fa02824a246", - "0xb02802834e00524c0052fc02802834e00502800702825a25800771924c", - "0x502800702802871a02834e00724623e00729102824b00534e00524b005", - "0xa00519102802834e00500b00570702802834e00505100570602802834e", - "0x500b02802834e00523d0052fc02802834e0052430052fc02802834e005", - "0x52fa02802834e00502800702802871700502801302823a00534e00524b", - "0x5a05d00771b00905200734e00724323d24b03128002824300534e005243", - "0x2834e00505100570602802834e0050090052fc02802834e005028007028", - "0x34e00505200500b02802834e00500a00519102802834e00500b005707028", - "0x571102805e00534e00505b00571002805b00534e00502870f02823a005", - "0x534e00500500502d0282a900534e00529b00571202829b00534e00505e", - "0x571302803100534e00503100534602800700534e0050070052f5028005", - "0x2fc02802834e0050280070282a903100700523a00b0052a900534e0052a9", - "0x2802871c0050280130282e800534e00505d00500b02802834e00505a005", - "0x2802834e00523e0052fc02802834e00525a0052fc02802834e005028007", - "0x2834e0052460052fc02802834e00523d0052fc02802834e0052430052fc", - "0x3100534602800500534e00500500502d0282e800534e00525800500b028", - "0xb00534e00500b00520d02800a00534e00500a00527402803100534e005", - "0x705f00537102805f06106206000a34e00500b00a0310052e800b71d028", - "0x4200534e00531800571f02802834e00502800702832600571e31800534e", - "0x500b02802834e00502800702833200572006900534e0070420051b5028", - "0x534e0050070052f502806200534e00506200502d02806000534e005060", - "0xb72202806900534e00506900572102806100534e005061005346028007", - "0x534e00707300572302807307100606a06b00b34e005069061007062060", - "0x72602807700534e00533100572502802834e005028007028076005724331", - "0x34e00507700572602802834e00507900570602833007900734e005051005", - "0x37002807c00534e00533000537002802834e00532f00570602804332f007", - "0x34e00507b00500f02808100534e00507c00500f02807b00534e005043005", - "0x2808300534e00508300501802808300534e00532c08100708c02832c005", - "0x34e00502801402802834e00502800702807f00572702834e00708300531d", - "0x71202832800534e00532900571102832900534e00532a00572802832a005", - "0x34e00506a00502d02806b00534e00506b00500b02832700534e005328005", - "0x71302807100534e00507100534602800600534e0050060052f502806a005", - "0x2802834e00502800702832707100606a06b00b00532700534e005327005", - "0x534e00532500571002832500534e00502872902802834e00507f00531c", - "0x500b02808e00534e00532000571202832000534e005324005711028324", - "0x534e0050060052f502806a00534e00506a00502d02806b00534e00506b", - "0x6b00b00508e00534e00508e00571302807100534e005071005346028006", - "0x572a02802834e00505100570602802834e00502800702808e07100606a", - "0x534e00506a00502d02806b00534e00506b00500b02831f00534e005076", - "0x571302807100534e00507100534602800600534e0050060052f502806a", - "0x4802802834e00502800702831f07100606a06b00b00531f00534e00531f", - "0x2831e00534e00502834902802834e00505100570602802834e005332005", - "0x508c31e00702002808c00534e00508c00501802808c00534e00502823e", - "0x2808a00534e00531d31c00734702831c00534e00502834802831d00534e", - "0x506200502d02806000534e00506000500b02831b00534e00508a00572a", - "0x2806100534e00506100534602800700534e0050070052f502806200534e", - "0x2834e00502800702831b06100706206000b00531b00534e00531b005713", - "0x506000500b02831a00534e00532600572a02802834e005051005706028", - "0x2800700534e0050070052f502806200534e00506200502d02806000534e", - "0x706206000b00531a00534e00531a00571302806100534e005061005346", - "0x1000f00734e00505000521a02805000a00734e00500a00521f02831a061", - "0x2fc02801304e00734e00504f00518602804f01000734e00501000521f028", - "0x2834e00701400570302801400534e00504e00537702802834e005013005", - "0x2fc02801703000734e00501000518602802834e00502800702804d00572b", - "0x2834e00701800570302801800534e00501700537702802834e005030005", - "0x5100520002802834e00500a00519102802834e00502800702834c00572c", - "0x519102802834e00500b00519102802834e00503100519102802834e005", - "0x702802872d00502801302834b00534e00502800500b02802834e00500f", - "0x2800702802872e00502801302802834e00534c00570902802834e005028", - "0x518602802834e00501000519102802834e00504d00570902802834e005", - "0x734e00534a00518602834a00534e00502872f02801c01b00734e00500f", - "0x34801f00734e00501f00528102802001c00734e00501c00528102801f349", - "0x73002334700734e00734802002803128002834800534e0053480052fa028", - "0x34700500b02802834e0050230052fc02802834e00502800702834602d007", - "0x2834e00502800702802873102834e00701f01c00729102834700534e005", - "0x34e00503100519102802834e00505100520002802834e00500a005191028", - "0x501b0052fc02802834e0053490052fc02802834e00500b005191028028", - "0x502800702802872d00502801302834b00534e00534700500b02802834e", - "0xc000734e00734901b34703128002834900534e0053490052fa02802834e", - "0x19102802834e0050860052fc02802834e0050280070281a0344007732086", - "0x2802834e00503100519102802834e00505100520002802834e00500a005", - "0x34e00534b00537602834b00534e0050c000500b02802834e00500b005191", - "0x34e0051a00052fc02802834e005028007028028733005028013028342005", - "0x34e00502800702802873400502801302803200534e00534400500b028028", - "0x53490052fc02802834e00501c0052fc02802834e0053460052fc028028", - "0x2d00500b02802834e00501f0052fc02802834e00501b0052fc02802834e", - "0x734e00534100521a02834100b00734e00500b00521f02803200534e005", - "0x3603c00734e00500c00518602800c03300734e00503300521f02803334f", - "0x704000570302804000534e00503c00537702802834e0050360052fc028", - "0x22622400734e00503300518602802834e00502800702822200573502834e", - "0x722a00570302822a00534e00522600537702802834e0052240052fc028", - "0x1402802834e00534f00519102802834e00502800702823000573602834e", - "0x534e00503200500b02804800534e0050460050a202804600534e005028", - "0x34e00502800702802873700502801302804500534e005048005301028047", - "0x2834e00502800702802873800502801302802834e005230005709028028", - "0x34e00534f00518602802834e00503300519102802834e005222005709028", - "0x2824123e00734e00523d00518602823d00534e00502872f02823a237007", - "0x52fa02824624100734e00524100528102824323a00734e00523a005281", - "0x24c24b00773924a24700734e00724624303203128002824600534e005246", - "0x534e00524700500b02802834e00524a0052fc02802834e005028007028", - "0x52fc02802834e00502800702802873a02834e00724123a007291028247", - "0xa202825800534e00502801402802834e0052370052fc02802834e00523e", - "0x34e00525a00530102804700534e00524700500b02825a00534e005258005", - "0x34e00523e0052fa02802834e005028007028028737005028013028045005", - "0x2800702805a05d00773b00905200734e00723e23724703128002823e005", - "0x50a202805b00534e00502801402802834e0050090052fc02802834e005", - "0x534e00505e00530102804700534e00505200500b02805e00534e00505b", - "0x2834e00505a0052fc02802834e005028007028028737005028013028045", - "0x505d00500b0282a900534e00529b00530202829b00534e005028014028", - "0x2800702802873700502801302804500534e0052a900530102804700534e", - "0x52fc02802834e00523a0052fc02802834e00524c0052fc02802834e005", - "0x1402802834e0052410052fc02802834e0052370052fc02802834e00523e", - "0x534e00524b00500b02806000534e0052e80053020282e800534e005028", - "0x530102806200534e0050450052ff02804500534e005060005301028047", - "0x502800702805f00573c06100534e00706200528f02806200534e005062", - "0x31800573e02831800534e00502873d02802834e00506100504802802834e", - "0x732600b04703136f02832600534e00532600573f02832631800734e005", - "0x2800702833007907703174007633107307100606a06b33206904204f34e", - "0x534e00533132f00727c02832f00534e00507604200727c02802834e005", - "0x2807b00534e00507107c00727c02807c00534e00507304300727c028043", - "0x727c02832c00534e00506a08100727c02808100534e00500607b00727c", - "0x506900574102807f00534e00533208300727c02808300534e00506b32c", - "0x2803100534e00503100527402807f00534e00507f00500b02832a00534e", - "0x7f03174202832900534e00532900527402832932a00734e00532a00521f", - "0x32500573f02832531800734e00531800573e02832732800734e005329031", - "0x31d08c31e31f08e32032400f34e00532532732803174302832500534e005", - "0x727c02808a00534e00531c32400727c02802834e00532000574402831c", - "0x31e31a00727c02831a00534e00508c31b00727c02831b00534e00531d08a", - "0x534e00508800500b02808800534e00531f31900727c02831900534e005", - "0x27402809000534e00509000527402809000a00734e00500a00521f028088", - "0x573f02831536c00734e00532a09008803174202832a00534e00532a005", - "0x8d31031131231331400f34e00531831536c03174302831800534e005318", - "0x27c02830d00534e00530e31400727c02802834e00531300574402830e30f", - "0x30b00727c02830b00534e00508d30c00727c02830c00534e00530f30d007", - "0x534e00502874502808700534e00531130800727c02830800534e005310", - "0x9600527402809400534e00509400527402809600534e005028746028094", - "0x709609400700500a20802808700534e00508700500b02809600534e005", - "0x30600520b02802834e00502800702830430509703174730609930703134e", - "0x9900534e00509900534602830700534e00530700502d02830600534e005", - "0xa74902802834e00502800702830100574830200534e007306005201028", - "0x34e0050280070282fc2fd2fe03174a2ff3000a203134e00708e302099307", - "0xa7490282ff00534e0052ff0051e50280a200534e0050a200502d028028", - "0x34e0050280070280ac0b02f803174b0a92f92fa03134e0073120513000a2", - "0xa74c0280a900534e0050a90051e50282fa00534e0052fa00502d028028", - "0x34e0050280070280b92f30b603174d0b42f52f703134e0070a92ff2f92fa", - "0x311fc0280b400534e0050b40051e50282f700534e0052f700502d028028", - "0x34e0050280070280bf2ec2ed03174e2ee2ef2f02f100a34e0070b42f52f7", - "0x51910282ea2eb00734e0052ef00521a02802834e0052ee005191028028", - "0x2834e0052e90051910280532e900734e00500a00521a02802834e0052eb", - "0x51860283722ea00734e0052ea00521f0282ea00534e0052ea005274028", - "0x734e00505300521f02802834e0053740052fc02837437300734e005372", - "0x37702802834e0050c70052fc0280c737600734e0050dc0051860280dc053", - "0x34e0052f100502d0280c900534e0053760053770280c600534e005373005", - "0x2874f02834e0070c90c60072910282f000534e0052f00053460282f1005", - "0x2834e0052ea00519102802834e00505300519102802834e005028007028", - "0x50cf0053010280cf00534e0050cb0050a20280cb00534e005028014028", - "0x52ea00518602802834e0050280070280287500050280130282e700534e", - "0x2e137800734e00505300518602802834e0053770052fc0282f437700734e", - "0x52e10053770280d400534e0052f400537702802834e0053780052fc028", - "0x2802834e00502800702802875102834e0072e00d40072910282e000534e", - "0x34e00537a00530102837a00534e0050d50050a20280d500534e005028014", - "0x534e00502801402802834e0050280070280287500050280130282e7005", - "0x536e0282e700534e0052dd0053010282dd00534e0052de0053020282de", - "0x534e00508700500b0280da00534e0052d70057520282d700534e0052e7", - "0x57530282f000534e0052f00053460282f100534e0052f100502d028087", - "0x519102802834e0050280070280da2f02f108700a0050da00534e0050da", - "0x2d200534e0050bf2d40073470282d400534e00502834802802834e00500a", - "0x2ed00502d02808700534e00508700500b0280d200534e0052d2005754028", - "0xd200534e0050d20057530282ec00534e0052ec0053460282ed00534e005", - "0x2802834e00500a00519102802834e0050280070280d22ec2ed08700a005", - "0x50db0057540280db00534e0050b92d50073470282d500534e005028348", - "0x280b600534e0050b600502d02808700534e00508700500b0282dc00534e", - "0x2f30b608700a0052dc00534e0052dc0057530282f300534e0052f3005346", - "0x34e0052ff00520002802834e00500a00519102802834e0050280070282dc", - "0x57540282ce00534e0050ac2cf0073470282cf00534e005028348028028", - "0x534e0052f800502d02808700534e00508700500b0282cd00534e0052ce", - "0x8700a0052cd00534e0052cd0057530280b000534e0050b00053460282f8", - "0x5100520002802834e00500a00519102802834e0050280070282cd0b02f8", - "0x73470280df00534e00502834802802834e00531200519102802834e005", - "0x34e00508700500b0280e100534e0052db0057540282db00534e0052fc0df", - "0x7530282fd00534e0052fd0053460282fe00534e0052fe00502d028087005", - "0x4802802834e0050280070280e12fd2fe08700a0050e100534e0050e1005", - "0x2802834e00505100520002802834e00500a00519102802834e005301005", - "0x2d800534e00502834902802834e00508e00519102802834e005312005191", - "0x2d92d80070200282d900534e0052d90050180282d900534e00502823e028", - "0x2cb00534e0050990053460282da00534e00530700502d0280e300534e005", - "0x2834e0050280070280287550050280130282c300534e0050e3005226028", - "0x34e00531200519102802834e00505100520002802834e00500a005191028", - "0x3050053460282da00534e00509700502d02802834e00508e005191028028", - "0x282c500534e0050283480282c300534e0053040052260282cb00534e005", - "0x8700500b0282bf00534e0052c00057540282c000534e0052c32c5007347", - "0x2cb00534e0052cb0053460282da00534e0052da00502d02808700534e005", - "0x2834e0050280070282bf2cb2da08700a0052bf00534e0052bf005753028", - "0x34e00503100519102802834e00505100520002802834e00500a005191028", - "0x727c0280e900534e00533007700727c02802834e005318005756028028", - "0x2ba00534e00502823e0282bb00534e0050283490282bd00534e0050790e9", - "0x283480282b700534e0052ba2bb0070200282ba00534e0052ba005018028", - "0x534e0052b60057540282b600534e0052b70ec0073470280ec00534e005", - "0x534602800500534e00500500502d0282bd00534e0052bd00500b0282b3", - "0x282b30070052bd00a0052b300534e0052b300575302800700534e005007", - "0x2802834e00500a00519102802834e00505f00504802802834e005028007", - "0x2834e00500b00519102802834e00503100519102802834e005051005200", - "0x52b20050a20282b200534e00502801402834200534e00504700500b028", - "0x282af00534e0052b00057520282b000534e0052b100536e0282b100534e", - "0x52af00575302800700534e00500700534602800500534e00500500502d", - "0x75802800702800734e0050280057570282af00700534200a0052af00534e", - "0xb00575902802834e00500a00575902805100b00a03100a34e005007005", - "0x36d02805000534e00503100575a02802834e00505100575902802834e005", - "0x501000575802801000500734e00500500575702800f00534e005050005", - "0x2834e00501300575902802834e00504e00575902801401304e04f00a34e", - "0x504d00536d02804d00534e00504f00575a02802834e005014005759028", - "0x1700534e00501700501802801700534e00503000f00708c02803000534e", - "0x2800575702802834e00502800702801800575b02834e00701700531d028", - "0x34b00575902834a01c01b34b00a34e00534c00575802834c02800734e005", - "0x575a02802834e00534a00575902802834e00501c00575902802834e005", - "0x734e00500500575702801f00534e00534900536d02834900534e00501b", - "0x2834e00534800575902802d02334734800a34e005020005758028020005", - "0x34e00534700575a02802834e00502d00575902802834e005023005759028", - "0x2808600534e0050c001f00708c0280c000534e00534600536d028346005", - "0x2800702834400575c02834e00708600531d02808600534e005086005018", - "0x34200a34e0051a00057580281a002800734e00502800575702802834e005", - "0x575902802834e00503200575902802834e00534200575902834f341032", - "0xc00534e00503300536d02803300534e00534100575a02802834e00534f", - "0x22422204003600a34e00503c00575802803c00500734e005005005757028", - "0x34e00522400575902802834e00504000575902802834e005036005759028", - "0x708c02822a00534e00522600536d02822600534e00522200575a028028", - "0x34e00723000531d02823000534e00523000501802823000534e00522a00c", - "0x4504704800a34e00502800575802802834e00502800702804600575d028", - "0x504500575902802834e00504700575902802834e005048005759028237", - "0x75802823d00534e00523a00536d02823a00534e00523700575a02802834e", - "0x24100575902802834e00523e00575902824624324123e00a34e005005005", - "0x36d02824700534e00524600575a02802834e00524300575902802834e005", - "0x524b00501802824b00534e00524a23d00708c02824a00534e005247005", - "0x2802834e00502800702824c00575e02834e00724b00531d02824b00534e", - "0x34e00525a00530102825a00534e00525800530202825800534e005028014", - "0x1402802834e00524c00531c02802834e00502800702825a00500525a005", - "0x534e00500900530102800900534e0050520050a202805200534e005028", - "0x557f02802834e00504600531c02802834e005028007028009005005009", - "0x2800702802875f00502801302802834e00502800557f02802834e005005", - "0x557f02802834e00500500557f02802834e00534400531c02802834e005", - "0x1800531c02802834e00502800702802875f00502801302802834e005028", - "0x2801402802834e00502800557f02802834e00500500557f02802834e005", - "0x5a00534e00505a00530102805a00534e00505d0050a202805d00534e005", - "0x76002834e00700a00569e02800a03100734e00503100503202805a005005", - "0x503100522a02802834e00500700501c02802834e00502800702800b005", - "0x76202805000534e00505100500776102805100534e00502801402802834e", - "0x34e00500f00576302802800534e00502800500b02800f00534e005050005", - "0x2802834e00500b0056a102802834e00502800702800f02800700500f005", - "0x3202801304e00734e00504e00503202804e04f01003134e005005005764", - "0x776503004d00734e0070140130280316dd02801403100734e005031005", - "0x503000503202834c00534e00502858802802834e005028007028018017", - "0x34e00734c34b04d03152402834c00534e00534c00534f02834b03000734e", - "0x2834e00501c00522a02802834e00502800702834934a00776601c01b007", - "0x1b00500b02802003000734e00503000503202801f00534e005028588028", - "0x2834e00502800702802876702834e00701f02000713602801b00534e005", - "0x34e00534800534f02834800534e00502858802802834e00503100522a028", - "0x2800702834602d00776802334700734e00734803001b031524028348005", - "0x2808602300734e0050230050320280c000534e0050286c002802834e005", - "0x2800702802876902834e0070c008600713602834700534e00534700500b", - "0x281a002300734e00502300503202834400534e0050286c002802834e005", - "0x776a03234200734e0073441a034703152402834400534e00534400534f", - "0x73420072fd02802834e00503200522a02802834e00502800702834f341", - "0x502827602802834e00502800702804003603c03176b00c03300734e007", - "0x2822600534e00500c0052fa02822400534e00503300500b02822200534e", - "0x2802834e00502800702802876c00502801302822a00534e0052220052fa", - "0x50360052fa02822600534e0050400052fa02822400534e00503c00500b", - "0x2804602300734e00502300503202823000534e0050286c002822a00534e", - "0x776d04704800734e00723004622403152402823000534e00523000534f", - "0x4700534f02804800534e00504800500b02802834e005028007028237045", - "0x34e00723d00576f02823d23a00734e00504704800776e02804700534e005", - "0x2824300534e00523e00577102802834e00502800702824100577023e005", - "0x2824b00534e00524a0050b002824a24724603134e00524322a23a031772", - "0x34e00502858802825800534e0052470050b002824c00534e0052260050b0", - "0x2825a00534e00525a00534f02805204e00734e00504e00503202825a005", - "0x2834e00502800702805b05a00777305d00900734e00705225a246031524", - "0x29b00501802829b00534e00505e24b00721302805e00534e005028216028", - "0x2e800534e0050286c00282a900534e00524c29b0072dc02829b00534e005", - "0x50180282e800534e0052e800534f02806005d00734e00505d005032028", - "0x31805f00777406106200734e0072e80600090315240282a900534e0052a9", - "0x32600534e0050286c002802834e00506100522a02802834e005028007028", - "0x77506904200734e00732605d06203152402832600534e00532600534f028", - "0x534f02804200534e00504200500b02802834e00502800702806b332007", - "0x700600576f02800606a00734e00506904200776e02806900534e005069", - "0x33100534e00507100577102802834e00502800702807300577607100534e", - "0x502821602807700534e0050760050b002807600534e005331005777028", - "0x32f00534e00506a00500b02833000534e00507907700721302807900534e", - "0x2834e00502800702802877800502801302804300534e005330005018028", - "0x34e00504e00522a02802834e00502300522a02802834e005010005375028", - "0x504f00501c02802834e00525800501c02802834e0052a900501c028028", - "0xb02802834e00507c00507602807b07c00734e00507300533102802834e", - "0x2877900502801302832c00534e00507b00522602808100534e00506a005", - "0x2834e00501000537502802834e00506b00522a02802834e005028007028", - "0x34e0052a900501c02802834e00504e00522a02802834e00502300522a028", - "0x34e00502834902802834e00525800501c02802834e00504f00501c028028", - "0x702002807f00534e00507f00501802807f00534e0050285c0028083005", - "0x34e00532a00522602808100534e00533200500b02832a00534e00507f083", - "0x34e00531800522a02802834e00502800702802877900502801302832c005", - "0x776e02805d00534e00505d00534f02805f00534e00505f00500b028028", - "0x702832500577a32700534e00732800576f02832832900734e00505d05f", - "0x32000534e00532400577702832400534e00532700577102802834e005028", - "0x8e00501802832f00534e00532900500b02808e00534e0053200050b0028", - "0x534e00531f00501802831f00534e00504304f00721302804300534e005", - "0x77b02831e00534e00531e00501802831e00534e00531f2580072dc02831f", - "0x777d02802834e00502800702831c00577c31d08c00734e00731e32f007", - "0x8c00500b02831b00534e00504e2a908a03158a02808a00534e00531d010", - "0x702802877e00502801302831900534e00531b00558b02831a00534e005", - "0x22a02802834e00502300522a02802834e00501000537502802834e005028", - "0x2808800534e00502834902802834e0052a900501c02802834e00504e005", - "0x509008800702002809000534e00509000501802809000534e00502823e", - "0x2831400534e00536c00522602831500534e00531c00500b02836c00534e", - "0x22a02802834e00501000537502802834e00502800702802877f005028013", - "0x2802834e0052a900501c02802834e00504e00522a02802834e005023005", - "0x734e00532500533102802834e00504f00501c02802834e00525800501c", - "0x522602808100534e00532900500b02802834e005313005076028312313", - "0x534e00532c00578002831500534e00508100537602832c00534e005312", - "0x2834e00505b00522a02802834e00502800702802877f005028013028314", - "0x34e00504e00522a02802834e00502300522a02802834e005010005375028", - "0x525800501c02802834e00504f00501c02802834e00524b00501c028028", - "0x50285c002831100534e00502834902802834e00524c00501c02802834e", - "0x8d00534e00531031100702002831000534e00531000501802831000534e", - "0x502801302831400534e00508d00522602831500534e00505a00500b028", - "0x502300522a02802834e00501000537502802834e00502800702802877f", - "0x4f00501c02802834e0052260052fc02802834e00504e00522a02802834e", - "0x2830e30f00734e00524100533102802834e00522a0052fc02802834e005", - "0x34e00530e00522602831500534e00523a00500b02802834e00530f005076", - "0x34e00523700522a02802834e00502800702802877f005028013028314005", - "0x504e00522a02802834e00502300522a02802834e005010005375028028", - "0x22a0052fc02802834e00504f00501c02802834e0052260052fc02802834e", - "0x501802830c00534e0050285c002830d00534e00502834902802834e005", - "0x34e00504500500b02830b00534e00530c30d00702002830c00534e00530c", - "0x734702830800534e00502834802831400534e00530b005226028315005", - "0x34e00531500500b02809400534e00508700578102808700534e005314308", - "0x2834e00502800702809431500700509400534e005094005763028315005", - "0x9903178230709600734e0070073410072fd02802834e00534f00522a028", - "0x509600500b02830500534e00502827602802834e005028007028097306", - "0x2830100534e0053050052fa02830200534e0053070052fa02830400534e", - "0x2830400534e00509900500b02802834e005028007028028783005028013", - "0x530400500b02830100534e0053060052fa02830200534e0050970052fa", - "0xa200534e0050a200534f0280a202300734e00502300503202830400534e", - "0x57842fe00534e0072ff00576f0282ff30000734e0050a230400776e028", - "0x3023000317720282fc00534e0052fe00577102802834e0050280070282fd", - "0x34e0050286c00282f800534e0053010050b00280a92f92fa03134e0052fc", - "0x280b000534e0050b000534f0280ac02300734e0050230050320280b0005", - "0x2834e0050280070280b60b40077852f52f700734e0070ac0b02fa031524", - "0x2f700776e0282f500534e0052f500534f0282f700534e0052f700500b028", - "0x280070282f00057862f100534e0070b900576f0280b92f300734e0052f5", - "0x282ee00534e0052ef0057770282ef00534e0052f100577102802834e005", - "0x50a90050b00282ec00534e0052f90050b00282ed00534e0052ee0050b0", - "0x282ea04e00734e00504e0050320282eb00534e0050285880280bf00534e", - "0x77870532e900734e0072ea2eb2f30315240282eb00534e0052eb00534f", - "0x501802837400534e0052ed2f800721302802834e005028007028373372", - "0x534e0050286c00280dc00534e0052ec3740072dc02837400534e005374", - "0x1802837600534e00537600534f0280c705300734e005053005032028376", - "0xcb0077880c90c600734e0073760c72e90315240280dc00534e0050dc005", - "0x534e0050286c002802834e0050c900522a02802834e0050280070280cf", - "0x2f437700734e0072e70530c60315240282e700534e0052e700534f0282e7", - "0x34f02837700534e00537700500b02802834e0050280070282e1378007789", - "0x2e000576f0282e00d400734e0052f437700776e0282f400534e0052f4005", - "0x534e0050d500577102802834e00502800702837a00578a0d500534e007", - "0x282160282d700534e0052dd0050b00282dd00534e0052de0057770282de", - "0x534e0050d400500b0282d400534e0050da2d70072130280da00534e005", - "0x34e00502800702802878b0050280130280d200534e0052d40050180282d2", - "0x504e00522a02802834e00502300522a02802834e005010005375028028", - "0x4f00501c02802834e0050dc00501c02802834e0050bf00501c02802834e", - "0x2802834e0052d50050760280db2d500734e00537a00533102802834e005", - "0x78c0050280130282cf00534e0050db0052260282dc00534e0050d400500b", - "0x34e00501000537502802834e0052e100522a02802834e005028007028028", - "0x50bf00501c02802834e00504e00522a02802834e00502300522a028028", - "0x502834902802834e0050dc00501c02802834e00504f00501c02802834e", - "0x200282cd00534e0052cd0050180282cd00534e0050285c00282ce00534e", - "0x50df0052260282dc00534e00537800500b0280df00534e0052cd2ce007", - "0x50cf00522a02802834e00502800702802878c0050280130282cf00534e", - "0x76e02805300534e00505300534f0280cb00534e0050cb00500b02802834e", - "0x282d900578d2d800534e0070e100576f0280e12db00734e0050530cb007", - "0x534e0050e30057770280e300534e0052d800577102802834e005028007", - "0x50180282d200534e0052db00500b0282cb00534e0052da0050b00282da", - "0x34e0052c30050180282c300534e0050d204f0072130280d200534e0052cb", - "0x282c500534e0052c50050180282c500534e0052c30dc0072dc0282c3005", - "0x77d02802834e0050280070280e900578e2bf2c000734e0072c52d200777b", - "0x500b0282bb00534e00504e0bf2bd03158a0282bd00534e0052bf010007", - "0x534e00531a00537602831900534e0052bb00558b02831a00534e0052c0", - "0x34e0050280070280287900050280130282b700534e00531900578f0282ba", - "0x504e00522a02802834e00502300522a02802834e005010005375028028", - "0x502823e0280ec00534e00502834902802834e0050bf00501c02802834e", - "0x2b300534e0052b60ec0070200282b600534e0052b60050180282b600534e", - "0x50280130282b100534e0052b30052260282b200534e0050e900500b028", - "0x502300522a02802834e00501000537502802834e005028007028028791", - "0xdc00501c02802834e0050bf00501c02802834e00504e00522a02802834e", - "0x282af2b000734e0052d900533102802834e00504f00501c02802834e005", - "0x34e0052af0052260282dc00534e0052db00500b02802834e0052b0005076", - "0x130282b100534e0052cf0057800282b200534e0052dc0053760282cf005", - "0x537502802834e00537300522a02802834e005028007028028791005028", - "0x1c02802834e00504e00522a02802834e00502300522a02802834e005010", - "0x2802834e0052f800501c02802834e00504f00501c02802834e0050bf005", - "0x2ae00534e00502834902802834e0052ec00501c02802834e0052ed00501c", - "0x2ab2ae0070200282ab00534e0052ab0050180282ab00534e0050285c0028", - "0x2b100534e0050f60052260282b200534e00537200500b0280f600534e005", - "0x2802834e00501000537502802834e005028007028028791005028013028", - "0x2834e00504f00501c02802834e00504e00522a02802834e00502300522a", - "0x34e0050a90052fc02802834e0052f90052fc02802834e0052f800501c028", - "0x500b02802834e0050f80050760282aa0f800734e0052f0005331028028", - "0x280287910050280130282b100534e0052aa0052260282b200534e0052f3", - "0x2802834e00501000537502802834e0050b600522a02802834e005028007", - "0x2834e0050a90052fc02802834e00504e00522a02802834e00502300522a", - "0x34e0052f90052fc02802834e0052f800501c02802834e00504f00501c028", - "0x52a70050180282a700534e0050285c00282a800534e005028349028028", - "0x2b200534e0050b400500b0280fa00534e0052a72a80070200282a700534e", - "0x2834e0050280070280287910050280130282b100534e0050fa005226028", - "0x34e00504e00522a02802834e00502300522a02802834e005010005375028", - "0x53020052fc02802834e00504f00501c02802834e0053010052fc028028", - "0xb02802834e0050fc0050760280fb0fc00734e0052fd00533102802834e", - "0x534e0050283480282b100534e0050fb0052260282b200534e005300005", - "0xb0282a500534e0052a60057810282a600534e0052b10f90073470280f9", - "0x70282a52b20070052a500534e0052a50057630282b200534e0052b2005", - "0x282a410110303179210410200734e0070073470072fd02802834e005028", - "0x10a00534e00510200500b0282a300534e00502827602802834e005028007", - "0x502801302810900534e0052a30052fa02810b00534e0051040052fa028", - "0x2a40052fa02810a00534e00510300500b02802834e005028007028028793", - "0x10c00534e0051090050b002810900534e0051010052fa02810b00534e005", - "0x504e0050320282a000534e0050285880282a100534e00510b0050b0028", - "0x34e0070252a010a0315240282a000534e0052a000534f02802504e00734e", - "0x11d00534e0050286c002802834e00502800702829f111007794112113007", - "0x3152402811d00534e00511d00534f02811911200734e005112005032028", - "0x22a02802834e00502800702812111f00779529e11800734e00711d119113", - "0x29c00534e00529c00534f02829c00534e0050286c002802834e00529e005", - "0x34e00502800702812429800779629929a00734e00729c112118031524028", - "0x776e02829900534e00529900534f02829a00534e00529a00500b028028", - "0x702829700579712300534e00712500576f02812512600734e00529929a", - "0x12c00534e00529500577702829500534e00512300577102802834e005028", - "0x29412b00721302829400534e00502821602812b00534e00512c0050b0028", - "0x29300534e00513100501802813000534e00512600500b02813100534e005", - "0x2802834e00501000537502802834e005028007028028798005028013028", - "0x2834e0052a100501c02802834e00504e00522a02802834e00502300522a", - "0x34e00529700533102802834e00504f00501c02802834e00510c00501c028", - "0x22602813600534e00512600500b02802834e005291005076028290291007", - "0x22a02802834e00502800702802879900502801302813800534e005290005", - "0x2802834e00502300522a02802834e00501000537502802834e005124005", - "0x2834e00504f00501c02802834e0052a100501c02802834e00504e00522a", - "0x534e0050285c002813700534e00502834902802834e00510c00501c028", - "0xb02828f00534e00513513700702002813500534e005135005018028135", - "0x2879900502801302813800534e00528f00522602813600534e005298005", - "0x534e00511f00500b02802834e00512100522a02802834e005028007028", - "0x2828d28e00734e00511211f00776e02811200534e00511200534f02811f", - "0x13f00577102802834e00502800702813e00579a13f00534e00728d00576f", - "0x28900534e00528a0050b002828a00534e00528b00577702828b00534e005", - "0x4f00721302829300534e00528900501802813000534e00528e00500b028", - "0x34e00514f10c0072dc02814f00534e00514f00501802814f00534e005293", - "0x14a14800734e00714613000777b02814600534e005146005018028146005", - "0x58a02814d00534e00514a01000777d02802834e00502800702814b00579b", - "0x28600558b0282ba00534e00514800500b02828600534e00504e2a114d031", - "0x34e00515700522a02815728828403134e0052b70057640282b700534e005", - "0x76102815500534e00502801402815600534e00502328828403158a028028", - "0x52ba00500b02815300534e00515400576202815400534e005155156007", - "0x34e0050280070281532ba00700515300534e0051530057630282ba00534e", - "0x504e00522a02802834e00502300522a02802834e005010005375028028", - "0x502823e02815200534e00502834902802834e0052a100501c02802834e", - "0x15000534e00515115200702002815100534e00515100501802815100534e", - "0x502801302828200534e00515000522602816100534e00514b00500b028", - "0x502300522a02802834e00501000537502802834e00502800702802879c", - "0x10c00501c02802834e0052a100501c02802834e00504e00522a02802834e", - "0x2828028100734e00513e00533102802834e00504f00501c02802834e005", - "0x34e00528000522602813600534e00528e00500b02802834e005281005076", - "0x1302828200534e00513800578002816100534e005136005376028138005", - "0x537502802834e00529f00522a02802834e00502800702802879c005028", - "0x1c02802834e00504e00522a02802834e00502300522a02802834e005010", - "0x2802834e00510c00501c02802834e00504f00501c02802834e0052a1005", - "0x534e00527e00501802827e00534e0050285c002827f00534e005028349", - "0x22602816100534e00511100500b02827d00534e00527e27f00702002827e", - "0x34e00528227c00734702827c00534e00502834802828200534e00527d005", - "0x76302816100534e00516100500b02827a00534e00527b00578102827b005", - "0x34600522a02802834e00502800702827a16100700527a00534e00527a005", - "0x522a02802834e00500700501c02802834e00501000537502802834e005", - "0x5c002816a00534e00502834902802834e00504f00501c02802834e00504e", - "0x34e00516c16a00702002816c00534e00516c00501802816c00534e005028", - "0x78102827700534e00527816e00734702816e00534e005028348028278005", - "0x34e00516f00576302802d00534e00502d00500b02816f00534e005277005", - "0x2802834e00504e00522a02802834e00502800702816f02d00700516f005", - "0x734e00503100503202817100534e0050286c002802834e00503000522a", - "0x17400734e00717117201b03152402817100534e00517100534f028172031", - "0x6c002802834e00527600522a02802834e00502800702827414300779d276", - "0x727303117403152402827300534e00527300534f02827300534e005028", - "0x34e00527200500b02802834e00502800702802426e00779e51527200734e", - "0x27517900734e00551527200776e02851500534e00551500534f028272005", - "0x577102802834e00502800702826900579f26b00534e00727500576f028", - "0x534e0052670050b002826700534e00526800577702826800534e00526b", - "0x500b02817f00534e00526526600721302826500534e005028216028266", - "0x280287a000502801302818200534e00517f00501802818100534e005179", - "0x2802834e00500700501c02802834e00501000537502802834e005028007", - "0x518400507602826418400734e00526900533102802834e00504f00501c", - "0x1302818700534e00526400522602818600534e00517900500b02802834e", - "0x537502802834e00502400522a02802834e0050280070280287a1005028", - "0x34902802834e00500700501c02802834e00504f00501c02802834e005010", - "0x26300534e00526300501802826300534e0050285c002818900534e005028", - "0x522602818600534e00526e00500b02819000534e005263189007020028", - "0x522a02802834e0050280070280287a100502801302818700534e005190", - "0x3100534e00503100534f02814300534e00514300500b02802834e005274", - "0x57a219200534e00719100576f02819118f00734e00503114300776e028", - "0x518a00577702818a00534e00519200577102802834e00502800702825f", - "0x2818100534e00518f00500b02826a00534e0052600050b002826000534e", - "0x25c00501802825c00534e00518204f00721302818200534e00526a005018", - "0x534e00519700501802819700534e00525c0070072dc02825c00534e005", - "0x2834e00502800702819b0057a325b19900734e00719718100777b028197", - "0x502834202825900534e00502823a02819d00534e00525b01000777d028", - "0x25300534e00502801402825500534e00525725919d03158a02825700534e", - "0x500b02824900534e00525200576202825200534e005253255007761028", - "0x2800702824919900700524900534e00524900576302819900534e005199", - "0x2823e02824800534e00502834902802834e00501000537502802834e005", - "0x534e00524524800702002824500534e00524500501802824500534e005", - "0x578102824200534e0052441a40073470281a400534e005028348028244", - "0x534e00524000576302819b00534e00519b00500b02824000534e005242", - "0x1c02802834e00501000537502802834e00502800702824019b007005240", - "0x23c00734e00525f00533102802834e00504f00501c02802834e005007005", - "0x1a800522602818600534e00518f00500b02802834e00523c0050760281a8", - "0x23b00534e0051871aa0073470281aa00534e00502834802818700534e005", - "0x23900576302818600534e00518600500b02823900534e00523b005781028", - "0x34e00534900522a02802834e00502800702823918600700523900534e005", - "0x500b02823804e00734e00504e00503202802834e00503000522a028028", - "0x34e0050280070282350057a402834e00723800569e02834a00534e00534a", - "0x701003158a02802834e00504e00522a02802834e00504f00501c028028", - "0x534e00522f23100776102822f00534e00502801402823100534e005031", - "0x576302834a00534e00534a00500b0281b300534e00522d00576202822d", - "0x52350056a102802834e0050280070281b334a0070051b300534e0051b3", - "0x34f0281b503100734e00503100503202822700534e0050286c002802834e", - "0x18b0077a52251b700734e0072271b534a03152402822700534e005227005", - "0x534e0050286c002802834e00522500522a02802834e005028007028223", - "0x52402822800534e00522800534f02822003100734e005031005032028228", - "0x2802834e00502800702821921a0077a61bc21f00734e0072282201b7031", - "0x1bc21f00776e0281bc00534e0051bc00534f02821f00534e00521f00500b", - "0x50280070282130057a721600534e00721700576f0282171bf00734e005", - "0xb002821100534e00521200577702821200534e00521600577102802834e", - "0x34e00520e1c500721302820e00534e0050282160281c500534e005211005", - "0x130281c700534e00521400501802820d00534e0051bf00500b028214005", - "0x537502802834e00504f00501c02802834e0050280070280287a8005028", - "0x22a02802834e00503100522a02802834e00500700501c02802834e005010", - "0x34e00520c00507602820a20c00734e00521300533102802834e00504e005", - "0x280130281cc00534e00520a0052260281ca00534e0051bf00500b028028", - "0x4f00501c02802834e00521900522a02802834e0050280070280287a9005", - "0x501c02802834e00501000537502802834e00504e00522a02802834e005", - "0x5c002820800534e00502834902802834e00503100522a02802834e005007", - "0x34e0051ce2080070200281ce00534e0051ce0050180281ce00534e005028", - "0x130281cc00534e0052060052260281ca00534e00521a00500b028206005", - "0x500b02802834e00522300522a02802834e0050280070280287a9005028", - "0x34e00520b00534f02820b03100734e00503100503202818b00534e00518b", - "0x1ff00534e00720000576f02820020100734e00520b18b00776e02820b005", - "0x57770281fd00534e0051ff00577102802834e0050280070281fe0057aa", - "0x534e00520100500b0281fb00534e0051fc0050b00281fc00534e0051fd", - "0x1f61d500734e00703104e20d0316dd0281c700534e0051fb00501802820d", - "0x281ef00534e0051c704f00721302802834e0050280070281f11f40077ab", - "0x1003158a0281ec00534e0051ef0070072dc0281ef00534e0051ef005018", - "0x34e0051f21e50077610281f200534e0050280140281e500534e0051f61ec", - "0x7630281d500534e0051d500500b02852200534e005000005762028000005", - "0x1f100522a02802834e0050280070285221d500700552200534e005522005", - "0x537502802834e0051c700501c02802834e00504f00501c02802834e005", - "0x6eb02852300534e00502834902802834e00500700501c02802834e005010", - "0x34e00552452300702002852400534e00552400501802852400534e005028", - "0x78102835300534e00552552600734702852600534e005028348028525005", - "0x34e0055270057630281f400534e0051f400500b02852700534e005353005", - "0x2802834e00504f00501c02802834e0050280070285271f4007005527005", - "0x2834e00503100522a02802834e00500700501c02802834e005010005375", - "0x52800507602852952800734e0051fe00533102802834e00504e00522a028", - "0x281cc00534e0055290052260281ca00534e00520100500b02802834e005", - "0x552b00578102852b00534e0051cc52a00734702852a00534e005028348", - "0x552c00534e00552c0057630281ca00534e0051ca00500b02852c00534e", - "0x1000537502802834e00501800522a02802834e00502800702852c1ca007", - "0x501c02802834e00504e00522a02802834e00500700501c02802834e005", - "0x6eb02852d00534e00502834902802834e00503100522a02802834e00504f", - "0x34e00552e52d00702002852e00534e00552e00501802852e00534e005028", - "0x78102853100534e00552f53000734702853000534e00502834802852f005", - "0x34e00553200576302801700534e00501700500b02853200534e005531005", - "0x734e00700502800700502802834e00502834c028532017007005532005", - "0xf00534e0050070057ad02802834e0050280070280500510077ac00b00a", - "0x4e0057af04f01000734e00700f0057ae02800a00534e00500a00500b028", - "0x34e0050130057b002801300534e00504f00536b02802834e005028007028", - "0x2002804d00534e00504d00501802804d00534e0050140057b1028014005", - "0x500a00500b02801700534e00501000559d02803000534e00504d031007", - "0x2801700534e00501700559e02800b00534e00500b00502d02800a00534e", - "0x34b34c01803134e00503001700b00a00a59f02803000534e005030005226", - "0x1402802834e00504e0055a002802834e00502800702834b34c018031005", - "0x34e00501c0050e302801c00534e00501b0310072d902801b00534e005028", - "0x2da02800b00534e00500b00502d02800a00534e00500a00500b02834a005", - "0x503602802834e00502800702834a00b00a03100534a00534e00534a005", - "0x23002834900534e00502834902802834e0050070057b202802834e005031", - "0x34e00501f34900702002801f00534e00501f00501802801f00534e005028", - "0x2cb02834700534e00502034800734702834800534e005028348028020005", - "0x34e00505000502d02805100534e00505100500b02802300534e005347005", - "0x500500503102802305005103100502300534e0050230052da028050005", - "0x34e00502800702800b0057b300a03100734e00700700505102800700534e", - "0x504f02805000534e00505100500f02805100534e00500a005050028028", - "0x734e00703100505102805000534e00505000501802803100534e005031", - "0x2804e00534e00501000524a02802834e00502800702804f0057b401000f", - "0x7b500502801302801400534e00504e00524b02801300534e00500f00504f", - "0x34e00504d00524c02804d00534e00502801402802834e005028007028028", - "0x6a02801400534e00503000524b02801300534e00504f00504f028030005", - "0x701400525802801800534e00501700504002801701300734e005013005", - "0x1b00534e00534c00505002802834e00502800702834b0057b634c00534e", - "0x2800732a02801c00534e00501c00501802801c00534e00501b00500f028", - "0x501800504502802834e00502800702801f0057b734934a00734e00701c", - "0x7b834802000734e00701300505102834a00534e00534a00500b02802834e", - "0x2000504f02802300534e00534800524a02802834e005028007028347005", - "0x70280287b900502801302834600534e00502300524b02802d00534e005", - "0x2808600534e0050c000524c0280c000534e00502801402802834e005028", - "0x502d00504002834600534e00508600524b02802d00534e00534700504f", - "0x2834e0050280070283420057ba1a000534e00734600525802834400534e", - "0x34100501802834100534e00503200500f02803200534e0051a0005050028", - "0x2803603c00c0317bb03334f00734e00734134a0072fd02834100534e005", - "0x50400057bd02804000534e0050333490500317bc02802834e005028007", - "0x2834400534e00534400525a02834f00534e00534f00500b02822200534e", - "0x2fc02802834e00502800702822234434f03100522200534e0052220057be", - "0x2802834e00505000501c02802834e0050360052fc02802834e00503c005", - "0x287bf00502801302822400534e00500c00500b02802834e005349005329", - "0x2834e00505000501c02802834e00534200504802802834e005028007028", - "0x34e00502801402822400534e00534a00500b02802834e005349005329028", - "0x7be02834400534e00534400525a02822a00534e0052260057c0028226005", - "0x501c02802834e00502800702822a34422403100522a00534e00522a005", - "0x2823000534e00501f00500b02802834e00501300534b02802834e005050", - "0x1c02802834e00534b00504802802834e0050280070280287c1005028013", - "0x23000534e00502800500b02802834e00501300534b02802834e005050005", - "0x501800525a02804800534e0050460057c002804600534e005028014028", - "0x502800702804801823003100504800534e0050480057be02801800534e", - "0x57c002804500534e00500b00504002804700534e00502801402802834e", - "0x534e00504500525a02802800534e00502800500b02823700534e005047", - "0x34e00500700518602823704502803100523700534e0052370057be028045", - "0x77202800b00534e00500b0057c302800b00534e0050287c202800a031007", - "0x4f01000734e0070500510077c402800f05005103134e00500b031028031", - "0x7c601401300734e00700f0100077c402802834e00502800702804e0057c5", - "0x719002803000534e00501400500719002802834e00502800702804d005", - "0x534e0050180057c302801800534e0050287c202801700534e00504f030", - "0x534e00501700527502801b34b34c03134e00501800a013031772028018", - "0x2834e0050280070283490057c734a01c00734e00734b34c0077c4028017", - "0x2802834e0050280070283480057c802001f00734e00701b01c0077c4028", - "0x2801402802300534e00534a34700719002834700534e005020017007190", - "0x534e0053460056c702834600534e00502d0230076c602802d00534e005", - "0x1f0070050c000534e0050c000536a02801f00534e00501f00500b0280c0", - "0x34e00534a00532902802834e00501700518202802834e0050280070280c0", - "0x534400501802834400534e00502823e02808600534e005028349028028", - "0x34200534e00534800500b0281a000534e00534408600702002834400534e", - "0x2834e0050280070280287c900502801302803200534e0051a0005226028", - "0x534e00502834902802834e00501b0052fc02802834e005017005182028", - "0x34100702002834f00534e00534f00501802834f00534e00502823e028341", - "0x534e00503300522602834200534e00534900500b02803300534e00534f", - "0x56ae02803c00534e00503200c00734702800c00534e005028348028032", - "0x534e00503600536a02834200534e00534200500b02803600534e00503c", - "0x18202802834e00500a0052fc02802834e005028007028036342007005036", - "0x2804000534e00502834902802834e00504f00532902802834e005005005", - "0x522204000702002822200534e00522200501802822200534e00502823e", - "0x2822a00534e00522400522602822600534e00504d00500b02822400534e", - "0x18202802834e00500a0052fc02802834e0050280070280287ca005028013", - "0x2823000534e00502834902802834e00500f0052fc02802834e005005005", - "0x504623000702002804600534e00504600501802804600534e00502823e", - "0x2822a00534e00504800522602822600534e00504e00500b02804800534e", - "0x50450056ae02804500534e00522a04700734702804700534e005028348", - "0x523700534e00523700536a02822600534e00522600500b02823700534e", - "0x7cb00b00a00734e00700502800700502802834e00502834c028237226007", - "0x3100503202800f00534e00502855402802834e005028007028050051007", - "0x34e00700f01000713602800a00534e00500a00500b02801003100734e005", - "0x4f00532502804f00534e00502832802802834e0050280070280287cc028", - "0x1300534e00502855402804e00534e00504f00700719002804f00534e005", - "0xa03152402804e00534e00504e00527502801300534e00501300534f028", - "0x500b02802834e0050280070280170300077cd04d01400734e007013031", - "0x534e00504e00527502800b00534e00500b00502d02801400534e005014", - "0x1803134e00504d04e00b01400a6c302804d00534e00504d00534f02804e", - "0x2834e00501700522a02802834e00502800702834b34c01803100534b34c", - "0x534e0050285c002801b00534e00502834902802834e00504e005182028", - "0x34802834a00534e00501c01b00702002801c00534e00501c00501802801c", - "0x34e00501f0056ae02801f00534e00534a34900734702834900534e005028", - "0x36a02800b00534e00500b00502d02803000534e00503000500b028020005", - "0x522a02802834e00502800702802000b03003100502000534e005020005", - "0x2834800534e00534800532502834800534e0050286c402802834e005031", - "0x233470076c602802300534e00502801402834700534e005348007007190", - "0xa00534e00500a00500b02834600534e00502d0056c702802d00534e005", - "0xb00a03100534600534e00534600536a02800b00534e00500b00502d028", - "0x34e00503100522a02802834e00500700518202802834e005028007028346", - "0x508600501802808600534e0050282300280c000534e005028349028028", - "0x281a000534e00502834802834400534e0050860c000702002808600534e", - "0x5100500b02803200534e0053420056ae02834200534e0053441a0007347", - "0x3200534e00503200536a02805000534e00505000502d02805100534e005", - "0x34e00700700531d02800700500734e0050050050bf028032050051031005", - "0x519b02802834e00500500501c02802834e0050280070280310057ce028", - "0x34e00503100531c02802834e00502800702802800500502800534e005028", - "0x2800725b02800a00534e00500a00534f02800a00534e005028342028028", - "0x500734e0050050050bf02805100534e00502823d02800b00534e00500a", - "0x19b02800f00534e00500f00501802800f00534e00505105000708c028050", - "0x50280070280100057cf02834e00700f00531d02800b00534e00500b005", - "0xb00500500b00534e00500b00519b02802834e00500500501c02802834e", - "0x4f00534e00502834202802834e00501000531c02802834e005028007028", - "0x2815202804e00534e00504f00b00725b02804f00534e00504f00534f028", - "0x34e00501301400708c02801400500734e0050050050bf02801300534e005", - "0x31d02804e00534e00504e00519b02804d00534e00504d00501802804d005", - "0x34e00500500501c02802834e0050280070280300057d002834e00704d005", - "0x31c02802834e00502800702804e00500504e00534e00504e00519b028028", - "0x1700534e00501700534f02801700534e00502834202802834e005030005", - "0x50050bf02834c00534e0050287d102801800534e00501704e00725b028", - "0x34e00501b00501802801b00534e00534c34b00708c02834b00500734e005", - "0x1c0057d202834e00701b00531d02801800534e00501800519b02801b005", - "0x534e00501800519b02802834e00500500501c02802834e005028007028", - "0x2834202802834e00501c00531c02802834e005028007028018005005018", - "0x534e00534a01800725b02834a00534e00534a00534f02834a00534e005", - "0x708c02802000500734e0050050050bf02801f00534e0050287d3028349", - "0x34e00534900519b02834800534e00534800501802834800534e00501f020", - "0x1c02802834e0050280070283470057d402834e00734800531d028349005", - "0x502800702834900500534900534e00534900519b02802834e005005005", - "0x2300534f02802300534e00502834202802834e00534700531c02802834e", - "0x34600534e0050287d502802d00534e00502334900725b02802300534e005", - "0x1802808600534e0053460c000708c0280c000500734e0050050050bf028", - "0x34e00708600531d02802d00534e00502d00519b02808600534e005086005", - "0x519b02802834e00500500501c02802834e0050280070283440057d6028", - "0x34e00534400531c02802834e00502800702802d00500502d00534e00502d", - "0x2d00725b0281a000534e0051a000534f0281a000534e005028342028028", - "0x500734e0050050050bf02803200534e0050287d702834200534e0051a0", - "0x19b02834f00534e00534f00501802834f00534e00503234100708c028341", - "0x50280070280330057d802834e00734f00531d02834200534e005342005", - "0x34200500534200534e00534200519b02802834e00500500501c02802834e", - "0xc00534e00502834202802834e00503300531c02802834e005028007028", - "0x287d902803c00534e00500c34200725b02800c00534e00500c00534f028", - "0x34e00503604000708c02804000500734e0050050050bf02803600534e005", - "0x31d02803c00534e00503c00519b02822200534e005222005018028222005", - "0x34e00500500501c02802834e0050280070282240057da02834e007222005", - "0x31c02802834e00502800702803c00500503c00534e00503c00519b028028", - "0x22600534e00522600534f02822600534e00502834202802834e005224005", - "0x50050bf02823000534e0050287db02822a00534e00522603c00725b028", - "0x34e00504800501802804800534e00523004600708c02804600500734e005", - "0x470057dc02834e00704800531d02822a00534e00522a00519b028048005", - "0x534e00522a00519b02802834e00500500501c02802834e005028007028", - "0x2834202802834e00504700531c02802834e00502800702822a00500522a", - "0x534e00504522a00725b02804500534e00504500534f02804500534e005", - "0x708c02823d00500734e0050050050bf02823a00534e0050287dd028237", - "0x34e00523700519b02823e00534e00523e00501802823e00534e00523a23d", - "0x1c02802834e0050280070282410057de02834e00723e00531d028237005", - "0x502800702823700500523700534e00523700519b02802834e005005005", - "0x24300534f02824300534e00502834202802834e00524100531c02802834e", - "0x24700534e0050287df02824600534e00524323700725b02824300534e005", - "0x1802824b00534e00524724a00708c02824a00500734e0050050050bf028", - "0x34e00724b00531d02824600534e00524600519b02824b00534e00524b005", - "0x519b02802834e00500500501c02802834e00502800702824c0057e0028", - "0x34e00524c00531c02802834e00502800702824600500524600534e005246", - "0x24600725b02825800534e00525800534f02825800534e005028342028028", - "0x500734e0050050050bf02805200534e0050287e102825a00534e005258", - "0x19b02805d00534e00505d00501802805d00534e00505200900708c028009", - "0x502800702805a0057e202834e00705d00531d02825a00534e00525a005", - "0x25a00500525a00534e00525a00519b02802834e00500500501c02802834e", - "0x5b00534e00502834202802834e00505a00531c02802834e005028007028", - "0x282e002805e00534e00505b25a00725b02805b00534e00505b00534f028", - "0x34e00529b2a900708c0282a900500734e0050050050bf02829b00534e005", - "0x31d02805e00534e00505e00519b0282e800534e0052e80050180282e8005", - "0x34e00500500501c02802834e0050280070280600057e302834e0072e8005", - "0x31c02802834e00502800702805e00500505e00534e00505e00519b028028", - "0x6200534e00506200534f02806200534e00502834202802834e005060005", - "0x50050bf02805f00534e0050287e402806100534e00506205e00725b028", - "0x34e00532600501802832600534e00505f31800708c02831800500734e005", - "0x420057e502834e00732600531d02806100534e00506100519b028326005", - "0x534e00506100519b02802834e00500500501c02802834e005028007028", - "0x2834202802834e00504200531c02802834e005028007028061005005061", - "0x534e00506906100725b02806900534e00506900534f02806900534e005", - "0x708c02806a00500734e0050050050bf02806b00534e005028369028332", - "0x34e00533200519b02800600534e00500600501802800600534e00506b06a", - "0x1c02802834e0050280070280710057e602834e00700600531d028332005", - "0x502800702833200500533200534e00533200519b02802834e005005005", - "0x7300534f02807300534e00502834202802834e00507100531c02802834e", - "0x7600534e00502823702833100534e00507333200725b02807300534e005", - "0x519b02807700534e00507700501802807700534e00507600500708c028", - "0x34e0050280070280790057e702834e00707700531d02833100534e005331", - "0x31c02802834e00502800702833100500533100534e00533100519b028028", - "0x33000534e00533000534f02833000534e00502834202802834e005079005", - "0x32f00500532f00534e00532f00519b02832f00534e00533033100725b028", - "0x2800f00b00734e00500b00521f02805005100b03134e00500a005702028", - "0x2800702804d0140130317e904e04f01003134e00705000f00700500a7e8", - "0x2801000534e00501000502d02804e00534e00504e00522702802834e005", - "0x70280170057ea03000534e00704e0051b502804f00534e00504f005346", - "0x27402834c00534e0050287ec02801800534e0050287eb02802834e005028", - "0x1804f01000a22f02834c00534e00534c00527402801800534e005018005", - "0x22702802834e00502800702801f34934a0317ed01c01b34b03134e00734c", - "0x34e00501b00534602834b00534e00534b00502d02801c00534e00501c005", - "0x2802834e0050280070283480057ee02000534e00701c0051b502801b005", - "0x502300573f02802334700734e00534700573e02834700534e0050287ef", - "0x323421a03440860c034602d04f34e00702300b02803136f02802300534e", - "0x34e00534f02d00727c02802834e00502800702803c00c0330317f034f341", - "0x22200534e00503204000727c02804000534e00534103600727c028036005", - "0x27c02822600534e0051a022400727c02822400534e00534222200727c028", - "0x23000727c02823000534e00508622a00727c02822a00534e005344226007", - "0x534e00504600500b02804800534e00534600574102804600534e0050c0", - "0x27402804704800734e00504800521f02803100534e005031005274028046", - "0x573e02823704500734e00504703104603174202804700534e005047005", - "0x23a23704503174302823a00534e00523a00573f02823a34700734e005347", - "0x27c02802834e00523e00574402824b24a24724624324123e23d00f34e005", - "0x25800727c02825800534e00524a24c00727c02824c00534e00524b23d007", - "0x524305200727c02805200534e00524625a00727c02825a00534e005247", - "0x2805b05a00734e00505d00518602805d00534e00502870b02800900534e", - "0x903128002805b00534e00505b0052fa02829b05e00734e005241005186", - "0x2801402802834e0050280070280620600077f12e82a900734e00729b05b", - "0x31800534e0052a900500b02805f00534e0050610050a202806100534e005", - "0x502801302804200534e00505f00530102832600534e0052e80052fa028", - "0x506900530202806900534e00502801402802834e0050280070280287f2", - "0x2832600534e0050620052fa02831800534e00506000500b02833200534e", - "0x5a31803128002805a00534e00505a0052fa02804200534e005332005301", - "0x6b00500b02802834e0050280070280710060077f306a06b00734e00705e", - "0x7600534e0053260052fa02833100534e00506a0052fa02807300534e005", - "0x2807700534e00502828202802834e0050280070280287f4005028013028", - "0x77f533007900734e00707732600603128002807700534e0050770052fa", - "0x710052fa02807300534e00507900500b02802834e00502800702804332f", - "0x7c00534e00704200528f02807600534e0053300052fa02833100534e005", - "0x7300500b02802834e00507c00504802802834e00502800702807b0057f6", - "0x4800534e00504800527402805100534e00505100527402807300534e005", - "0x2834700534e00534700573f02832c08100734e005048051073031742028", - "0x7f00574402832432532732832932a07f08300f34e00534732c081031743", - "0x534e00532532000727c02832000534e00532408300727c02802834e005", - "0x2831e00534e00532831f00727c02831f00534e00532708e00727c02808e", - "0x527402831d00534e00507633100714302808c00534e00532931e00727c", - "0x31d02001b34b00a7f702808c00534e00508c00500b02831d00534e00531d", - "0x502d02802834e00502800702808831931a0317f831b08a31c03134e007", - "0x32a03008a31c00a7f702831b00534e00531b00572102831c00534e00531c", - "0x502d02802834e0050280070283123133140317f931536c09003134e007", - "0x31531b36c09000a7fa02831500534e00531500572102809000534e005090", - "0x57fc02802834e00502800702830d30e30f0317fb08d31031103134e007", - "0x534e00530b0057fe02830b00534e00530c0057fd02830c00534e00508d", - "0x534602831100534e00531100502d02808c00534e00508c00500b028308", - "0x2830831031108c00a00530800534e0053080057ff02831000534e005310", - "0x534e00530d08700734702808700534e00502834802802834e005028007", - "0x502d02808c00534e00508c00500b02809600534e005094005800028094", - "0x534e0050960057ff02830e00534e00530e00534602830f00534e00530f", - "0x2834e00531b0051b702802834e00502800702809630e30f08c00a005096", - "0x9900580002809900534e00531230700734702830700534e005028348028", - "0x31400534e00531400502d02808c00534e00508c00500b02830600534e005", - "0x31408c00a00530600534e0053060057ff02831300534e005313005346028", - "0x532a00519102802834e0050300051b702802834e005028007028306313", - "0x80002830500534e00508809700734702809700534e00502834802802834e", - "0x34e00531a00502d02808c00534e00508c00500b02830400534e005305005", - "0xa00530400534e0053040057ff02831900534e00531900534602831a005", - "0x52fc02802834e00507b00504802802834e00502800702830431931a08c", - "0x1b702802834e0050760052fc02802834e0050300051b702802834e005331", - "0x2802834e00504800519102802834e00534700575602802834e005020005", - "0x2880100502801302830200534e00507300500b02802834e005051005191", - "0x2834e0050710052fc02802834e0050430052fc02802834e005028007028", - "0x34e0050200051b702802834e00504200530002802834e0050300051b7028", - "0x505100519102802834e00504800519102802834e005347005756028028", - "0x2880202830100534e00502834902830200534e00532f00500b02802834e", - "0x534e0050a23010070200280a200534e0050a20050180280a200534e005", - "0x58000282fe00534e0053002ff0073470282ff00534e005028348028300", - "0x534e00534b00502d02830200534e00530200500b0282fd00534e0052fe", - "0x30200a0052fd00534e0052fd0057ff02801b00534e00501b00534602834b", - "0x300051b702802834e00503100519102802834e0050280070282fd01b34b", - "0x575602802834e0050200051b702802834e00505100519102802834e005", - "0x34e00500c2fc00727c0282fc00534e00503c03300727c02802834e005347", - "0xa90050180280a900534e00502823e0282f900534e0050283490282fa005", - "0xb000534e0050283480282f800534e0050a92f90070200280a900534e005", - "0x500b0282f700534e0050ac0058000280ac00534e0052f80b0007347028", - "0x534e00501b00534602834b00534e00534b00502d0282fa00534e0052fa", - "0x34e0050280070282f701b34b2fa00a0052f700534e0052f70057ff02801b", - "0x50300051b702802834e00503100519102802834e005348005048028028", - "0x502834902802834e00500b00519102802834e00505100519102802834e", - "0x200280b400534e0050b40050180280b400534e00502823e0282f500534e", - "0x501b0053460282f300534e00534b00502d0280b600534e0050b42f5007", - "0x280070280288030050280130282f100534e0050b60052260280b900534e", - "0x519102802834e0050300051b702802834e00503100519102802834e005", - "0x282f300534e00534a00502d02802834e00500b00519102802834e005051", - "0x34e0050283480282f100534e00501f0052260280b900534e005349005346", - "0x282ee00534e0052ef0058000282ef00534e0052f12f00073470282f0005", - "0x50b90053460282f300534e0052f300502d02802800534e00502800500b", - "0x280070282ee0b92f302800a0052ee00534e0052ee0057ff0280b900534e", - "0x519102802834e00505100519102802834e00503100519102802834e005", - "0x2ec00534e0052ed0057fd0282ed00534e00501700536802802834e00500b", - "0x1000502d02802800534e00502800500b0280bf00534e0052ec0057fe028", - "0xbf00534e0050bf0057ff02804f00534e00504f00534602801000534e005", - "0x2802834e00503100519102802834e0050280070280bf04f01002800a005", - "0x2eb00534e00502834802802834e00505100519102802834e00500b005191", - "0x500b0282e900534e0052ea0058000282ea00534e00504d2eb007347028", - "0x534e00501400534602801300534e00501300502d02802800534e005028", - "0x34e0050288040282e901401302800a0052e900534e0052e90057ff028014", - "0x34e00502834c02802834e00502824302800f00534e0050282e8028051005", - "0x2804d01401303180504e04f05001000a34e00700a0310050311bc028028", - "0x34e00503000580702803000534e00504e04f00780602802834e005028007", - "0x80a02801800534e00501800580902802834e005017005808028018017007", - "0x534e00502827202834b00534e00534c00580b02834c00534e005018005", - "0x502d02802800534e00502800500b02801c00534e00534b00502402801b", - "0x534e00501c00517902800700534e0050070052f502801000534e005010", - "0x80c02805000534e00505000f00732602801b00534e00501b00527502801c", - "0x34e00500b05100780d02801f00b34934a00a34e00501b01c00701002800b", - "0x2802834e00502800702834800580e02000534e00701f00526902800b005", - "0x2d00504802802834e00534700526702802d02334703134e005020005268", - "0x500b0280c000534e00502834202834600534e00502832802802834e005", - "0x534e00502300527502834900534e00534900502d02834a00534e00534a", - "0xb2660280c000534e0050c000534f02834600534e005346005325028023", - "0x80f34200534e0071a00052650281a034408603134e0050c034602334934a", - "0x504802834f34100734e00534200517f02802834e005028007028032005", - "0x2834e00503300518202800c03300734e00534100518102802834e00534f", - "0x22204003603134e00703c05034403126402803c00534e00500c005184028", - "0x4623000734e00522200518602802834e00502800702822a226224031810", - "0x2fa02804704800734e00504600b00781102804600534e0050460052fa028", - "0x502881202823704500734e00523004800781102823000534e005230005", - "0x2823a00534e00523a0057c302823700534e0052370052fa02823a00534e", - "0xb002802834e00523e0052fc02824123e23d03134e00523a237086031772", - "0x534e00502821602824600534e0050470050b002824300534e005241005", - "0x1802824a00534e00524a00501802824a00534e005247243007213028247", - "0x524b00521402824b00534e00524624a0072dc02824600534e005246005", - "0x2825a00534e00525800581402825800534e00524c00581302824c00534e", - "0x50450052f502803600534e00503600502d02823d00534e00523d00500b", - "0x525a00534e00525a00536702804000534e00504000534602804500534e", - "0x5200534e00508600500b02802834e00502800702825a04004503623d00b", - "0x22a00522602805d00534e00522600534602800900534e00522400502d028", - "0x3200533102802834e00502800702802881500502801302805a00534e005", - "0x5200534e00508600500b02802834e00505b00507602805e05b00734e005", - "0x5e00522602805d00534e00505000534602800900534e00534400502d028", - "0x34800533102802834e00502800702802881500502801302805a00534e005", - "0x5200534e00534a00500b02802834e00529b0050760282a929b00734e005", - "0x2a900522602805d00534e00505000534602800900534e00534900502d028", - "0x6000534e00505a2e80073470282e800534e00502834802805a00534e005", - "0x900502d02805200534e00505200500b02806200534e005060005816028", - "0x5d00534e00505d00534602800b00534e00500b0052f502800900534e005", - "0x34e00502800702806205d00b00905200b00506200534e005062005367028", - "0x34e00502834802802834e00500f00505f02802834e005051005817028028", - "0x2831800534e00505f00581602805f00534e00504d061007347028061005", - "0x50070052f502801300534e00501300502d02802800534e00502800500b", - "0x531800534e00531800536702801400534e00501400534602800700534e", - "0x500700518602800a03100734e00500500518602831801400701302800b", - "0x734e00500b00528102805003100734e00503100528102805100b00734e", - "0x34e00504e02800727c02804e04f01003134e00500f05000727d02800f00b", - "0x4d03134e00501403100727d02801405100734e005051005281028013005", - "0x734e00703001001803127b02801800534e00501701300727c028017030", - "0x2834a00534e00502881902802834e00502800702801c01b00781834b34c", - "0x534a00581a02801f00534e00534b0052fa02834900534e00534c00500b", - "0x34e00502881c02802834e00502800702802881b00502801302802000534e", - "0x81a02801f00534e00501c0052fa02834900534e00501b00500b028348005", - "0xb34700727d02834700a00734e00500a00528102802000534e005348005", - "0x1f0c003127b0280c000534e00534634900727c02834602d02303134e005", - "0x502881902802834e0050280070283421a000781d34408600734e00702d", - "0x2834f00534e0053440052fa02834100534e00508600500b02803200534e", - "0x2802834e00502800702802881e00502801302803300534e00503200581a", - "0x34e0053420052fa02834100534e0051a000500b02800c00534e00502881c", - "0x3c00734e00702304d34103127b02803300534e00500c00581a02834f005", - "0xb02822400534e00502881902802834e00502800702822204000781f036", - "0x34e00522400581a02822a00534e0050360052fa02822600534e00503c005", - "0x534e00502881c02802834e005028007028028820005028013028230005", - "0x581a02822a00534e0052220052fa02822600534e00504000500b028046", - "0x22600727c02804504704803134e00505100a00727d02823000534e005046", - "0x24123e00782123d23a00734e00704722a23703127b02823700534e005045", - "0x534e00523a00500b02824300534e00502881902802834e005028007028", - "0x2801302824a00534e00524300581a02824700534e00523d0052fa028246", - "0x23e00500b02824b00534e00502881c02802834e005028007028028822005", - "0x24a00534e00524b00581a02824700534e0052410052fa02824600534e005", - "0x52fa02825800534e00524c00582402824c00534e005033020007823028", - "0x5d00900782505225a00734e00725824724603127b02825800534e005258", - "0x534e00525a00500b02805a00534e00502881902802834e005028007028", - "0x2801302829b00534e00505a00581a02805e00534e0050520052fa02805b", - "0x900500b0282a900534e00502881c02802834e005028007028028826005", - "0x29b00534e0052a900581a02805e00534e00505d0052fa02805b00534e005", - "0x78280282e800534e0052e80058270282e800534e00524a230007823028", - "0x34e0050620052fa02806200534e00506000582902806000534e00529b2e8", - "0x2800702832631800782a05f06100734e00706204805b03127b028062005", - "0x2806900534e00505f0052fa02804200534e00506100500b02802834e005", - "0x2804200534e00531800500b02802834e00502800702802882b005028013", - "0xb02833200534e00506905e34f04f00a82c02806900534e0053260052fa", - "0x37902833204200700533200534e00533200582d02804200534e005042005", - "0x582f02802834e00502800702800a00582e03100700734e007005028007", - "0x534e00500700500b02800b00534e00500b00583002800b00534e005031", - "0x583501000583400f00583305000583205100534e01700b005831028007", - "0x83c01700583b03000583a04d00583901400583801300583704e00583604f", - "0x2834e00502800702801c00584001b00583f34b00583e34c00583d018005", - "0x34e00534a0057c302834a00534e00502884102802834e005051005048028", - "0x34e00505000504802802834e005028007028028842005028013028349005", - "0x502801302834900534e00501f0057c302801f00534e005028843028028", - "0x34e00502884402802834e00500f00504802802834e005028007028028842", - "0x502800702802884200502801302834900534e0050200057c3028020005", - "0x3480057c302834800534e00502884502802834e00501000504802802834e", - "0x4f00504802802834e00502800702802884200502801302834900534e005", - "0x1302834900534e0053470057c302834700534e00502881202802834e005", - "0x2884602802834e00504e00504802802834e005028007028028842005028", - "0x702802884200502801302834900534e0050230057c302802300534e005", - "0x7c302802d00534e00502884702802834e00501300504802802834e005028", - "0x4802802834e00502800702802884200502801302834900534e00502d005", - "0x34900534e0053460057c302834600534e00502884802802834e005014005", - "0x2802834e00504d00504802802834e005028007028028842005028013028", - "0x2884200502801302834900534e0050c00057c30280c000534e0050287c2", - "0x8600534e00502884902802834e00503000504802802834e005028007028", - "0x2834e00502800702802884200502801302834900534e0050860057c3028", - "0x34e0053440057c302834400534e00502836402802834e005017005048028", - "0x34e00501800504802802834e005028007028028842005028013028349005", - "0x502801302834900534e0051a00057c30281a000534e00502884a028028", - "0x34e00502884b02802834e00534c00504802802834e005028007028028842", - "0x502800702802884200502801302834900534e0053420057c3028342005", - "0x320057c302803200534e00502884c02802834e00534b00504802802834e", - "0x1b00504802802834e00502800702802884200502801302834900534e005", - "0x1302834900534e0053410057c302834100534e00502884d02802834e005", - "0x2884e02802834e00501c00504802802834e005028007028028842005028", - "0x3300534e00534900584f02834900534e00534f0057c302834f00534e005", - "0xc00585102800700534e00500700500b02800c00534e005033005850028", - "0x534e00502834902802834e00502800702800c00700700500c00534e005", - "0x3c00702002803600534e00503600501802803600534e00502885202803c", - "0x534e00504022200734702822200534e00502834802804000534e005036", - "0x585102800a00534e00500a00500b02822600534e005224005853028224", - "0x502800700502802834e00502834c02822600a00700522600534e005226", - "0x503100568802802834e00502800702800f05000785405100b00734e007", - "0x568902800b00534e00500b00500b02802834e00502800a02801000534e", - "0x504e00568b02802834e00502800702801300585504e04f00734e007010", - "0x2803000534e00501400568d02804d00534e00504f00568c02801400534e", - "0x68f02801700534e00502801402802834e005028007028028856005028013", - "0x34e00501800568d02804d00534e00501300568c02801800534e005017005", - "0x585734b00534e00703000569002834c00534e00504d005024028030005", - "0x501c00569302801c00534e00534b00569202802834e00502800702801b", - "0x2800700534e0050070052f502800b00534e00500b00500b02834a00534e", - "0x700b00a85802834a00534e00534a00527402800a00534e00500a005275", - "0x2834700585934800534e00702000526502802001f34903134e00534a00a", - "0x2d02300734e00534800517f02802834e00502834c02802834e005028007", - "0x505100502d02834900534e00534900500b02802834e00502d005048028", - "0x2834c00534e00534c00517902801f00534e00501f0052f502805100534e", - "0xc034600a34e00502334c01f05134900b80c02802300534e005023005275", - "0x2834e00502834c02802834e0050280070283440860c034600a005344086", - "0x534900500b0281a000534e00534700569602802834e00534c005267028", - "0x2801f00534e00501f0052f502805100534e00505100502d02834900534e", - "0x2802834e0050280070281a001f05134900a0051a000534e0051a0005697", - "0x2834200534e00502801402802834e00501b00504802802834e00502834c", - "0x500b02834100534e00503200569902803200534e00534200a34c031698", - "0x534e0050070052f502805100534e00505100502d02800b00534e00500b", - "0x34e00502800702834100705100b00a00534100534e005341005697028007", - "0x34e00502834902802834e00503100526702802834e00500a005182028028", - "0x702002803300534e00503300501802803300534e00502823002834f005", - "0x34e00500c03c00734702803c00534e00502834802800c00534e00503334f", - "0x2d02805000534e00505000500b02804000534e005036005696028036005", - "0x34e00504000569702800700534e0050070052f502800f00534e00500f005", - "0x781102800b00a00734e00503100518602804000700f05000a005040005", - "0x34e0050500052fa02800f00534e0050287c202805005100734e00500b005", - "0x1003134e00500f05002803177202800f00534e00500f0057c3028050005", - "0x1401300734e00704f0100077c402805100534e0050510052f502804e04f", - "0x85b01703000734e00704e0130077c402802834e00502800702804d00585a", - "0x719002834c00534e00501700700719002802834e005028007028018005", - "0x50287c202801c01b00734e00500a05100781102834b00534e00501434c", - "0x2834a00534e00534a0057c302801c00534e00501c0052fa02834a00534e", - "0x2834b00534e00534b00527502802001f34903134e00534a01c030031772", - "0x2300585c34734800734e00701f3490077c402801b00534e00501b0052f5", - "0x280c000585d34602d00734e0070203480077c402802834e005028007028", - "0x534708600719002808600534e00534634b00719002802834e005028007", - "0x2834200534e0051a03440076c60281a000534e00502801402834400534e", - "0x501b0052f502802d00534e00502d00500b02803200534e0053420056c7", - "0x502800702803201b02d03100503200534e00503200536a02801b00534e", - "0x502834902802834e00534700532902802834e00534b00518202802834e", - "0x2002834f00534e00534f00501802834f00534e00502823e02834100534e", - "0x503300522602800c00534e0050c000500b02803300534e00534f341007", - "0x534b00518202802834e00502800702802885e00502801302803c00534e", - "0x502823e02803600534e00502834902802834e0050200052fc02802834e", - "0x22200534e00504003600702002804000534e00504000501802804000534e", - "0x502834802803c00534e00522200522602800c00534e00502300500b028", - "0x22a00534e0052260056ae02822600534e00503c22400734702822400534e", - "0x22a00536a02801b00534e00501b0052f502800c00534e00500c00500b028", - "0x500700518202802834e00502800702822a01b00c03100522a00534e005", - "0x502834902802834e00501400532902802834e00500a0052fc02802834e", - "0x2002804600534e00504600501802804600534e00502823e02823000534e", - "0x504800522602804700534e00501800500b02804800534e005046230007", - "0x500700518202802834e00502800702802885f00502801302804500534e", - "0x502834902802834e00504e0052fc02802834e00500a0052fc02802834e", - "0x2002823a00534e00523a00501802823a00534e00502823e02823700534e", - "0x523d00522602804700534e00504d00500b02823d00534e00523a237007", - "0x2824100534e00504523e00734702823e00534e00502834802804500534e", - "0x50510052f502804700534e00504700500b02824300534e0052410056ae", - "0x1f202800a07124305104703100524300534e00524300536a02805100534e", - "0x1f202800a1871c71f202800a0280310070050281f11c71f202800a1871c7", - "0x70050281f11c71f202800a1871c71f202800a2ed0310070050281f11c7", - "0x1f202800a55e0310070050281f11c71f202800a1871c71f202800a291031", - "0x1f202800a1871c71f202800a8600310070050281f11c71f202800a1871c7", - "0x70050281f11c71f202800a1871c71f202800a8610310070050281f11c7", - "0x1f202800a8630310070050281f11c71f202800a1871c71f202800a862031", - "0x1f202800a1871c71f202800a8640310070050281f11c71f202800a1871c7", - "0x70050281f11c71f202800a1871c71f202800a8650310070050281f11c7", - "0x1f202800a8670310070050281f11c71f202800a1871c71f202800a866031", - "0x2800b1871c71f222d02800b8680310070050281f11c71f202800a1871c7", - "0x1f11c71f202800a1871c71f202800a86900a0310070050281f11c71f222d", - "0x86b0310070050281f11c71f202800a1871c71f202800a86a031007005028", - "0x1871c71f202800a86c0310070050281f11c71f202800a1871c71f202800a", - "0x1f204002800b1871c71f204002800b86d0310070050281f11c71f202800a", - "0x50281f11c71f202800a1871c71f202800a86e00a0310070050281f11c7", - "0x2800a8700310070050281f11c71f202800a1871c71f202800a86f031007", - "0x2800a1871c71f202800a8710310070050281f11c71f202800a1871c71f2", - "0x50281f11c71f202800a1871c71f202800a8720310070050281f11c71f2", - "0x2800a8740310070050281f11c71f202800a1871c71f202800a873031007", - "0xb1871c71f202824000b8750310070050281f11c71f202800a1871c71f2", - "0x2400511871c71f204002824005187600a0310070050281f11c71f2028240", - "0x1f202800a1871c71f202800a87700b00a0310070050281f11c71f2040028", - "0x281f11c71f224502800b1871c71f224502800b8780310070050281f11c7", - "0x70050281f11c71f202824000b1871c71f202824000b87900a031007005", - "0x2805087b0310070050281f11c71f202800a1871c71f202800a87a00a031", - "0xb00a0310070050281f11c71f20df0e30e10280501871c71f20df0e30e1", - "0x87d00a0310070050281f11c71f20e102800b1871c71f20e102800b87c051", - "0x1871c71f202800a87e0310070050281f11c71f202800a1871c71f202800a", - "0x1f11c71f202800a1871c71f202800a87f0310070050281f11c71f202800a", - "0x8810310070050281f11c71f202800a1871c71f202800a880031007005028", - "0x5b1871f202800b8820310070050281f11c71f202800a1871c71f202800a", - "0x20e1f202803118705b1f202800a88300a0310070050282081f2028031006", - "0xa88503100700502820e1f202803105b1871f202800a884031007005028", - "0x901860901c71f20280508860310070050282171c71f20312161a81c71f2", - "0x18702803118702800788705100b00a03100700502821a1c71f202800a186", - "0x1c71f20280108890070050282251f20280311871f2028031888005028223", - "0xf05005100b00a0310070050282271c71f202800a00600600618a18b1a8", - "0xb00a0310070050281f11c71f20310060060060062161a81c71f200f88a", - "0x2803188c0310070050282311f222d02800a22f1f222d02800a88b050051", - "0x2171c71f202800a1a81c71f202800a88d0070050282351f202803100c1f2", - "0x88f0310070050282171c71f202800a1a81c71f202800a88e031007005028", - "0x2800a89000a0310070050282171c70401f202800b1a81c70401f202800b", - "0xa05b1a81c71f202800b8910310070050282171c71f202800a1a81c71f2", - "0x282171f20280310061a81f202800a89200a03100700502823b1c71f2028", - "0x2800f8940310070050282171f20280310061a81f202800a893031007005", - "0x5100b00a0310070050282171c72401f202800b0060060061a81c72401f2", - "0x70050282171c72400401f20280512421a81c72400401f2028050895050", - "0x8970310070050282171c71f224500a1a81c71f224500a89605100b00a031", - "0x89800b00a0310070050282171c72401f202800b0061a81c72401f2028051", - "0xb00a0310070050282171f20e10df0e30280511a81f20e10df0e3028051", - "0x282171c71f203105b0061911a81c71f205189a0282270e10070e1005899", - "0x17f1871f202800b89c00502825902800718702800789b00b00a031007005", - "0x2631f20280311871871f202800a89d00a03100700502825b1f2028031006", - "0xa89f0310070050282641f20280311821821f202800a89e031007005028", - "0x3108309016a1f202800b8a00310070050282761f202803116a1721f2028", - "0x700502828202800708308314602800a8a100a0310070050282771f2028", - "0x508a300a0310070050282861c71f202800a14b14a1c71f202800b8a2031", - "0x5100b00a03100700502829c1c70401f202800b07129a03c1c70401f2028", - "0xb00a0310070050282aa1c71f202800a11d03c03c03c1c71f20280508a4", - "0x50282eb0280070830060b902800a8a60050280f60052e72e70078a5051", - "0x1870280078a803100700502820e1f202803105b2f31f202800a8a7031007", - "0x2800a8aa00700502827702800703c16a0280318a9005028305187028031", - "0x8ac0050281460050061460078ab0310070050282771f202803108316a1f2", - "0x1f202800b8ad00a0310070050283301c71f202800a29a03c1c71f202800b", - "0x703c03c0280318ae00a0310070050283311c70401f202800b0761c7040", - "0x1720401f202800b8b000502829b0280070830280078af007005028318028", - "0x4002803103c16a04002800a8b100a0310070050282760401f202800a16a", - "0x8b2031007005028277" + "0x50f702803a02a0310070810050040030f60070060050040030f5007006", + "0x504400305c0050fa0050f902805702a0f800502902802f02602d00502d", + "0x30ff00700c0050040030fe0050fd00503c0050440030fc0050fb00503c", + "0x504400310200700c00500400310100700c00500400310000700c005004", + "0x310700700c00500400310600510500503c00504400310400510300503c", + "0x504400310a00700c00500400310900700c00500400310800700c005004", + "0x310f00700c00500400310e00510d00503c00504400310c00510b00503c", + "0x504400311200700c00500400311100700c00500400311000700c005004", + "0x311700700c00500400311600511500503c00504400311400511300503c", + "0x504400311a00700c00500400311900700c00500400311800700c005004", + "0x2a0cd00700c00500400311e00700c00500400303911d11c00511b00503c", + "0x502902802f02600600502d00512102803a02a02d00512000511f02803a", + "0x30f800503c00503c00512502809902605c00512400512302805702a122", + "0x700c00500400312900512800503c00504400312700512600503c005044", + "0x312d00700c00500400312c00700c00500400312b00700c00500400312a", + "0x313100700c00500400313000700600500400312f00512e00503c005044", + "0x313500700c00500400313400513300503c00504400313200700c005004", + "0x313900513800503c00504400313700700600500400313600700c005004", + "0x313d00700c00500400313c00700c00500400313b00513a00503c005044", + "0x504400314000700600500400313f00700c00500400313e00700c005004", + "0x500400314400700c00500400314300700600500400314200514100503c", + "0x314600514600503c00504400314600502400503c00504400314500700c", + "0x5081005081005081005081005081005029028148026147007081005004", + "0x14c14b00514a02802f0261490050350b3081005056055081005081005081", + "0x305c00515000514f02805702a02d00514e00514d005029028099026039", + "0x3415a005159005158005157005156005155005154005153005152005151", + "0x708100500400315c00708100500400315b007081005004003152005035", + "0x316000708100500400315f00708100500400315e00708100500400315d", + "0x2a02d005149005029028057026162007081005004003161007081005004", + "0x316600700600500400316500708100500400305c005164005163028057", + "0x5004003169007006005004003168007006005004003167007006005004", + "0xb308e00505605516c00700c00500400316b00700600500400316a00700c", + "0x2805702a02d00516d00502902805702616f00516e02802f02616d005035", + "0x2617400517302802f0261720050350b303c00505605505c005171005170", + "0x500400305c00517700517602805702a02d00516d0051750050290280b7", + "0x700600500400317900700600500400317800700600500400302800700c", + "0x502902802f02600500700c00500400300700700c00500400300217b17a", + "0x500400317d00700600500400300700700600500400317c00503f03e00c", + "0x700600500400318000700600500400317f00700600500400317e007006", + "0x502902809902618400518302802f0261820050350b3096005056055181", + "0x2802f0260590050350b305c00518700518602805702a0f8005185005185", + "0x518c00518b02805702a0f800518a00518a005029028099026189005188", + "0x519300519200519102819002603918f18e00503503418d00503503405c", + "0x500c005194005006005197028196026195005035034006005194005194", + "0x3e18a00508100508100518a00500c00518500500600500600500600518a", + "0x519902805702a02d00518500519802803a02a19400503f03e18d00503f", + "0x2a05c00519c00519b02805702a19a00518a00502902805702602d005182", + "0x519f02805702a19e00518a00502902803a02602d00518a00519d02803a", + "0x700600500400300500708e0050040031a100700600500400305c0051a0", + "0x31a50070060050040031a40070060050040030f00051a302802f0261a2", + "0x50040030180070060050040031a70070060050040031a6007006005004", + "0x2803a0261aa0070060050040030021a90130070060050040031a8007006", + "0x70060050040030021ad1ac0050060051ab02803a02600c00500c005029", + "0x51b20051b102805702a0060051b000502902803a0261af0280270261ae", + "0x517c0051b502805702a1b40070060050040031b300700600500400305c", + "0x2805702a02d0050290281b90260021b80060050c41b70060050561b605c", + "0x518a00502902803a02602d00518d0051bc02803a02a05c0051bb0051ba", + "0x2a19400508e00508e0051c002809902605c0051bf0051be02805702a1bd", + "0x2803a0261c200700600500400318e00503f03e02d00518e0051c102803a", + "0x302800708e00500400305c0051c40051c302805702a02d00508e005029", + "0x2a02d0051b00050290281c70261c60070060050040031c5007006005004", + "0x31cb0070060050040030391ca00600503505305c0051c90051c8028057", + "0x2a02d0050590050290280570261cd0070060050040031cc007006005004", + "0x503f03e0021d018a00503f03e05900503f03e05c0051cf0051ce028057", + "0x502902805702602d0050590051d302805702a1d20070060050040031d1", + "0x51d702803a02a00600503503405c0051d60051d502805702a1d400518a", + "0x30050070060050040031d900700600500400300600503f03e02d0051d8", + "0x50040031da007006005004003030007006005004003028007006005004", + "0x708100500400318a00502902802f0261dc0070060050040031db007006", + "0x2a0391e11e000700600500400305c0051df0051de02805702a0391dd028", + "0x51e90281e80281e70281e60281e51e40021e302d0050060051e202803a", + "0x60050051ee0060050051ed1ec0050051eb0280050051eb0281ea18a005", + "0x281f21f10050051eb1890050051eb0280071f10050071f00060050051ef", + "0x51eb0281f60281f51f10050051f40050071f10050071f002d0050051f3", + "0x51f90060050051f71f80050051f71d80050051f71890050051f7006005", + "0x71f005c0050051f30580050051f30060050051fc1fb0050051fa006005", + "0x282001ff0050051eb0281fe1fd0050051eb1d10050051eb0050071fd005", + "0x282040282030810050051eb1f80050052020810050052022010050051fa", + "0x1fd0050071f01df0050051f318a0050051f30590050051f7059005005205", + "0x51f72070050051fa2060050051fa0810050051f70590050051eb028007", + "0x51fa20a0050051fa2090050051fa18a0050051f72080050051fa02d005", + "0x71f002821000600500520f02820e00600500520d20c0050051fa20b005", + "0x51eb2110050051f40050072110050071f02110050051eb028007211005", + "0x51f71d40050051f41d60050051e92130050051f404003100521218a005", + "0x18a00500520d1d100500520d2160050051f72150050051fa028214194005", + "0x1d100500520f2180050051f72170050051f705900500520f05900500520d", + "0x1890050052021cf0050051e921a0050051f421903100521218a00500520f", + "0x51fa0580050051f705c0050051e921d03100521202821c00600500521b", + "0x71f00282230282222210050051f72200050051fa21f0050051fa21e005", + "0x51f70280070f80050071f02240050051f70f80050051eb0050070f8005", + "0x2270310052122250050051eb1b00050051f30282262250050051f70f8005", + "0x51eb22c0050051fa02822b22a0070052291c90050051f72280050051f4", + "0x8e0050051f702822f22e0050051fa22d0310052121940050051eb1f8005", + "0x2320050051f423103100521208e0050051eb08e0050052052300050051fa", + "0x18e00500520d0282372360050051fa0282350282340282331c40050051f7", + "0x2390050051f404803100521218e00500520f2380050051f4046031005212", + "0x1b000500520518e0050051f718d0050051f71bd0050051f41bf0050051e9", + "0x23a0050051f404703100521218d0050051eb18e0050051eb1b00050051f7", + "0x51eb02823e02823d04503100521202823c23b0050051f71bb0050051f7", + "0x282442430050051f72420310052122410050051eb00600500524023f005", + "0x51e92470050051f424603100521200c0050051eb00c0050051f7028245", + "0x24b0310052120400050051eb24a03100521224903100521202824817c005", + "0x2500050051f424f03100521224e0050051fa24d0050051fa24c031005212", + "0x60050052022530310052122520310052122510050051fa1b20050051e9", + "0x51f31ac0050051f32560310052122550050051eb028254194005005202", + "0x52051ec0050051ef0280050051ef2580310052122570050051eb257005", + "0x51e91ac0050051f72570050051e92570050052022570050051f7257005", + "0x521205003100521225a0050051eb2590050051fa00c0050051ef1ac005", + "0x51eb0e30050051eb0e10050051eb25c0050051fa25b0050051fa009031", + "0x2825d05903100521205c0050051eb05803100521205b0310052120df005", + "0x2130050051eb0280072130050071f01d60050051f30280071d40050071f0", + "0x21a0050071f01cf0050051f30050072130050071f00050071d40050071f0", + "0x51fa02825e18a00500520200500721a0050071f021a0050051eb028007", + "0x2280050051eb0280072280050071f01c90050051f30f80050051f425f005", + "0x2630050051fa0282622610050051fa0050072280050071f02600050051fa", + "0x2650050051e92650050051f72650050052052650050051f32640050051fa", + "0x51fa02826708e0050051ef08e0050052022660050051fa0f00050051ef", + "0x51f32320050051eb0050072320050071f026a0050051fa028269268005", + "0x51eb0280072380050071f018e0050051f30280072320050071f01c4005", + "0x1a00050051e926b0050051f405c0310052120050072380050071f0238005", + "0x26d0050051f426c0310052121820050051eb0960050051f919e0050051f4", + "0x1850050051f31820050051f718200500520519a0050051f419c0050051e9", + "0x26e0050051f400500726e0050071f026e0050051eb02800726e0050071f0", + "0x2390050071f01bf0050051f30280071bd0050071f018d0050051f302826f", + "0x2390050071f00050071bd0050071f01850050051f72390050051eb028007", + "0x2710050051eb02827018d00500520d19400500520d02d0050051ef005007", + "0x18e00500520518e0050051ee1920050051eb1950050051e91950050051ee", + "0x1930050051f719400500520f1930050051eb18e0050051e918e005005202", + "0x18d00500520518d00500520f18d0050051ee1940050051ef2720050051f7", + "0x27503100521202827418a0050051ef02827318d0050051e918d005005202", + "0x1850050051e91850050052021850050051ef18c0050051e92760050051f4", + "0x1870050051e92780050051f42770310052121850050051eb09600500521b", + "0x51fa23a0050051eb02800723a0050071f01bb0050051f30810050051ef", + "0x27c0050051fa27b0050051fa27a0050051fa00500723a0050071f0279005", + "0x600500528027f0050051fa22500500520227e0050051f727d0050051fa", + "0x51fa02828100c0050052020240050051fa17c00500520d2430050051eb", + "0x2470050071f017c0050051f302828502828402828317c00500520f282005", + "0x17c0050051f70050072470050071f02860050051fa2470050051eb028007", + "0x1460050051fa03c0050051f92890050051f72880050051fa2870050051fa", + "0x17200500520508e0050051f903c0050051fc03c0050051eb03c0050051f3", + "0x5e03100521216d0050051eb1750050051eb1750050051f31720050051f7", + "0x28b0050051f40600310052121750050051f71770050051e928a0050051f4", + "0x51e902828d28c0050051f316d0050051f716d0050052051710050051e9", + "0x51eb08e0050051fc2900050051fa28f0050051fa28e0050051fa03c005", + "0x51fa2930050051fa2920050051fa2910050051fa03c0050051f728c005", + "0x52121490050051eb0810050051fc2950050051fa0810050051f9294005", + "0x52051640050051e90282990280072980050072972960050051f405f031", + "0x521214e0050051eb14d0050051eb14d0050051f31490050051f7149005", + "0x29c0050051eb02829b14d0050051f71500050051e929a0050051f405d031", + "0x29f0050051fa29e0050051fa29d0050051fa1520050051e91520050051ee", + "0x51f70750050051f40750050051eb0750050051f70750050052050282a0", + "0x51fa2a40050051fa2a30050051fa2a20050051fa2a10050051fa074005", + "0x1340050051fa2a70050051fa03c0050052050282a603c0050052022a5005", + "0x51fa2ac0050051fa2ab0050051fa0282aa2a90050051fa2a80050051fa", + "0x521206f0050051eb2ae0050051eb06f0050051f32ae0050051f32ad005", + "0x2b20050052050282b11220050051f41240050051e92b00050051f42af031", + "0x2b30050051fa1200050051f72b20050051f42b20050051eb2b20050051f7", + "0x51fa2b60050051fa10e0050051fa0282b50250050051fa2b40050051fa", + "0x51eb2bb0050051fa2ba0050051fa2b90050051fa2b80050051fa2b7005", + "0x282bf2be0050051fa0fa0050051f72bd0050051f42bc031005212120005", + "0x51fa2c10050051fa2500050051eb0050072500050071f00060050052c0", + "0x2c30050051fa0280072500050071f01b20050051f31d10050051ef2c2005", + "0x2c60050051f72c60050052052c60050051f32c50050051fa2c40050051fa", + "0x2c90050051f72c90050052052c90050051f30282c80282c72c60050051e9", + "0x282cc0f00050051f70282cb2ca0050051fa0f00050052022c90050051e9", + "0x51fa0e90050052d12d00050051eb0282cf2ce0050051fa2cd0050051fa", + "0xe90050051f70e90050051eb0282d40e90050052022d30050051fa2d2005", + "0x2d00050051f70282da0282d92d80050051eb0282d72d60050051fa0282d5", + "0x2de0050051fa1920050051f70f00050051eb2dd0070052290282dc0282db", + "0xe100500520d0b900500520d0e300500520d1d80050051eb0060050052df", + "0x2e20050051eb2e20050051f32e10050051fa2e00050051fa0df00500520d", + "0x51eb2e70050051f30cf0050052e62e50050051fa0d20050052e40282e3", + "0x51f72eb0050051f72ea0050051f70d20050052e92e70050051eb2e8005", + "0x51fa2f00050051fa2ef0050051f72ee0050051f72ed0050051f72ec005", + "0x51eb0d50050051eb2f40050051fa2f30050051fa0d20050052f22f1005", + "0xdf00500520f0e300500520f0dc0050d20050072f60d20050052f50d4005", + "0x282f90da0050051eb0282f80070070052f70310070052f700a0070052f7", + "0x420310052122fa0050051eb2fa0050051f32fa0050051f72fa005005205", + "0xb90050051f32fc0050051fa2fb0050051fa0510050051f90e100500520f", + "0x2fe0050051fa0bf0050051e92fd0050051f40670310052120b90050051eb", + "0xb900500520f3020050051fa3010050051fa3000050051fa2ff0050051fa", + "0xb60050052020b90050053043030050052020b90050051f70b9005005205", + "0xb60050051f73060310052123050050051eb3050050051f305100500521b", + "0x51fa2e80050051f70283093080050051fa3070050051f73030050051f7", + "0x51f730c0050051f70a90050052e930b0050051eb0a90050052e430a005", + "0x51fa00600500531030f0050051fa30e0050051fa30d00700522930b005", + "0x51fa3150050051fa3140050051fa3130050051fa3120050051fa311005", + "0x531b31a0050051fa3190050051fa3180050051fa3170050051fa316005", + "0x51eb02800726b0050071f01a00050051f302800719e0050071f0006005", + "0x71f000500719e0050071f031c0050051fa00500726b0050071f026b005", + "0x521226d0050051eb02800726d0050071f019c0050051f302800719a005", + "0x26d0050071f000500719a0050071f00960050051fc31d0050051f4069031", + "0x2760050071f02760050051eb0280072760050071f018c0050051f3005007", + "0x31e0050051eb1840050051eb02800731e0050071f00960050051ed005007", + "0x52020960050051eb0960050051ee31e0050051f400500731e0050071f0", + "0x280072780050071f01870050051f30960050051f70960050051e9096005", + "0x51ed1750050051e90050072780050071f01840050051f72780050051eb", + "0x31f0050071f031f0050051eb1740050051eb02800731f0050071f003c005", + "0x71f006803100521203c0050051ef03c0050051ee31f0050051f4005007", + "0x521b02800728a0050071f01770050051f328a0050051eb00500728a005", + "0x51fa0850050051f70283220283210850050051eb3200050051fa08e005", + "0x71f03260050051fa08b0050051fa3250050051fa3240050051fa323005", + "0x3290050051fa3280050051fa3270050051fa28b0050051eb00500728b005", + "0x2832f02832e32d0050051fa32c0050051fa32b0050051fa32a0050051fa", + "0x28b0050071f01710050051f33300050051fa0060310052120860050051fa", + "0x51fa0880050051fa3320050051fa3310050051fa08100500521b028007", + "0x51fa0850050051ef3350050051fa08a0050051fa3340050051fa333005", + "0x2833a08100508e0050073390283383370050051fa08c0050051fa336005", + "0x33e0050051fa33d0050051fa06f03100521233c0050051fa33b0050051fa", + "0x71f033f0050051fa2960050051eb0280072960050071f01640050051f3", + "0x3420050071f007d00500534114d0050051e93400050051fa005007296005", + "0x3420050051f40050073420050071f03420050051eb14b0050051eb028007", + "0x1500050051f329a0050051eb00500729a0050071f002834307f0050051ef", + "0x283442ae0050051e92ae00500520214e0050051f702800729a0050071f0", + "0x3450050051fa0430050051fa0090050051f72ae0050051f706f0050051f7", + "0x2b00050051eb0280072b00050071f01240050051f30050071220050071f0", + "0x3470310052120740050051eb0770050051e93460050051f4071031005212", + "0x1220050071f006f0050051e906f0050052050710050051e93470050051f4", + "0x2bc0050051fa0670050051fa0050072b00050071f03060050051fa028007", + "0x2834907403100521203c0050052d10283480420050051eb042005005202", + "0xfa0050051f302834b02834a2750050051fa2770050051fa2af0050051f7", + "0x420050051f70050072bd0050071f02bd0050051eb0280072bd0050071f0", + "0xcf00500734c0cf0050051ef0cf0050051f72fa0050051e92fa005005202", + "0xb90050051e92fd0050051eb0280072fd0050071f00bf0050051f3006005", + "0x51f700c0050052d102834d05b0050051e926c0050051f4075031005212", + "0x51ef0050072fd0050071f00590050051ef0510050051fc02834e0b4005", + "0x2834f0510050051ef0510050051ee0510050051ed3050050051e90b9005", + "0x71f031d0050051eb02800731d0050071f00960050051f33050050051f7", + "0x51fa08e00500c0050073390090050051eb2560050051fa00500731d005", + "0x51fa24b0050051fa24c0050051fa24f0050051fa2520050051fa253005", + "0x2310050051fa0283502420050051fa2460050051fa2490050051fa24a005", + "0x51f30280070750050071f00283520283512270050051fa22d0050051fa", + "0x51fa0050073460050071f03460050051eb0280073460050071f0077005", + "0x360050052050360050051f304000500520d0050070750050071f021d005", + "0x770310052120360050053540360050053530360050051eb0360050051f7", + "0x280073470050071f00710050051f33560050051fa02835504000500520f", + "0x51eb3570050051fa2190050051f70050073470050071f03470050051eb", + "0x51eb00c00535900500734c0320050320050073581a80050051fa032005", + "0x51eb2af0050051f300c00508400500734c032005359005007358359005", + "0x35b0050051f435b0050051eb35b00500535a0c00050810050073392af005", + "0x3600050051fa35f0050051fa35e0050051fa35d0050051fa35c0050051fa", + "0x1c60050051fa04e0050051fa04d0050051fa0300050051fa3610050051fa", + "0x5b0050051f30070050051fa0310050051fa04f0050051fa0920050051fa", + "0x500726c0050071f00050050051fa26c0050051eb02800726c0050071f0", + "0xa007363007005028007005028028363005028028028362346031005212", + "0x2800f00536300500b00503102802836300502800702809204f0070c900b", + "0x536300500a00504f02802836300502800b02801000536300503100500a", + "0x536104e1c600736300701000500f02800f00536300500f00509202800a", + "0x504e00501002801400536300500f005031028028363005028007028013", + "0x2801700536300503000504e02803000536300504d0051c602804d005363", + "0x50170050140283610053630051c6005013028018005363005014005092", + "0x500f00503102802836300502800702802802000502804d028360005363", + "0x9202835f00536300501c00501702801c00536300502803002801b005363", + "0x36300535f00501402836100536300501300501302801800536300501b005", + "0x2802836300502800702801f0050b935e005363007360005018028360005", + "0x5363005020005092028020005363005018005031028028363005028361", + "0x283630050280070280230050ac35c35d00736300735e00a007360028020", + "0x2d00509202835d00536300535d00504f02802d005363005020005031028", + "0x502800702808400531a0c035b00736300736100500f02802d005363005", + "0x130281a80053630050c000501002835900536300502d005031028028363", + "0x3630051a800501b02835900536300535900509202835b00536300535b005", + "0x2836300502800702835600525303235700736300735b00500f0281a8005", + "0x36300535c00535e02802836300503200535f02802836300535700501c028", + "0x50280200283640053630053590050310280283630051a800501f028028", + "0x35c02800c00536300500c00501b02800c00536300502835d028033005363", + "0x503c03600702d02803600536300502802302803c00536300500c033007", + "0x2835d00536300535d00504f02821900536300504000535b028040005363", + "0x52190050840280070053630050070050c0028364005363005364005092", + "0x535600501c02802836300502800702821900736435d00a005219005363", + "0x509202822700536300502835902821d005363005359005031028028363", + "0x722721d35d0313570282270053630052270051a802821d00536300521d", + "0x36300523100503102802836300502800702804804600732723122d007363", + "0x2800b0282420053630050280320280450053630051a80051c6028047005", + "0x35c00736300535c005364028246242007363005242005356028028363005", + "0x504f028246005363005246005033028047005363005047005092028249", + "0x3133524b24a00736300704524924600704700b00c02822d00536300522d", + "0x503102824a00536300524a00509202802836300502800702825224f24c", + "0x536300524200503302825300536300525300509202825300536300524a", + "0x2805805b00903133e05025825603136300735c24224b25300a03c028242", + "0x28256005363005256005092028028363005028361028028363005028007", + "0x36300505000501b02805c005363005028020028059005363005256005031", + "0x27727500736300526c00503602826c00536300505005c00735c028050005", + "0x505e00521d02805e005363005277005219028028363005275005040028", + "0x2822d00536300522d00504f02805f005363005060005227028060005363", + "0x505f0050840282580053630052580050c0028059005363005059005092", + "0x500900509202802836300502800702805f25805922d00a00505f005363", + "0x282af00536300505d00509202805d005363005009005031028009005363", + "0x8600502804d02804200536300505800522d0282bc00536300505b0050c0", + "0x36300524200523102802836300535c00535e028028363005028007028028", + "0x509202806700536300524c00503102824c00536300524c005092028028", + "0x536300525200522d0282bc00536300524f0050c00282af005363005067", + "0x504230600702d028306005363005028023028028363005028361028042", + "0x2822d00536300522d00504f02806800536300506900535b028069005363", + "0x50680050840282bc0053630052bc0050c00282af0053630052af005092", + "0x535c00535e0280283630050280070280682bc2af22d00a005068005363", + "0x280200280060053630050480050310280283630051a800501f028028363", + "0x2807100536300507100501b02807100536300502804602806f005363005", + "0x34707400702d02807400536300502802302834700536300507106f00735c", + "0x4600536300504600504f02807700536300507500535b028075005363005", + "0x770050840280070053630050070050c0028006005363005006005092028", + "0x8400501c02802836300502800702807700700604600a005077005363005", + "0x2002834600536300502d00503102802836300535c00535e028028363005", + "0x4300536300504300501b028043005363005028048028345005363005028", + "0x7900702d02807900536300502802302807a00536300504334500735c028", + "0x536300535d00504f02834200536300507f00535b02807f00536300507a", + "0x50840280070053630050070050c002834600536300534600509202835d", + "0x501c02802836300502800702834200734635d00a005342005363005342", + "0x7d00536300502300504f028081005363005020005031028028363005361", + "0x283630050280070280280bf00502804d028340005363005081005092028", + "0x2836300536100501c02802836300501f005047028028363005028361028", + "0x33f00509202807d00536300500a00504f02833f005363005018005031028", + "0x1b02833d00536300502804502833e005363005028020028340005363005", + "0x36300502802302833c00536300533d33e00735c02833d00536300533d005", + "0x2808c00536300533700535b02833700536300533c33b00702d02833b005", + "0x50070050c002834000536300534000509202807d00536300507d00504f", + "0x2800702808c00734007d00a00508c00536300508c005084028007005363", + "0x20028336005363005092005031028028363005031005242028028363005", + "0x8a00536300508a00501b02808a005363005028046028335005363005028", + "0x33300702d02833300536300502802302833400536300508a33500735c028", + "0x536300504f00504f02833200536300508800535b028088005363005334", + "0x50840280070053630050070050c002833600536300533600509202804f", + "0x700502802836300502802802833200733604f00a005332005363005332", + "0x503102802836300502800702809204f00729500b00a007363007005028", + "0x536300500a00504f02801000536300503100500a02800f00536300500b", + "0x52ce04e1c600736300701000500f02800f00536300500f00509202800a", + "0x36300504e00535f0280283630051c600501c028028363005028007028013", + "0x502835d02804d00536300502802002801400536300500f005031028028", + "0x1700536300503004d00735c02803000536300503000501b028030005363", + "0x36100535b02836100536300501701800702d028018005363005028023028", + "0x1400536300501400509202800a00536300500a00504f028360005363005", + "0x1400a00a0053600053630053600050840280070053630050070050c0028", + "0x500f00503102802836300501300501c028028363005028007028360007", + "0x1a802801b00536300501b00509202801c00536300502835902801b005363", + "0x1f00715035e35f00736300701c01b00a03135702801c00536300501c005", + "0x36300502824602835d00536300535e005031028028363005028007028020", + "0x36002835d00536300535d00509202835c00536300535c00501b02835c005", + "0x503102802836300502800702835b0052a402d02300736300735c35f007", + "0x283590053630050282490280840053630050280320280c000536300535d", + "0x509202835702d00736300502d0053640281a8084007363005084005356", + "0x536300535900501b0281a80053630051a80050330280c00053630050c0", + "0x73630073593571a80070c000b00c02802300536300502300504f028359", + "0x536300503200509202802836300502800702800c033364031126356032", + "0x3c00509202803600536300502824a02803c005363005032005031028032", + "0x3600536300503600501b02808400536300508400503302803c005363005", + "0x702822d22721d03112421904000736300703602d08435603c00b00c028", + "0x231005363005040005031028040005363005040005092028028363005028", + "0x48005040028047048007363005046005036028046005363005028020028", + "0x2824200536300504500521d028045005363005047005219028028363005", + "0x523100509202802300536300502300504f028246005363005242005227", + "0x52460053630052460050840282190053630052190050c0028231005363", + "0x2821d00536300521d00509202802836300502800702824621923102300a", + "0x524900509202824a00536300502300504f02824900536300521d005031", + "0x2824f00536300522d00522d02824c0053630052270050c002824b005363", + "0x35e02802836300508400523102802836300502800702802829f00502804d", + "0x536300536400503102836400536300536400509202802836300502d005", + "0x50c002824b00536300525200509202824a00536300502300504f028252", + "0x2802829f00502804d02824f00536300500c00522d02824c005363005033", + "0x25600536300502802002825300536300535d005031028028363005028007", + "0x25825600735c02825800536300525800501b02825800536300502824b028", + "0x24b00536300525300509202824a00536300535b00504f028050005363005", + "0x502802302824f00536300505000522d02824c0053630050070050c0028", + "0x5800536300505b00535b02805b00536300524f00900702d028009005363", + "0x24c0050c002824b00536300524b00509202824a00536300524a00504f028", + "0x702805824c24b24a00a00505800536300505800508402824c005363005", + "0x2805c005363005028020028059005363005020005031028028363005028", + "0x526c05c00735c02826c00536300526c00501b02826c005363005028046", + "0x2805e00536300527527700702d028277005363005028023028275005363", + "0x505900509202801f00536300501f00504f02806000536300505e00535b", + "0x50600053630050600050840280070053630050070050c0028059005363", + "0x3102802836300503100524202802836300502800702806000705901f00a", + "0x2af00536300502804602805d00536300502802002805f005363005092005", + "0x280230282bc0053630052af05d00735c0282af0053630052af00501b028", + "0x536300506700535b0280670053630052bc04200702d028042005363005", + "0x50c002805f00536300505f00509202804f00536300504f00504f028306", + "0x2830600705f04f00a005306005363005306005084028007005363005007", + "0x2802836300502824f02809200536300502824c02800b00536300502824c", + "0x2804e1c600736501000f007363007005028007005028028363005028028", + "0x536300503100500a028013005363005010005031028028363005028007", + "0x501300509202800f00536300500f00504f02802836300502800b028014", + "0x36300502800702801700518703004d00736300701400500f028013005363", + "0x51c6028361005363005030005010028018005363005013005031028028", + "0x536300501800509202801b00536300536000504e028360005363005361", + "0x2804d02835e00536300501b00501402835f00536300504d00501302801c", + "0x2803002801f005363005013005031028028363005028007028028192005", + "0x1c00536300501f00509202835d005363005020005017028020005363005", + "0x35e00501802835e00536300535d00501402835f005363005017005013028", + "0x2802836300502836102802836300502800702835c00536604f005363007", + "0x2300509202804f00536300504f09200725202802300536300501c005031", + "0x280070280c000536735b02d00736300704f00f007253028023005363005", + "0x2802d00536300502d00504f028084005363005023005031028028363005", + "0x283570053681a835900736300735f00500f028084005363005084005092", + "0x53630051a8005010028032005363005084005031028028363005028007", + "0xb02835600536300500a0051c602800a00536300500a00b00725202800a", + "0x32005363005032005092028359005363005359005013028028363005028", + "0x3102802836300502800702800c00525703336400736300735900500f028", + "0x36300503c00509202803600536300503300525602803c005363005032005", + "0x4d02821d005363005036005258028219005363005364005013028040005", + "0x3002822700536300503200503102802836300502800702802824d005028", + "0x536300522700509202823100536300522d00505002822d005363005028", + "0x500902821d00536300523100525802821900536300500c005013028040", + "0x2836300502836102802836300502800702804800536904600536300721d", + "0x5028020028045005363005046005010028047005363005040005031028", + "0x282490053630050450051c6028246005363005219005219028242005363", + "0x524600505b02804700536300504700509202802d00536300502d00504f", + "0x2824900536300524900501b02824200536300524200522d028246005363", + "0x536300724c00505902824c24b24a03136300524924224604702d00b058", + "0x5c02825300536300524b00503102802836300502800702825200536a24f", + "0x725800526c02825300536300525300509202825825600736300524f005", + "0x5b00536300525300503102802836300502800702800900536b050005363", + "0x5800500f02805b00536300505b00509202805800536300525600500a028", + "0x36300505900501c02802836300502800702826c00520705c059007363007", + "0x535600501f02802836300505000504002802836300505c00535f028028", + "0x2802002827500536300505b00503102802836300535b005275028028363", + "0x2805e00536300505e00501b02805e00536300502835d028277005363005", + "0x6005f00702d02805f00536300502802302806000536300505e27700735c", + "0x24a00536300524a00504f0282af00536300505d00535b02805d005363005", + "0x2af0050840280070053630050070050c0028275005363005275005092028", + "0x26c00501c0280283630050280070282af00727524a00a0052af005363005", + "0x920280420053630050283590282bc00536300505b005031028028363005", + "0x422bc24a0313570280420053630050420051a80282bc0053630052bc005", + "0x530600503102802836300502800702806806900736c306067007363007", + "0x2802836300506f00504002807106f007363005050005036028006005363", + "0x506700504f028006005363005006005092028347005363005071005219", + "0x34603136d07707507403136300734735635b00700600b277028067005363", + "0x74005031028074005363005074005092028028363005028007028043345", + "0x7f00536300507900522702807900536300507700521d02807a005363005", + "0x750050c002807a00536300507a00509202806700536300506700504f028", + "0x702807f07507a06700a00507f00536300507f005084028075005363005", + "0x342005363005346005031028346005363005346005092028028363005028", + "0x7d00535b02807d00536300504308100702d028081005363005028023028", + "0x34200536300534200509202806700536300506700504f028340005363005", + "0x34206700a0053400053630053400050840283450053630053450050c0028", + "0x535600501f028028363005050005040028028363005028007028340345", + "0x2802002833f00536300506800503102802836300535b005275028028363", + "0x2833d00536300533d00501b02833d00536300502804602833e005363005", + "0x33c33b00702d02833b00536300502802302833c00536300533d33e00735c", + "0x6900536300506900504f02808c00536300533700535b028337005363005", + "0x8c0050840280070053630050070050c002833f00536300533f005092028", + "0x900504702802836300502800702808c00733f06900a00508c005363005", + "0x527502802836300535600501f028028363005256005242028028363005", + "0x33500536300524a00504f02833600536300525300503102802836300535b", + "0x2836300502800702802836e00502804d02808a005363005336005092028", + "0x36300524b00503102802836300535600501f02802836300535b005275028", + "0x9202824a00536300524a00504f02833300536300525200535b028334005", + "0x3630053330050840280070053630050070050c0028334005363005334005", + "0x2836300502836102802836300502800702833300733424a00a005333005", + "0x36300535b00527502802836300535600501f028028363005048005047028", + "0x2d00504f02808800536300504000503102802836300521900501c028028", + "0x2833200536300502802002808a005363005088005092028335005363005", + "0x533133200735c02833100536300533100501b02833100536300502805e", + "0x2808e00536300533008600702d028086005363005028023028330005363", + "0x508a00509202833500536300533500504f02836f00536300508e00535b", + "0x536f00536300536f0050840280070053630050070050c002808a005363", + "0x27502802836300535700501c02802836300502800702836f00708a33500a", + "0x32d00536300508400503102802836300500b00506002802836300535b005", + "0x36300532b00501b02832b00536300502804802832c005363005028020028", + "0x2d02832900536300502802302832a00536300532b32c00735c02832b005", + "0x502d00504f02832700536300532800535b02832800536300532a329007", + "0x280070053630050070050c002832d00536300532d00509202802d005363", + "0x2802836300502800702832700732d02d00a005327005363005327005084", + "0x536300502300503102802836300500b00506002802836300535f00501c", + "0x2804d02832500536300532600509202808b0053630050c000504f028326", + "0x535c005047028028363005028361028028363005028007028028370005", + "0x9200506002802836300500b00506002802836300535f00501c028028363", + "0x2808b00536300500f00504f02832400536300501c005031028028363005", + "0x5363005028045028323005363005028020028325005363005324005092", + "0x2302808500536300532032300735c02832000536300532000501b028320", + "0x36300509500535b02809500536300508509300702d028093005363005028", + "0xc002832500536300532500509202808b00536300508b00504f02831f005", + "0x31f00732508b00a00531f00536300531f005084028007005363005007005", + "0x2836300500b005060028028363005092005060028028363005028007028", + "0x36300502802002809800536300504e005031028028363005031005242028", + "0x735c02809600536300509600501b02809600536300502804602831e005", + "0x36300531d31c00702d02831c00536300502802302831d00536300509631e", + "0x920281c60053630051c600504f02831900536300531a00535b02831a005", + "0x3630053190050840280070053630050070050c0028098005363005098005", + "0x36300502805d02800b00536300502805f0283190070981c600a005319005", + "0x502824c02804e00536300502824c0280100053630050282af028092005", + "0x2824f02801800536300502824c02803000536300502824c028014005363", + "0x371360361007363007005028007005028028363005028028028028363005", + "0x500a02835f00536300536000503102802836300502800702801c01b007", + "0x2836100536300536100504f02802836300502800b02835e005363005031", + "0x2835d00537202001f00736300735e00500f02835f00536300535f005092", + "0x536300502000501002835c00536300535f005031028028363005028007", + "0x509202835b00536300502d00504e02802d0053630050230051c6028023", + "0x536300535b00501402808400536300501f0050130280c000536300535c", + "0x536300535f00503102802836300502800702802837300502804d028359", + "0x1a80050920280320053630053570050170283570053630050280300281a8", + "0x35900536300503200501402808400536300535d0050130280c0005363005", + "0x283610280283630050280070283560053741c6005363007359005018028", + "0x1c60053630051c604e0072520283640053630050c0005031028028363005", + "0x537500c0330073630071c6361007253028364005363005364005092028", + "0x503300504f02803600536300536400503102802836300502800702803c", + "0x21904000736300708400500f028036005363005036005092028033005363", + "0x501002822700536300503600503102802836300502800702821d005376", + "0x36300504d0051c602804d00536300504d03000725202804d005363005219", + "0x22700509202804000536300504000501302802836300502800b02822d005", + "0x502800702804800537704623100736300704000500f028227005363005", + "0x92028045005363005046005256028047005363005227005031028028363", + "0x363005045005258028246005363005231005013028242005363005047005", + "0x36300522700503102802836300502800702802837800502804d028249005", + "0x509202824c00536300524b00505002824b00536300502803002824a005", + "0x536300524c00525802824600536300504800501302824200536300524a", + "0x3102802836300502800702825200537924f005363007249005009028249", + "0x536300502802002825600536300524f005010028253005363005242005", + "0x504f0280090053630052560051c6028050005363005246005219028258", + "0x536300505000505b028253005363005253005092028033005363005033", + "0xb05802800900536300500900501b02825800536300525800522d028050", + "0x37a05c00536300705900505902805905805b031363005009258050253033", + "0x5c00505c02827500536300505800503102802836300502800702826c005", + "0x536300705e00526c02827500536300527500509202805e277007363005", + "0xa02805f00536300527500503102802836300502800702806000537b00f", + "0x536300500f0100072bc02802836300502800b02805d005363005277005", + "0x537c2bc2af00736300705d00500f02805f00536300505f00509202800f", + "0x52bc00501002806700536300505f005031028028363005028007028042", + "0x2806800536300506900504e0280690053630053060051c6028306005363", + "0x506800501402806f0053630052af005013028006005363005067005092", + "0x505f00503102802836300502800702802837d00502804d028071005363", + "0x92028075005363005074005017028074005363005028030028347005363", + "0x36300507500501402806f005363005042005013028006005363005347005", + "0x2802836300502800702807700537e013005363007071005018028071005", + "0x363005013014007252028346005363005006005031028028363005028361", + "0x4334500736300701305b007253028346005363005346005092028013005", + "0x504f02807900536300534600503102802836300502800702807a00537f", + "0x736300706f00500f028079005363005079005092028345005363005345", + "0x2807d00536300507900503102802836300502800702808100538034207f", + "0x170051c6028017005363005017018007252028017005363005342005010", + "0x9202807f00536300507f00501302802836300502800b028340005363005", + "0x702833d00538133e33f00736300707f00500f02807d00536300507d005", + "0x33b00536300533e00525602833c00536300507d005031028028363005028", + "0x33b00525802808c00536300533f00501302833700536300533c005092028", + "0x7d00503102802836300502800702802838200502804d028336005363005", + "0x2833400536300508a00505002808a005363005028030028335005363005", + "0x533400525802808c00536300533d005013028337005363005335005092", + "0x28363005028007028088005383333005363007336005009028336005363", + "0x363005333005010028332005363005337005031028028363005028361028", + "0x51c602808600536300508c005219028330005363005028020028331005", + "0x536300533200509202834500536300534500504f02808e005363005331", + "0x501b02833000536300533000522d02808600536300508600505b028332", + "0x2832c32d36f03136300508e33008633234500b05802808e00536300508e", + "0x32d00503102802836300502800702832a00538432b00536300732c005059", + "0x536300532900509202832732800736300532b00505c028329005363005", + "0x3102802836300502800702808b00538532600536300732700526c028329", + "0x36300532500509202832400536300532800500a028325005363005329005", + "0x2836300502800702808500538632032300736300732400500f028325005", + "0x36300504300527502802836300532000535f02802836300532300501c028", + "0x532600504002802836300509200506702802836300500b005042028028", + "0x22d00501f02802836300500f00504002802836300534000501f028028363", + "0x2002809300536300532500503102802836300500c005275028028363005", + "0x31f00536300531f00501b02831f00536300502835d028095005363005028", + "0x31e00702d02831e00536300502802302809800536300531f09500735c028", + "0x536300536f00504f02831d00536300509600535b028096005363005098", + "0x50840280070053630050070050c002809300536300509300509202836f", + "0x501c02802836300502800702831d00709336f00a00531d00536300531d", + "0x2831a00536300502835902831c005363005325005031028028363005085", + "0x31c36f03135702831a00536300531a0051a802831c00536300531c005092", + "0x31800503102802836300502800702831631700738731831900736300731a", + "0x2836300531400504002831331400736300500f005036028315005363005", + "0x31900504f028315005363005315005092028312005363005313005219028", + "0x3138830e30f31103136300731222d00c00731500b277028319005363005", + "0x503102831100536300531100509202802836300502800702830b0a930c", + "0x3630050ac00504002830a0ac0073630053260050360280b0005363005311", + "0x505b0280b00053630050b000509202830800536300530a005219028028", + "0x38904f00a0b403136300730834004330f0b000b27702830e00536300530e", + "0x310280b40053630050b40050920280283630050280070280b93050b6031", + "0x536300531900504f0283020053630050280200283030053630050b4005", + "0x505b02830200536300530200522d028303005363005303005092028319", + "0x504f09200706902800a00536300500a00b00730602830e00536300530e", + "0x2ff0050060282ff30030103136300530e30230331900a06802804f005363", + "0x53630053000050310280283630050280070280bf00538a2fe005363007", + "0x504f0280283630052fb0050470282fb2fc0073630052fe00506f0282fd", + "0x53630052fc00522d0282fd0053630052fd005092028301005363005301", + "0x5103136300504f2fc2fd30100a06802804f00536300504f00505b0282fc", + "0x280283630050280070280dc00538e38d00536300738c00500602838c38b", + "0x36300538d00506f0280c700536300502802002838f00536300538b005031", + "0x280cf0cb0073630050c60050360280283630050c90050470280c90c6007", + "0x52fa0053470282fa0cf0073630050cf0050710280283630050cb005040", + "0x2830700536300530700501b028307005363005390005074028390005363", + "0x5100504f0282f40053630050cf0052190283910053630053070c700735c", + "0x2f40053630052f400505b02838f00536300538f005092028051005363005", + "0x2f30d40313630053912f438f05100a07502839100536300539100522d028", + "0x310280283630050280070282f10053933920053630070d50050060280d5", + "0x50da0050470280da2ea00736300539200506f0282f00053630052f3005", + "0x2190280283630052e70050400282e52e70073630052ea005036028028363", + "0x3630052e80052270282e80053630050d200521d0280d20053630052e5005", + "0xc00282f00053630052f00050920280d40053630050d400504f0280db005", + "0xdb00a2f00d400a0050db0053630050db00508402800a00536300500a005", + "0x3630052f100535b0282ef0053630052f3005031028028363005028007028", + "0xc00282ef0053630052ef0050920280d40053630050d400504f0282e2005", + "0x2e200a2ef0d400a0052e20053630052e200508402800a00536300500a005", + "0x3630050dc0050770282e100536300538b005031028028363005028007028", + "0x920282ee00536300505100504f0280283630052e00053460280df2e0007", + "0x3630050df00522d0282ec00536300500a0050c00280e10053630052e1005", + "0x36300504f00524202802836300502800702802839400502804d0282eb005", + "0x3460282de2ed0073630050bf0050770280e3005363005300005031028028", + "0x53630050e30050920282ee00536300530100504f0280283630052ed005", + "0x2804d0282eb0053630052de00522d0282ec00536300500a0050c00280e1", + "0xb00504202802836300530e005242028028363005028007028028394005", + "0x310280b60053630050b6005092028028363005092005067028028363005", + "0x3630052d60050920282ee00536300531900504f0282d60053630050b6005", + "0x4d0282eb0053630050b900522d0282ec0053630053050050c00280e1005", + "0x5042028028363005043005275028028363005028007028028394005028", + "0x1f02802836300532600504002802836300509200506702802836300500b", + "0x536300530c00503102830c00536300530c005092028028363005340005", + "0x50c00280e10053630052d80050920282ee00536300531900504f0282d8", + "0x2d30053630050280230282eb00536300530b00522d0282ec0053630050a9", + "0x504f0280e90053630052d200535b0282d20053630052eb2d300702d028", + "0x53630052ec0050c00280e10053630050e10050920282ee0053630052ee", + "0x3630050280070280e92ec0e12ee00a0050e90053630050e90050840282ec", + "0x509200506702802836300500b005042028028363005043005275028028", + "0xf00504002802836300534000501f028028363005326005040028028363", + "0x503102802836300500c00527502802836300522d00501f028028363005", + "0x282cd0053630050280460282ce0053630050280200282d0005363005316", + "0x50280230282ca0053630052cd2ce00735c0282cd0053630052cd00501b", + "0x2c90053630050f000535b0280f00053630052ca0ec00702d0280ec005363", + "0x70050c00282d00053630052d000509202831700536300531700504f028", + "0x70282c90072d031700a0052c90053630052c9005084028007005363005", + "0x27502802836300532800524202802836300508b005047028028363005028", + "0x2802836300509200506702802836300500b005042028028363005043005", + "0x2836300522d00501f02802836300500f00504002802836300534000501f", + "0x536f00504f0282c600536300532900503102802836300500c005275028", + "0x2800702802839500502804d0282c40053630052c60050920282c5005363", + "0x504202802836300504300527502802836300500c005275028028363005", + "0x4002802836300534000501f02802836300509200506702802836300500b", + "0x2c300536300532d00503102802836300522d00501f02802836300500f005", + "0x2c300509202836f00536300536f00504f0282c200536300532a00535b028", + "0x2c20053630052c20050840280070053630050070050c00282c3005363005", + "0x470280283630050283610280283630050280070282c20072c336f00a005", + "0x2802836300500c00527502802836300500f005040028028363005088005", + "0x2836300509200506702802836300500b005042028028363005043005275", + "0x36300508c00501c02802836300534000501f02802836300522d00501f028", + "0x50920282c500536300534500504f0282c1005363005337005031028028", + "0x280f80053630050283450282be0053630050280200282c40053630052c1", + "0x50280230280fa0053630050f82be00735c0280f80053630050f800501b", + "0x2ba0053630052bb00535b0282bb0053630050fa2bd00702d0282bd005363", + "0x70050c00282c40053630052c40050920282c50053630052c500504f028", + "0x70282ba0072c42c500a0052ba0053630052ba005084028007005363005", + "0x27502802836300500f00504002802836300508100501c028028363005028", + "0x2802836300500b00504202802836300504300527502802836300500c005", + "0x2836300501800506002802836300522d00501f028028363005092005067", + "0x3630050280430280fe0053630050280200280fc005363005079005031028", + "0x280fb0053630050fd0fe00735c0280fd0053630050fd00501b0280fd005", + "0x52b800535b0282b80053630050fb2b900702d0282b9005363005028023", + "0x280fc0053630050fc00509202834500536300534500504f028104005363", + "0x70fc34500a0051040053630051040050840280070053630050070050c0", + "0x36300500c00527502802836300500f005040028028363005028007028104", + "0x509200506702802836300500b005042028028363005018005060028028", + "0x34600503102802836300506f00501c02802836300522d00501f028028363", + "0x10300536300510600509202810500536300507a00504f028106005363005", + "0x4702802836300502836102802836300502800702802839600502804d028", + "0x2802836300500c00527502802836300500f005040028028363005077005", + "0x2836300509200506702802836300500b005042028028363005018005060", + "0x36300501400506002802836300506f00501c02802836300522d00501f028", + "0x509202810500536300505b00504f0282b7005363005006005031028028", + "0x2810c00536300502807a0282b60053630050280200281030053630052b7", + "0x502802302810d00536300510c2b600735c02810c00536300510c00501b", + "0x2500536300510e00535b02810e00536300510d10b00702d02810b005363", + "0x70050c002810300536300510300509202810500536300510500504f028", + "0x702802500710310500a005025005363005025005084028007005363005", + "0x6002802836300500c005275028028363005060005047028028363005028", + "0x2802836300509200506702802836300500b005042028028363005018005", + "0x2836300527700524202802836300501400506002802836300522d00501f", + "0x505b00504f0282b4005363005275005031028028363005010005079028", + "0x2800702802839700502804d0281160053630052b4005092028114005363", + "0x504202802836300501800506002802836300500c005275028028363005", + "0x6002802836300522d00501f02802836300509200506702802836300500b", + "0x115005363005058005031028028363005010005079028028363005014005", + "0x11500509202805b00536300505b00504f02811300536300526c00535b028", + "0x1130053630051130050840280070053630050070050c0028115005363005", + "0x4702802836300502836102802836300502800702811300711505b00a005", + "0x2802836300500c005275028028363005010005079028028363005252005", + "0x2836300509200506702802836300500b005042028028363005018005060", + "0x36300524600501c02802836300501400506002802836300522d00501f028", + "0x509202811400536300503300504f0282b3005363005242005031028028", + "0x2811c00536300502805e0281200053630050280200281160053630052b3", + "0x502802302811b00536300511c12000735c02811c00536300511c00501b", + "0x12400536300512200535b02812200536300511b2b200702d0282b2005363", + "0x70050c002811600536300511600509202811400536300511400504f028", + "0x702812400711611400a005124005363005124005084028007005363005", + "0x27502802836300501000507902802836300521d00501c028028363005028", + "0x2802836300500b00504202802836300501800506002802836300500c005", + "0x28363005030005060028028363005014005060028028363005092005067", + "0x3630050280480282ae0053630050280200282b0005363005036005031028", + "0x282ac0053630052ad2ae00735c0282ad0053630052ad00501b0282ad005", + "0x512900535b0281290053630052ac12700702d028127005363005028023", + "0x282b00053630052b000509202803300536300503300504f028128005363", + "0x72b003300a0051280053630051280050840280070053630050070050c0", + "0x363005030005060028028363005010005079028028363005028007028128", + "0x509200506702802836300500b005042028028363005018005060028028", + "0x36400503102802836300501400506002802836300508400501c028028363", + "0x2a90053630051260050920282ab00536300503c00504f028126005363005", + "0x4702802836300502836102802836300502800702802839800502804d028", + "0x28028363005030005060028028363005010005079028028363005356005", + "0x2836300509200506702802836300500b005042028028363005018005060", + "0x36300504e00506002802836300501400506002802836300508400501c028", + "0x50920282ab00536300536100504f02812f0053630050c0005031028028", + "0x282a800536300502804502812e0053630050280200282a900536300512f", + "0x50280230281340053630052a812e00735c0282a80053630052a800501b", + "0x2a50053630052a700535b0282a700536300513413300702d028133005363", + "0x70050c00282a90053630052a90050920282ab0053630052ab00504f028", + "0x70282a50072a92ab00a0052a50053630052a5005084028007005363005", + "0x60028028363005030005060028028363005010005079028028363005028", + "0x2802836300509200506702802836300500b005042028028363005018005", + "0x2836300503100524202802836300501400506002802836300504e005060", + "0x3630050280460281390053630050280200282a400536300501c005031028", + "0x2813a00536300513b13900735c02813b00536300513b00501b02813b005", + "0x52a300535b0282a300536300513a13800702d028138005363005028023", + "0x282a40053630052a400509202801b00536300501b00504f0282a2005363", + "0x72a401b00a0052a20053630052a20050840280070053630050070050c0", + "0x4f00739900b00a0073630070050280070050280283630050280280282a2", + "0x503100500a02800f00536300500b005031028028363005028007028092", + "0x509202800a00536300500a00504f02802836300502800b028010005363", + "0x2800702801300539a04e1c600736300701000500f02800f00536300500f", + "0x2804d00536300504e00501002801400536300500f005031028028363005", + "0x501400509202801700536300503000504e02803000536300504d0051c6", + "0x283600053630050170050140283610053630051c6005013028018005363", + "0x2801b00536300500f00503102802836300502800702802839b00502804d", + "0x36300501b00509202835f00536300501c00501702801c005363005028030", + "0x1802836000536300535f005014028361005363005013005013028018005", + "0x36300502836102802836300502800702801f00539c35e005363007360005", + "0x707f028020005363005020005092028020005363005018005031028028", + "0x2000503102802836300502800702802300539d35c35d00736300735e00a", + "0x2d00536300502d00509202835d00536300535d00504f02802d005363005", + "0x3102802836300502800702808400539e0c035b00736300736100500f028", + "0x3630051a80051c60281a80053630050c000501002835900536300502d005", + "0x35b00501302835700536300535700501b02802836300502800b028357005", + "0x39f02836300735700534202835900536300535900509202835b005363005", + "0x5028030028356005363005359005031028028363005028007028032005", + "0x2800c005363005356005092028033005363005364005081028364005363", + "0x280283630050280070280283a000502804d02803c00536300503300507d", + "0x5363005028030028036005363005359005031028028363005032005340", + "0x507d02800c00536300503600509202821900536300504000533f028040", + "0x2800702822d0053a122721d00736300735b00500f02803c005363005219", + "0x22700535f02802836300521d00501c028028363005028361028028363005", + "0x503102802836300535c00533d02802836300503c00533e028028363005", + "0x2804800536300502835d02804600536300502802002823100536300500c", + "0x502802302804700536300504804600735c02804800536300504800501b", + "0x24600536300524200535b02824200536300504704500702d028045005363", + "0x70050c002823100536300523100509202835d00536300535d00504f028", + "0x702824600723135d00a005246005363005246005084028007005363005", + "0x2824900536300500c00503102802836300522d00501c028028363005028", + "0x36300524a0051a802824900536300524900509202824a005363005028359", + "0x2800702825224f0073a224c24b00736300724a24935d03135702824a005", + "0x533c02825300536300524c005031028028363005028361028028363005", + "0x25300536300525300509202825800536300502833b02825600536300503c", + "0x25600507d02835c00536300535c0053370280070053630050070050c0028", + "0x4f02805b00905003136300525635c25800725300b08c028256005363005", + "0x280070280590053a305800536300705b00533602824b00536300524b005", + "0x2002805c005363005050005031028028363005058005335028028363005", + "0x36300527500504002827727500736300526c00503602826c005363005028", + "0x522702806000536300505e00521d02805e005363005277005219028028", + "0x536300505c00509202824b00536300524b00504f02805f005363005060", + "0x24b00a00505f00536300505f0050840280090053630050090050c002805c", + "0x535b02805d00536300505000503102802836300502800702805f00905c", + "0x536300505d00509202824b00536300524b00504f0282af005363005059", + "0x24b00a0052af0053630052af0050840280090053630050090050c002805d", + "0x503c00533e0280283630050283610280283630050280070282af00905d", + "0x280200282bc00536300525200503102802836300535c00533d028028363", + "0x2806700536300506700501b028067005363005028046028042005363005", + "0x30606900702d02806900536300502802302830600536300506704200735c", + "0x24f00536300524f00504f02800600536300506800535b028068005363005", + "0x60050840280070053630050070050c00282bc0053630052bc005092028", + "0x8400501c0280283630050280070280060072bc24f00a005006005363005", + "0x2002806f00536300502d00503102802836300535c00533d028028363005", + "0x34700536300534700501b028347005363005028048028071005363005028", + "0x7500702d02807500536300502802302807400536300534707100735c028", + "0x536300535d00504f02834600536300507700535b028077005363005074", + "0x50840280070053630050070050c002806f00536300506f00509202835d", + "0x501c02802836300502800702834600706f35d00a005346005363005346", + "0x4300536300502300504f028345005363005020005031028028363005361", + "0x283630050280070280283a400502804d02807a005363005345005092028", + "0x2836300536100501c02802836300501f005047028028363005028361028", + "0x7900509202804300536300500a00504f028079005363005018005031028", + "0x1b02834200536300502804502807f00536300502802002807a005363005", + "0x36300502802302808100536300534207f00735c028342005363005342005", + "0x2833f00536300534000535b02834000536300508107d00702d02807d005", + "0x50070050c002807a00536300507a00509202804300536300504300504f", + "0x2800702833f00707a04300a00533f00536300533f005084028007005363", + "0x2002833e005363005092005031028028363005031005242028028363005", + "0x33c00536300533c00501b02833c00536300502804602833d005363005028", + "0x33700702d02833700536300502802302833b00536300533c33d00735c028", + "0x536300504f00504f02833600536300508c00535b02808c00536300533b", + "0x50840280070053630050070050c002833e00536300533e00509202804f", + "0x700502802836300502802802833600733e04f00a005336005363005336", + "0x503102802836300502800702809204f0073a500b00a007363007005028", + "0x536300500a00504f02801000536300503100500a02800f00536300500b", + "0x53a604e1c600736300701000500f02800f00536300500f00509202800a", + "0x36300504e00535f0280283630051c600501c028028363005028007028013", + "0x502835d02804d00536300502802002801400536300500f005031028028", + "0x1700536300503004d00735c02803000536300503000501b028030005363", + "0x36100535b02836100536300501701800702d028018005363005028023028", + "0x1400536300501400509202800a00536300500a00504f028360005363005", + "0x1400a00a0053600053630053600050840280070053630050070050c0028", + "0x500f00503102802836300501300501c028028363005028007028360007", + "0x1a802801b00536300501b00509202801c00536300502835902801b005363", + "0x1f0073a735e35f00736300701c01b00a03135702801c00536300501c005", + "0x36300502808a02835d00536300535e005031028028363005028007028020", + "0x2803202802d00536300502833302802300536300535c00533402835c005", + "0x35b00536300535b00503302835d00536300535d00509202835b005363005", + "0x35f00504f02802d00536300502d00501b028023005363005023005088028", + "0x3590313a80840c000736300702d02335b00735d00b00c02835f005363005", + "0xc00050310280c00053630050c00050920280283630050280070283571a8", + "0x33364007363005356005036028356005363005028020028032005363005", + "0x500c00521d02800c005363005033005219028028363005364005040028", + "0x2835f00536300535f00504f02803600536300503c00522702803c005363", + "0x50360050840280840053630050840050c0028032005363005032005092", + "0x535900509202802836300502800702803608403235f00a005036005363", + "0x2d028219005363005028023028040005363005359005031028359005363", + "0x535f00504f02822700536300521d00535b02821d005363005357219007", + "0x281a80053630051a80050c002804000536300504000509202835f005363", + "0x280283630050280070282271a804035f00a005227005363005227005084", + "0x536300502804602823100536300502802002822d005363005020005031", + "0x2302804800536300504623100735c02804600536300504600501b028046", + "0x36300504500535b02804500536300504804700702d028047005363005028", + "0xc002822d00536300522d00509202801f00536300501f00504f028242005", + "0x24200722d01f00a005242005363005242005084028007005363005007005", + "0x5363005092005031028028363005031005242028028363005028007028", + "0x524a00501b02824a005363005028046028249005363005028020028246", + "0x2824c00536300502802302824b00536300524a24900735c02824a005363", + "0x4f00504f02825200536300524f00535b02824f00536300524b24c00702d", + "0x70053630050070050c002824600536300524600509202804f005363005", + "0x2836300502802802825200724604f00a005252005363005252005084028", + "0x2836300502800702809204f0073a900b00a007363007005028007005028", + "0x502800b02801000536300503100500a02800f00536300500b005031028", + "0xf02800f00536300500f00509202800a00536300500a00504f028028363", + "0xf0050310280283630050280070280130053aa04e1c6007363007010005", + "0x3000536300504d0051c602804d00536300504e005010028014005363005", + "0x1c600501302801800536300501400509202801700536300503000504e028", + "0x70280283ab00502804d028360005363005017005014028361005363005", + "0x2801c00536300502803002801b00536300500f005031028028363005028", + "0x501300501302801800536300501b00509202835f00536300501c005017", + "0x3ac35e00536300736000501802836000536300535f005014028361005363", + "0x36300501800503102802836300502836102802836300502800702801f005", + "0x35c35d00736300735e00a007253028020005363005020005092028020005", + "0x2800b02802d0053630050200050310280283630050280070280230053ad", + "0x2802d00536300502d00509202835d00536300535d00504f028028363005", + "0x50310280283630050280070280840053ae0c035b00736300736100500f", + "0x53630051a80051c60281a80053630050c000501002835900536300502d", + "0x501302835600536300535900509202803200536300535700504e028357", + "0x280283af00502804d02803300536300503200501402836400536300535b", + "0x3c00536300502803002800c00536300502d005031028028363005028007", + "0x8400501302835600536300500c00509202803600536300503c005017028", + "0x40005363007033005018028033005363005036005014028364005363005", + "0x509202821d0053630053560050310280283630050280070282190053b0", + "0x70282310053b122d22700736300704035d00707f02821d00536300521d", + "0x22700536300522700504f02804600536300521d005031028028363005028", + "0x450053b204704800736300736400500f028046005363005046005092028", + "0x2802836300504800501c028028363005028361028028363005028007028", + "0x2836300535c00527502802836300522d00533d02802836300504700535f", + "0x36300502835d028246005363005028020028242005363005046005031028", + "0x2824a00536300524924600735c02824900536300524900501b028249005", + "0x524c00535b02824c00536300524a24b00702d02824b005363005028023", + "0x2824200536300524200509202822700536300522700504f02824f005363", + "0x724222700a00524f00536300524f0050840280070053630050070050c0", + "0x36300504600503102802836300504500501c02802836300502800702824f", + "0x51a8028252005363005252005092028253005363005028359028252005", + "0x90500073b3258256007363007253252227031357028253005363005253", + "0x5b005363005258005031028028363005028361028028363005028007028", + "0x50070050c002805b00536300505b00509202805800536300502833b028", + "0x2822d00536300522d00533702835c00536300535c005332028007005363", + "0x536300525600504f02826c05c05903136300522d35c05800705b00b331", + "0x3350280283630050280070282770053b427500536300726c005336028256", + "0x6000536300502802002805e005363005059005031028028363005275005", + "0x5d00521902802836300505f00504002805d05f007363005060005036028", + "0x420053630052bc0052270282bc0053630052af00521d0282af005363005", + "0x5c0050c002805e00536300505e00509202825600536300525600504f028", + "0x702804205c05e25600a00504200536300504200508402805c005363005", + "0x30600536300527700535b028067005363005059005031028028363005028", + "0x5c0050c002806700536300506700509202825600536300525600504f028", + "0x702830605c06725600a00530600536300530600508402805c005363005", + "0x527502802836300522d00533d028028363005028361028028363005028", + "0x2806800536300502802002806900536300500900503102802836300535c", + "0x500606800735c02800600536300500600501b028006005363005028046", + "0x2834700536300506f07100702d02807100536300502802302806f005363", + "0x506900509202805000536300505000504f02807400536300534700535b", + "0x50740053630050740050840280070053630050070050c0028069005363", + "0x501c02802836300502836102802836300502800702807400706905000a", + "0x2807500536300521d00503102802836300535c005275028028363005364", + "0x3b500502804d02834600536300507500509202807700536300523100504f", + "0x28363005219005047028028363005028361028028363005028007028028", + "0x36300535600503102802836300535c00527502802836300536400501c028", + "0x2002834600536300534500509202807700536300535d00504f028345005", + "0x7a00536300507a00501b02807a005363005028048028043005363005028", + "0x7f00702d02807f00536300502802302807900536300507a04300735c028", + "0x536300507700504f02808100536300534200535b028342005363005079", + "0x50840280070053630050070050c0028346005363005346005092028077", + "0x501c02802836300502800702808100734607700a005081005363005081", + "0x34000536300502300504f02807d005363005020005031028028363005361", + "0x283630050280070280283b600502804d02833f00536300507d005092028", + "0x2836300536100501c02802836300501f005047028028363005028361028", + "0x33e00509202834000536300500a00504f02833e005363005018005031028", + "0x1b02833c00536300502804502833d00536300502802002833f005363005", + "0x36300502802302833b00536300533c33d00735c02833c00536300533c005", + "0x2833600536300508c00535b02808c00536300533b33700702d028337005", + "0x50070050c002833f00536300533f00509202834000536300534000504f", + "0x2800702833600733f34000a005336005363005336005084028007005363", + "0x20028335005363005092005031028028363005031005242028028363005", + "0x33400536300533400501b02833400536300502804602808a005363005028", + "0x8800702d02808800536300502802302833300536300533408a00735c028", + "0x536300504f00504f02833100536300533200535b028332005363005333", + "0x50840280070053630050070050c002833500536300533500509202804f", + "0x24c02800b00536300502824c02833100733504f00a005331005363005331", + "0x700502802836300502802802802836300502824f028092005363005028", + "0x503102802836300502800702804e1c60073b701000f007363007005028", + "0x2802836300502800b02801400536300503100500a028013005363005010", + "0x701400500f02801300536300501300509202800f00536300500f00504f", + "0x53630050130050310280283630050280070280170053b803004d007363", + "0x504e0283600053630053610051c6028361005363005030005010028018", + "0x536300504d00501302801c00536300501800509202801b005363005360", + "0x3630050280070280283b900502804d02835e00536300501b00501402835f", + "0x2000501702802000536300502803002801f005363005013005031028028", + "0x35f00536300501700501302801c00536300501f00509202835d005363005", + "0x2835c0053ba04f00536300735e00501802835e00536300535d005014028", + "0x2802300536300501c005031028028363005028361028028363005028007", + "0xf00725302802300536300502300509202804f00536300504f092007252", + "0x50230050310280283630050280070280c00053bb35b02d00736300704f", + "0x2808400536300508400509202802d00536300502d00504f028084005363", + "0x50310280283630050280070283570053bc1a835900736300735f00500f", + "0x36300500a00b00725202800a0053630051a8005010028032005363005084", + "0x35900501302802836300502800b02835600536300500a0051c602800a005", + "0x36400736300735900500f028032005363005032005092028359005363005", + "0x25602803c00536300503200503102802836300502800702800c0053bd033", + "0x36300536400501302804000536300503c005092028036005363005033005", + "0x50280070280283be00502804d02821d005363005036005258028219005", + "0x505002822d005363005028030028227005363005032005031028028363", + "0x536300500c00501302804000536300522700509202823100536300522d", + "0x480053bf04600536300721d00500902821d005363005231005258028219", + "0x47005363005040005031028028363005028361028028363005028007028", + "0x5219005219028242005363005028020028045005363005046005010028", + "0x2802d00536300502d00504f0282490053630050450051c6028246005363", + "0x524200522d02824600536300524600505b028047005363005047005092", + "0x524924224604702d00b05802824900536300524900501b028242005363", + "0x50280070282520053c024f00536300724c00505902824c24b24a031363", + "0x2825825600736300524f00505c02825300536300524b005031028028363", + "0x70280090053c105000536300725800526c028253005363005253005092", + "0x5800536300525600500a02805b005363005253005031028028363005028", + "0x26c0053c205c05900736300705800500f02805b00536300505b005092028", + "0x2836300505c00535f02802836300505900501c028028363005028007028", + "0x36300535b00527502802836300535600501f028028363005050005040028", + "0x502835d02827700536300502802002827500536300505b005031028028", + "0x6000536300505e27700735c02805e00536300505e00501b02805e005363", + "0x5d00535b02805d00536300506005f00702d02805f005363005028023028", + "0x27500536300527500509202824a00536300524a00504f0282af005363005", + "0x27524a00a0052af0053630052af0050840280070053630050070050c0028", + "0x505b00503102802836300526c00501c0280283630050280070282af007", + "0x1a80282bc0053630052bc0050920280420053630050283590282bc005363", + "0x690073c33060670073630070422bc24a031357028042005363005042005", + "0x5050005036028006005363005306005031028028363005028007028068", + "0x2834700536300507100521902802836300506f00504002807106f007363", + "0x536300506700504f02800600536300500600509202802836300502800b", + "0x433453460313c407707507403136300734735635b00700600b277028067", + "0x5363005074005092028028363005077005242028028363005028007028", + "0x502833002807900536300502802002807a005363005074005031028074", + "0x34200536300507f07900735c02807f00536300507f00501b02807f005363", + "0x34200522d02807d0053630050750050c002808100536300507a005092028", + "0x3460050920280283630050280070280283c500502804d028340005363005", + "0x8100536300533f00509202833f005363005346005031028346005363005", + "0x502836102834000536300504300522d02807d0053630053450050c0028", + "0x35b02833d00536300534033e00702d02833e005363005028023028028363", + "0x36300508100509202806700536300506700504f02833c00536300533d005", + "0xa00533c00536300533c00508402807d00536300507d0050c0028081005", + "0x501f02802836300505000504002802836300502800702833c07d081067", + "0x2833b00536300506800503102802836300535b005275028028363005356", + "0x536300508c00501b02808c005363005028046028337005363005028020", + "0x702d02833500536300502802302833600536300508c33700735c02808c", + "0x36300506900504f02833400536300508a00535b02808a005363005336335", + "0x840280070053630050070050c002833b00536300533b005092028069005", + "0x4702802836300502800702833400733b06900a005334005363005334005", + "0x2802836300535600501f028028363005256005242028028363005009005", + "0x36300524a00504f02833300536300525300503102802836300535b005275", + "0x50280070280283c600502804d028332005363005333005092028088005", + "0x24b00503102802836300535600501f02802836300535b005275028028363", + "0x24a00536300524a00504f02833000536300525200535b028331005363005", + "0x3300050840280070053630050070050c0028331005363005331005092028", + "0x502836102802836300502800702833000733124a00a005330005363005", + "0x35b00527502802836300535600501f028028363005048005047028028363", + "0x4f02808600536300504000503102802836300521900501c028028363005", + "0x536300502802002833200536300508600509202808800536300502d005", + "0x8e00735c02836f00536300536f00501b02836f00536300502805e02808e", + "0x536300532d32c00702d02832c00536300502802302832d00536300536f", + "0x509202808800536300508800504f02832a00536300532b00535b02832b", + "0x536300532a0050840280070053630050070050c0028332005363005332", + "0x2836300535700501c02802836300502800702832a00733208800a00532a", + "0x36300508400503102802836300500b00506002802836300535b005275028", + "0x32700501b028327005363005028048028328005363005028020028329005", + "0x8b00536300502802302832600536300532732800735c028327005363005", + "0x504f02832400536300532500535b02832500536300532608b00702d028", + "0x53630050070050c002832900536300532900509202802d00536300502d", + "0x36300502800702832400732902d00a005324005363005324005084028007", + "0x502300503102802836300500b00506002802836300535f00501c028028", + "0x280850053630053230050920283200053630050c000504f028323005363", + "0x50470280283630050283610280283630050280070280283c700502804d", + "0x6002802836300500b00506002802836300535f00501c02802836300535c", + "0x536300500f00504f02809300536300501c005031028028363005092005", + "0x5028045028095005363005028020028085005363005093005092028320", + "0x9800536300531f09500735c02831f00536300531f00501b02831f005363", + "0x9600535b02809600536300509831e00702d02831e005363005028023028", + "0x8500536300508500509202832000536300532000504f02831d005363005", + "0x8532000a00531d00536300531d0050840280070053630050070050c0028", + "0x500b00506002802836300509200506002802836300502800702831d007", + "0x2802002831c00536300504e005031028028363005031005242028028363", + "0x2831900536300531900501b02831900536300502804602831a005363005", + "0x31831700702d02831700536300502802302831800536300531931a00735c", + "0x1c60053630051c600504f02831500536300531600535b028316005363005", + "0x3150050840280070053630050070050c002831c00536300531c005092028", + "0x2824c02800b0053630050282af02831500731c1c600a005315005363005", + "0x2800700502802836300502802802802836300502824f028092005363005", + "0x1000503102802836300502800702804e1c60073c801000f007363007005", + "0x4f02802836300502800b02801400536300503100500a028013005363005", + "0x36300701400500f02801300536300501300509202800f00536300500f005", + "0x180053630050130050310280283630050280070280170053c903004d007", + "0x4d005013028360005363005018005092028361005363005030005256028", + "0x70280283ca00502804d02801c00536300536100525802801b005363005", + "0x2835e00536300502803002835f005363005013005031028028363005028", + "0x501700501302836000536300535f00509202801f00536300535e005050", + "0x3cb02000536300701c00500902801c00536300501f00525802801b005363", + "0x36300536000503102802836300502836102802836300502800702835d005", + "0x2804f00536300504f09200725202804f00536300502000501002835c005", + "0x2300f00708602835c00536300535c00509202802300536300504f0051c6", + "0x36300535c0050310280283630050280070280c00053cc35b02d007363007", + "0x8400509202802d00536300502d00504f02802836300502800b028084005", + "0x50280070283570053cd1a835900736300701b00500f028084005363005", + "0x920283560053630051a8005256028032005363005084005031028028363", + "0x363005356005258028033005363005359005013028364005363005032005", + "0x3630050840050310280283630050280070280283ce00502804d02800c005", + "0x509202804000536300503600505002803600536300502803002803c005", + "0x536300504000525802803300536300535700501302836400536300503c", + "0x3102802836300502800702821d0053cf21900536300700c00500902800c", + "0x536300502802002822d005363005219005010028227005363005364005", + "0x504f02804800536300522d0051c6028046005363005033005219028231", + "0x536300504600505b02822700536300522700509202802d00536300502d", + "0xb05802804800536300504800501b02823100536300523100522d028046", + "0x3d024600536300724200505902824204504703136300504823104622702d", + "0x24600505c02824a005363005045005031028028363005028007028249005", + "0x536300724c00526c02824a00536300524a00509202824c24b007363005", + "0xa02825200536300524a00503102802836300502800702824f0053d100a", + "0x536300500a00b0072bc02802836300502800b02825300536300524b005", + "0x53d225825600736300725300500f02825200536300525200509202800a", + "0x5258005256028009005363005252005031028028363005028007028050", + "0x2805900536300525600501302805800536300500900509202805b005363", + "0x280283630050280070280283d300502804d02805c00536300505b005258", + "0x36300527500505002827500536300502803002826c005363005252005031", + "0x25802805900536300505000501302805800536300526c005092028277005", + "0x280070280600053d405e00536300705c00500902805c005363005277005", + "0x501002805f005363005058005031028028363005028361028028363005", + "0x2bc0053630050590052190282af00536300502802002805d00536300505e", + "0x5f00509202804700536300504700504f02804200536300505d0051c6028", + "0x2af0053630052af00522d0282bc0053630052bc00505b02805f005363005", + "0x670313630050422af2bc05f04700b05802804200536300504200501b028", + "0x280283630050280070280060053d5068005363007069005059028069306", + "0x6f00509202834707100736300506800505c02806f005363005306005031", + "0x3630050280070280750053d607400536300734700526c02806f005363005", + "0x509202834600536300507100500a02807700536300506f005031028028", + "0x2800702807a0053d704334500736300734600500f028077005363005077", + "0x504002802836300504300535f02802836300534500501c028028363005", + "0x3102802836300507400504002802836300535b00508e02802836300500a", + "0x34200536300502835d02807f005363005028020028079005363005077005", + "0x2802302808100536300534207f00735c02834200536300534200501b028", + "0x536300534000535b02834000536300508107d00702d02807d005363005", + "0x50c002807900536300507900509202806700536300506700504f02833f", + "0x2833f00707906700a00533f00536300533f005084028007005363005007", + "0x33e00536300507700503102802836300507a00501c028028363005028007", + "0x533d0051a802833e00536300533e00509202833d005363005028359028", + "0x702808c3370073d833b33c00736300733d33e06703135702833d005363", + "0x2833500536300502836f02833600536300533b005031028028363005028", + "0x535b00532d02802836300508a00504002833408a007363005074005036", + "0x33133200736300500a00503602802836300533300508e028088333007363", + "0x533600509202833c00536300533c00504f028028363005332005040028", + "0x2833500536300533500532c0280070053630050070050c0028336005363", + "0x533100501302808800536300508800532c028334005363005334005013", + "0x36f08e08633000a36300533108833433500733633c09232b028331005363", + "0x532902802836300502800702832c0053d932d00536300736f00532a028", + "0x2832a00536300502802002832b00536300508600503102802836300532d", + "0x532800521902802836300532900504002832832900736300532a005036", + "0x2808b00536300532600522702832600536300532700521d028327005363", + "0x508e0050c002832b00536300532b00509202833000536300533000504f", + "0x2800702808b08e32b33000a00508b00536300508b00508402808e005363", + "0x2832400536300532c00535b028325005363005086005031028028363005", + "0x508e0050c002832500536300532500509202833000536300533000504f", + "0x2800702832408e32533000a00532400536300532400508402808e005363", + "0x504002802836300535b00508e02802836300500a005040028028363005", + "0x2832000536300502802002832300536300508c005031028028363005074", + "0x508532000735c02808500536300508500501b028085005363005028046", + "0x2831f00536300509309500702d028095005363005028023028093005363", + "0x532300509202833700536300533700504f02809800536300531f00535b", + "0x50980053630050980050840280070053630050070050c0028323005363", + "0x24202802836300507500504702802836300502800702809800732333700a", + "0x2802836300535b00508e02802836300500a005040028028363005071005", + "0x531e00509202809600536300506700504f02831e00536300506f005031", + "0x500a0050400280283630050280070280283da00502804d02831d005363", + "0x535b02831c00536300530600503102802836300535b00508e028028363", + "0x536300531c00509202806700536300506700504f02831a005363005006", + "0x6700a00531a00536300531a0050840280070053630050070050c002831c", + "0x506000504702802836300502836102802836300502800702831a00731c", + "0x5900501c02802836300535b00508e02802836300500a005040028028363", + "0x2809600536300504700504f028319005363005058005031028028363005", + "0x536300502805e02831800536300502802002831d005363005319005092", + "0x2302831600536300531731800735c02831700536300531700501b028317", + "0x36300531400535b02831400536300531631500702d028315005363005028", + "0xc002831d00536300531d00509202809600536300509600504f028313005", + "0x31300731d09600a005313005363005313005084028007005363005007005", + "0x2836300535b00508e02802836300524f005047028028363005028007028", + "0x36300524a00503102802836300500b00507902802836300524b005242028", + "0x4d02830f00536300531200509202831100536300504700504f028312005", + "0x507902802836300535b00508e0280283630050280070280283db005028", + "0x30c00536300524900535b02830e00536300504500503102802836300500b", + "0x70050c002830e00536300530e00509202804700536300504700504f028", + "0x702830c00730e04700a00530c00536300530c005084028007005363005", + "0x507902802836300521d005047028028363005028361028028363005028", + "0x3102802836300503300501c02802836300535b00508e02802836300500b", + "0x3630050a900509202831100536300502d00504f0280a9005363005364005", + "0xb000501b0280b000536300502804802830b00536300502802002830f005", + "0x30a0053630050280230280ac0053630050b030b00735c0280b0005363005", + "0x504f0280b400536300530800535b0283080053630050ac30a00702d028", + "0x53630050070050c002830f00536300530f005092028311005363005311", + "0x3630050280070280b400730f31100a0050b40053630050b4005084028007", + "0x535c00503102802836300501b00501c02802836300500b005079028028", + "0x280b90053630050b60050920283050053630050c000504f0280b6005363", + "0x50470280283630050283610280283630050280070280283dc00502804d", + "0x6002802836300501b00501c02802836300500b00507902802836300535d", + "0x536300500f00504f028303005363005360005031028028363005092005", + "0x50280450283020053630050280200280b9005363005303005092028305", + "0x30000536300530130200735c02830100536300530100501b028301005363", + "0x2fe00535b0282fe0053630053002ff00702d0282ff005363005028023028", + "0xb90053630050b900509202830500536300530500504f0280bf005363005", + "0xb930500a0050bf0053630050bf0050840280070053630050070050c0028", + "0x509200506002802836300500b0050790280283630050280070280bf007", + "0x280200282fd00536300504e005031028028363005031005242028028363", + "0x282fb0053630052fb00501b0282fb0053630050280460282fc005363005", + "0x5138b00702d02838b0053630050280230280510053630052fb2fc00735c", + "0x1c60053630051c600504f02838d00536300538c00535b02838c005363005", + "0x38d0050840280070053630050070050c00282fd0053630052fd005092028", + "0x2800700502802836300502802802838d0072fd1c600a00538d005363005", + "0xb00503102802836300502800702809204f0073dd00b00a007363007005", + "0x4f02802836300502800b02801000536300503100500a02800f005363005", + "0x36300701000500f02800f00536300500f00509202800a00536300500a005", + "0x1400536300500f0050310280283630050280070280130053de04e1c6007", + "0x3000504e02803000536300504d0051c602804d00536300504e005010028", + "0x3610053630051c6005013028018005363005014005092028017005363005", + "0x283630050280070280283df00502804d028360005363005017005014028", + "0x501c00501702801c00536300502803002801b00536300500f005031028", + "0x2836100536300501300501302801800536300501b00509202835f005363", + "0x702801f0053e035e00536300736000501802836000536300535f005014", + "0x92028020005363005018005031028028363005028361028028363005028", + "0x280230053e135c35d00736300735e00a007253028020005363005020005", + "0x2802836300502800b02802d005363005020005031028028363005028007", + "0x736100500f02802d00536300502d00509202835d00536300535d00504f", + "0x536300502d0050310280283630050280070280840053e20c035b007363", + "0x504e0283570053630051a80051c60281a80053630050c0005010028359", + "0x536300535b005013028356005363005359005092028032005363005357", + "0x3630050280070280283e300502804d028033005363005032005014028364", + "0x3c00501702803c00536300502803002800c00536300502d005031028028", + "0x36400536300508400501302835600536300500c005092028036005363005", + "0x282190053e4040005363007033005018028033005363005036005014028", + "0x536300521d00509202821d005363005356005031028028363005028007", + "0x283630050280070282310053e522d22700736300704035d00707f02821d", + "0x4600509202822700536300522700504f02804600536300521d005031028", + "0x50280070280450053e604704800736300736400500f028046005363005", + "0x504700535f02802836300504800501c028028363005028361028028363", + "0x4600503102802836300535c00527502802836300522d00533d028028363", + "0x1b02824900536300502835d028246005363005028020028242005363005", + "0x36300502802302824a00536300524924600735c028249005363005249005", + "0x2824f00536300524c00535b02824c00536300524a24b00702d02824b005", + "0x50070050c002824200536300524200509202822700536300522700504f", + "0x2800702824f00724222700a00524f00536300524f005084028007005363", + "0x35902825200536300504600503102802836300504500501c028028363005", + "0x53630052530051a8028252005363005252005092028253005363005028", + "0x50280070280090500073e7258256007363007253252227031357028253", + "0x4f02805b00536300505b00509202805b005363005258005031028028363", + "0x313e805c05905803136300735c00705b031328028256005363005256005", + "0x503102805800536300505800509202802836300502800702827727526c", + "0x536300522d00532702806000536300505c00532702805e005363005058", + "0x1b02805d00536300505f06000732602806000536300506000501b02805f", + "0x36300505e0050920280590053630050590050c002805d00536300505d005", + "0x3610280283630050280070282af0053e902836300705d00534202805e005", + "0x280420053630050280200282bc00536300505e005031028028363005028", + "0x5306005219028028363005067005040028306067007363005042005036", + "0x2800600536300506800522702806800536300506900521d028069005363", + "0x50590050c00282bc0053630052bc00509202825600536300525600504f", + "0x280070280060592bc25600a005006005363005006005084028059005363", + "0x2002806f00536300505e0050310280283630052af005340028028363005", + "0x34700536300534700501b02834700536300502808b028071005363005028", + "0x50c002807500536300506f00509202807400536300534707100735c028", + "0x280283ea00502804d02834600536300507400522d028077005363005059", + "0x26c00536300526c00509202802836300522d00533d028028363005028007", + "0x2750050c002807500536300534500509202834500536300526c005031028", + "0x2302802836300502836102834600536300527700522d028077005363005", + "0x36300507a00535b02807a00536300534604300702d028043005363005028", + "0xc002807500536300507500509202825600536300525600504f028079005", + "0x7907707525600a005079005363005079005084028077005363005077005", + "0x2802836300522d00533d028028363005028361028028363005028007028", + "0x536300502802002807f00536300500900503102802836300535c005275", + "0x34200735c02808100536300508100501b028081005363005028046028342", + "0x536300507d34000702d02834000536300502802302807d005363005081", + "0x509202805000536300505000504f02833e00536300533f00535b02833f", + "0x536300533e0050840280070053630050070050c002807f00536300507f", + "0x2802836300502836102802836300502800702833e00707f05000a00533e", + "0x536300521d00503102802836300535c00527502802836300536400501c", + "0x2804d02833b00536300533d00509202833c00536300523100504f02833d", + "0x52190050470280283630050283610280283630050280070280283eb005", + "0x35600503102802836300535c00527502802836300536400501c028028363", + "0x33b00536300533700509202833c00536300535d00504f028337005363005", + "0x36300533600501b02833600536300502804802808c005363005028020028", + "0x2d02808a00536300502802302833500536300533608c00735c028336005", + "0x533c00504f02833300536300533400535b02833400536300533508a007", + "0x280070053630050070050c002833b00536300533b00509202833c005363", + "0x2802836300502800702833300733b33c00a005333005363005333005084", + "0x36300502300504f02808800536300502000503102802836300536100501c", + "0x50280070280283ec00502804d028331005363005088005092028332005", + "0x536100501c02802836300501f005047028028363005028361028028363", + "0x9202833200536300500a00504f028330005363005018005031028028363", + "0x8e005363005028045028086005363005028020028331005363005330005", + "0x2802302836f00536300508e08600735c02808e00536300508e00501b028", + "0x536300532c00535b02832c00536300536f32d00702d02832d005363005", + "0x50c002833100536300533100509202833200536300533200504f02832b", + "0x2832b00733133200a00532b00536300532b005084028007005363005007", + "0x32a005363005092005031028028363005031005242028028363005028007", + "0x36300532800501b028328005363005028046028329005363005028020028", + "0x2d02832600536300502802302832700536300532832900735c028328005", + "0x504f00504f02832500536300508b00535b02808b005363005327326007", + "0x280070053630050070050c002832a00536300532a00509202804f005363", + "0x2802836300502802802832500732a04f00a005325005363005325005084", + "0x2802836300502800702809204f0073ed00b00a007363007005028007005", + "0x36300502800b02801000536300503100500a02800f00536300500b005031", + "0x500f02800f00536300500f00509202800a00536300500a00504f028028", + "0x500f0050310280283630050280070280130053ee04e1c6007363007010", + "0x2803000536300501400509202804d00536300504e005256028014005363", + "0x3ef00502804d02801800536300504d0052580280170053630051c6005013", + "0x36300502803002836100536300500f005031028028363005028007028028", + "0x1302803000536300536100509202801b005363005360005050028360005", + "0x36300701800500902801800536300501b005258028017005363005013005", + "0x503102802836300502836102802836300502800702835f0053f001c005", + "0x536300501f0051c602801f00536300501c00501002835e005363005030", + "0x708602835e00536300535e00509202802000536300502000501b028020", + "0x35e0050310280283630050280070280230053f135c35d00736300702000a", + "0x2d00536300502d00509202835d00536300535d00504f02802d005363005", + "0x1c0280283630050280070280840053f20c035b00736300701700500f028", + "0x2802836300535c00508e0280283630050c000535f02802836300535b005", + "0x536300502835d0281a800536300502802002835900536300502d005031", + "0x230280320053630053571a800735c02835700536300535700501b028357", + "0x36300536400535b02836400536300503235600702d028356005363005028", + "0xc002835900536300535900509202835d00536300535d00504f028033005", + "0x3300735935d00a005033005363005033005084028007005363005007005", + "0x536300502d00503102802836300508400501c028028363005028007028", + "0x3c0051a802800c00536300500c00509202803c00536300502835902800c", + "0x2821d2190073f304003600736300703c00c35d03135702803c005363005", + "0x5363005227005092028227005363005040005031028028363005028007", + "0x23122d03136300735c00722703132502803600536300503600504f028227", + "0x22d00536300522d0050920280283630050280070280450470480313f4046", + "0x504600501b02824600536300502802002824200536300522d005031028", + "0x24a00736300524900503602824900536300504624600735c028046005363", + "0x24c00521d02824c00536300524b00521902802836300524a00504002824b", + "0x3600536300503600504f02825200536300524f00522702824f005363005", + "0x2520050840282310053630052310050c0028242005363005242005092028", + "0x4800509202802836300502800702825223124203600a005252005363005", + "0x28256005363005028023028253005363005048005031028048005363005", + "0x3600504f02805000536300525800535b02825800536300504525600702d", + "0x470053630050470050c0028253005363005253005092028036005363005", + "0x2836300502800702805004725303600a005050005363005050005084028", + "0x36300502802002800900536300521d00503102802836300535c00508e028", + "0x735c02805800536300505800501b02805800536300502804602805b005", + "0x36300505905c00702d02805c00536300502802302805900536300505805b", + "0x9202821900536300521900504f02827500536300526c00535b02826c005", + "0x3630052750050840280070053630050070050c0028009005363005009005", + "0x36300501700501c02802836300502800702827500700921900a005275005", + "0x509202805e00536300502300504f02827700536300535e005031028028", + "0x283610280283630050280070280283f500502804d028060005363005277", + "0x503102802836300501700501c02802836300535f005047028028363005", + "0x536300505f00509202805e00536300500a00504f02805f005363005030", + "0x52af00501b0282af00536300502804502805d005363005028020028060", + "0x280420053630050280230282bc0053630052af05d00735c0282af005363", + "0x5e00504f02830600536300506700535b0280670053630052bc04200702d", + "0x70053630050070050c002806000536300506000509202805e005363005", + "0x2836300502800702830600706005e00a005306005363005306005084028", + "0x363005028020028069005363005092005031028028363005031005242028", + "0x735c02800600536300500600501b028006005363005028046028068005", + "0x36300506f07100702d02807100536300502802302806f005363005006068", + "0x9202804f00536300504f00504f02807400536300534700535b028347005", + "0x3630050740050840280070053630050070050c0028069005363005069005", + "0x36300502824f02800b00536300502832402807400706904f00a005074005", + "0xf0073f609204f007363007005028007005028028363005028028028028", + "0x504f00504f0281c6005363005092005031028028363005028007028010", + "0x4e03136300503104f00732302803100536300503100505b02804f005363", + "0x53f700a0053630070140053200281c60053630051c6005092028014013", + "0x504e00504f0280300053630051c600503102802836300502800702804d", + "0x2801300536300501300505b02803000536300503000509202804e005363", + "0x36101801703136300501303004e03109302800a00536300500a00b007085", + "0x503102802836300502800702801b0053f8360005363007361005095028", + "0x36300501c00509202835e35f00736300536000531f02801c005363005018", + "0x280283630050280070280200053f901f00536300735e00509802801c005", + "0x535d00509202835c00536300535f00500a02835d00536300501c005031", + "0x36300502800702835b0053fa02d02300736300735c00500f02835d005363", + "0x501302808400536300502d0050100280c000536300535d005031028028", + "0x536300508400501b0280c00053630050c0005092028023005363005023", + "0x280283630050280070283570053fb1a835900736300702300500f028084", + "0x53590050130283560053630051a80050100280320053630050c0005031", + "0x2835600536300535600501b028032005363005032005092028359005363", + "0x503102802836300502800702800c0053fc03336400736300735900500f", + "0x536300536400501302803600536300503300501002803c005363005032", + "0x500f02803600536300503600501b02803c00536300503c005092028364", + "0x504000501c02802836300502800702821d0053fd219040007363007364", + "0x3600501f02802836300508400501f02802836300521900535f028028363", + "0x509602802836300501f00531e02802836300535600501f028028363005", + "0x2822d00536300502802002822700536300503c00503102802836300500a", + "0x523122d00735c02823100536300523100501b02823100536300502835d", + "0x2804700536300504604800702d028048005363005028023028046005363", + "0x522700509202801700536300501700504f02804500536300504700535b", + "0x50450053630050450050840280070053630050070050c0028227005363", + "0x3102802836300521d00501c02802836300502800702804500722701700a", + "0x536300524200509202824600536300502835902824200536300503c005", + "0x24a2490073630072462420170313570282460053630052460051a8028242", + "0x1c602824f00536300524a00503102802836300502800702824c24b0073fe", + "0x3630050360051c60282530053630053560051c6028252005363005084005", + "0x31c02800905000736300525800531d02825800536300502833b028256005", + "0x536300524f00509202824900536300524900504f028028363005050005", + "0x531902800a00536300500a00531a0280070053630050070050c002824f", + "0x536300525300501b02825200536300525200501b02801f00536300501f", + "0x25325201f00a00900724f24901031802825600536300525600501b028253", + "0x282750053ff26c00536300705c00531702805c05905805b00a363005256", + "0x27700536300505800503102802836300526c005316028028363005028007", + "0x6000504002805f06000736300505e00503602805e005363005028020028", + "0x282af00536300505d00521d02805d00536300505f005219028028363005", + "0x527700509202805b00536300505b00504f0282bc0053630052af005227", + "0x52bc0053630052bc0050840280590053630050590050c0028277005363", + "0x280420053630050580050310280283630050280070282bc05927705b00a", + "0x504200509202805b00536300505b00504f02806700536300527500535b", + "0x50670053630050670050840280590053630050590050c0028042005363", + "0x1f02802836300508400501f02802836300502800702806705904205b00a", + "0x2802836300501f00531e02802836300535600501f028028363005036005", + "0x536300502802002830600536300524c00503102802836300500a005096", + "0x6900735c02806800536300506800501b028068005363005028046028069", + "0x536300500606f00702d02806f005363005028023028006005363005068", + "0x509202824b00536300524b00504f02834700536300507100535b028071", + "0x53630053470050840280070053630050070050c0028306005363005306", + "0x2836300500c00501c02802836300502800702834700730624b00a005347", + "0x36300535600501f02802836300508400501f02802836300500a005096028", + "0x502802002807400536300503200503102802836300501f00531e028028", + "0x35c02807700536300507700501b028077005363005028043028075005363", + "0x534634500702d028345005363005028023028346005363005077075007", + "0x2801700536300501700504f02807a00536300504300535b028043005363", + "0x507a0050840280070053630050070050c0028074005363005074005092", + "0x535700501c02802836300502800702807a00707401700a00507a005363", + "0x1f00531e02802836300508400501f02802836300500a005096028028363", + "0x7a02807f0053630050280200280790053630050c0005031028028363005", + "0x36300534207f00735c02834200536300534200501b028342005363005028", + "0x35b02834000536300508107d00702d02807d005363005028023028081005", + "0x36300507900509202801700536300501700504f02833f005363005340005", + "0xa00533f00536300533f0050840280070053630050070050c0028079005", + "0x509602802836300535b00501c02802836300502800702833f007079017", + "0x2833e00536300535d00503102802836300501f00531e02802836300500a", + "0x536300533c00501b02833c00536300502805e02833d005363005028020", + "0x702d02833700536300502802302833b00536300533c33d00735c02833c", + "0x36300501700504f02833600536300508c00535b02808c00536300533b337", + "0x840280070053630050070050c002833e00536300533e005092028017005", + "0x4702802836300502800702833600733e01700a005336005363005336005", + "0x2802836300535f00524202802836300500a005096028028363005020005", + "0x536300502804802808a00536300502802002833500536300501c005031", + "0x2302833300536300533408a00735c02833400536300533400501b028334", + "0x36300533200535b02833200536300533308800702d028088005363005028", + "0xc002833500536300533500509202801700536300501700504f028331005", + "0x33100733501700a005331005363005331005084028007005363005007005", + "0x536300501800503102802836300500a005096028028363005028007028", + "0x509202801700536300501700504f02808600536300501b00535b028330", + "0x53630050860050840280070053630050070050c0028330005363005330", + "0x2836300504d00504702802836300502800702808600733001700a005086", + "0x3630051c600503102802836300500b005315028028363005013005242028", + "0x32d00501b02832d00536300502804502836f00536300502802002808e005", + "0x32b00536300502802302832c00536300532d36f00735c02832d005363005", + "0x504f02832900536300532a00535b02832a00536300532c32b00702d028", + "0x53630050070050c002808e00536300508e00509202804e00536300504e", + "0x36300502800702832900708e04e00a005329005363005329005084028007", + "0x501000503102802836300500b005315028028363005031005242028028", + "0x501b028326005363005028046028327005363005028020028328005363", + "0x536300502802302808b00536300532632700735c028326005363005326", + "0x4f02832300536300532400535b02832400536300508b32500702d028325", + "0x3630050070050c002832800536300532800509202800f00536300500f005", + "0x502824c02832300732800f00a005323005363005323005084028007005", + "0x502802802802836300502824f02809200536300502824c02800b005363", + "0x502800702804e1c600740001000f007363007005028007005028028363", + "0xb02801400536300503100500a028013005363005010005031028028363", + "0x1300536300501300509202800f00536300500f00504f028028363005028", + "0x3102802836300502800702801700540103004d00736300701400500f028", + "0x3630053610051c6028361005363005030005010028018005363005013005", + "0x1302801c00536300501800509202801b00536300536000504e028360005", + "0x2840200502804d02835e00536300501b00501402835f00536300504d005", + "0x536300502803002801f005363005013005031028028363005028007028", + "0x501302801c00536300501f00509202835d005363005020005017028020", + "0x536300735e00501802835e00536300535d00501402835f005363005017", + "0x1c00503102802836300502836102802836300502800702835c00540304f", + "0x536300502300509202804f00536300504f092007252028023005363005", + "0x283630050280070280c000540435b02d00736300704f00f00707f028023", + "0x8400509202802d00536300502d00504f028084005363005023005031028", + "0x50280070283570054051a835900736300735f00500f028084005363005", + "0x25202800a0053630051a8005010028032005363005084005031028028363", + "0x36300502800b02835600536300500a0051c602800a00536300500a00b007", + "0x500f028032005363005032005092028359005363005359005013028028", + "0x503200503102802836300502800702800c005406033364007363007359", + "0x2804000536300503c00509202803600536300503300525602803c005363", + "0x40700502804d02821d005363005036005258028219005363005364005013", + "0x363005028030028227005363005032005031028028363005028007028028", + "0x1302804000536300522700509202823100536300522d00505002822d005", + "0x36300721d00500902821d00536300523100525802821900536300500c005", + "0x5031028028363005028361028028363005028007028048005408046005", + "0x242005363005028020028045005363005046005010028047005363005040", + "0x2d00504f0282490053630050450051c6028246005363005219005219028", + "0x24600536300524600505b02804700536300504700509202802d005363005", + "0x2d00b05802824900536300524900501b02824200536300524200522d028", + "0x540924f00536300724c00505902824c24b24a031363005249242246047", + "0x524f00505c02825300536300524b005031028028363005028007028252", + "0x5000536300725800526c028253005363005253005092028258256007363", + "0x500a02805b00536300525300503102802836300502800702800900540a", + "0x736300705800500f02805b00536300505b005092028058005363005256", + "0x35f02802836300505900501c02802836300502800702826c00540b05c059", + "0x2802836300535600501f02802836300505000504002802836300505c005", + "0x536300502802002827500536300505b00503102802836300535b00533d", + "0x27700735c02805e00536300505e00501b02805e00536300502835d028277", + "0x536300506005f00702d02805f00536300502802302806000536300505e", + "0x509202824a00536300524a00504f0282af00536300505d00535b02805d", + "0x53630052af0050840280070053630050070050c0028275005363005275", + "0x2836300526c00501c0280283630050280070282af00727524a00a0052af", + "0x52bc0050920280420053630050283590282bc00536300505b005031028", + "0x73630070422bc24a0313570280420053630050420051a80282bc005363", + "0x600536300530600503102802836300502800702806806900740c306067", + "0x7100521902802836300506f00504002807106f007363005050005036028", + "0x6700536300506700504f028006005363005006005092028347005363005", + "0x2804334534603140d07707507403136300734735635b00700600b314028", + "0x5363005074005031028074005363005074005092028028363005028007", + "0x504f02807f00536300507900522702807900536300507700521d02807a", + "0x53630050750050c002807a00536300507a005092028067005363005067", + "0x36300502800702807f07507a06700a00507f00536300507f005084028075", + "0x28023028342005363005346005031028346005363005346005092028028", + "0x536300507d00535b02807d00536300504308100702d028081005363005", + "0x50c002834200536300534200509202806700536300506700504f028340", + "0x2834034534206700a005340005363005340005084028345005363005345", + "0x2802836300535600501f028028363005050005040028028363005028007", + "0x536300502802002833f00536300506800503102802836300535b00533d", + "0x33e00735c02833d00536300533d00501b02833d00536300502804602833e", + "0x536300533c33b00702d02833b00536300502802302833c00536300533d", + "0x509202806900536300506900504f02808c00536300533700535b028337", + "0x536300508c0050840280070053630050070050c002833f00536300533f", + "0x2836300500900504702802836300502800702808c00733f06900a00508c", + "0x36300535b00533d02802836300535600501f028028363005256005242028", + "0x509202833500536300524a00504f028336005363005253005031028028", + "0x533d02802836300502800702802840e00502804d02808a005363005336", + "0x2833400536300524b00503102802836300535600501f02802836300535b", + "0x533400509202824a00536300524a00504f02833300536300525200535b", + "0x53330053630053330050840280070053630050070050c0028334005363", + "0x504702802836300502836102802836300502800702833300733424a00a", + "0x1c02802836300535b00533d02802836300535600501f028028363005048", + "0x536300502d00504f028088005363005040005031028028363005219005", + "0x502805e02833200536300502802002808a005363005088005092028335", + "0x33000536300533133200735c02833100536300533100501b028331005363", + "0x8e00535b02808e00536300533008600702d028086005363005028023028", + "0x8a00536300508a00509202833500536300533500504f02836f005363005", + "0x8a33500a00536f00536300536f0050840280070053630050070050c0028", + "0x535b00533d02802836300535700501c02802836300502800702836f007", + "0x2802002832d00536300508400503102802836300500b005060028028363", + "0x2832b00536300532b00501b02832b00536300502804802832c005363005", + "0x32a32900702d02832900536300502802302832a00536300532b32c00735c", + "0x2d00536300502d00504f02832700536300532800535b028328005363005", + "0x3270050840280070053630050070050c002832d00536300532d005092028", + "0x35f00501c02802836300502800702832700732d02d00a005327005363005", + "0x4f02832600536300502300503102802836300500b005060028028363005", + "0x2840f00502804d02832500536300532600509202808b0053630050c0005", + "0x2802836300535c005047028028363005028361028028363005028007028", + "0x2836300509200506002802836300500b00506002802836300535f00501c", + "0x32400509202808b00536300500f00504f02832400536300501c005031028", + "0x1b028320005363005028045028323005363005028020028325005363005", + "0x36300502802302808500536300532032300735c028320005363005320005", + "0x2831f00536300509500535b02809500536300508509300702d028093005", + "0x50070050c002832500536300532500509202808b00536300508b00504f", + "0x2800702831f00732508b00a00531f00536300531f005084028007005363", + "0x524202802836300500b005060028028363005092005060028028363005", + "0x2831e00536300502802002809800536300504e005031028028363005031", + "0x509631e00735c02809600536300509600501b028096005363005028046", + "0x2831a00536300531d31c00702d02831c00536300502802302831d005363", + "0x50980050920281c60053630051c600504f02831900536300531a00535b", + "0x53190053630053190050840280070053630050070050c0028098005363", + "0xa0073630070050280070050280283630050280280283190070981c600a", + "0x2800f00536300500b00503102802836300502800702809204f00741000b", + "0x536300500a00504f02802836300502800b02801000536300503100500a", + "0x541104e1c600736300701000500f02800f00536300500f00509202800a", + "0x504e00501002801400536300500f005031028028363005028007028013", + "0x2801700536300503000504e02803000536300504d0051c602804d005363", + "0x50170050140283610053630051c6005013028018005363005014005092", + "0x500f00503102802836300502800702802841200502804d028360005363", + "0x9202835f00536300501c00501702801c00536300502803002801b005363", + "0x36300535f00501402836100536300501300501302801800536300501b005", + "0x2802836300502800702801f00541335e005363007360005018028360005", + "0x5363005020005092028020005363005018005031028028363005028361", + "0x2836300502800702802300541435c35d00736300735e00a00707f028020", + "0x2d00509202835d00536300535d00504f02802d005363005020005031028", + "0x50280070280840054150c035b00736300736100500f02802d005363005", + "0x130281a80053630050c000501002835900536300502d005031028028363", + "0x3630051a800501b02835900536300535900509202835b00536300535b005", + "0x2836300502800702835600541603235700736300735b00500f0281a8005", + "0x357005013028033005363005032005010028364005363005359005031028", + "0x3300536300503300501b028364005363005364005092028357005363005", + "0x3102802836300502800702803600541703c00c00736300735700500f028", + "0x36300500c00501302821900536300503c005010028040005363005364005", + "0xf02821900536300521900501b02804000536300504000509202800c005", + "0x4000503102802836300502800702822d00541822721d00736300700c005", + "0x21d00536300521d005013028046005363005227005010028231005363005", + "0x21d00500f02804600536300504600501b028231005363005231005092028", + "0x36300504800501c028028363005028007028045005419047048007363007", + "0x504600501f0280283630051a800501f02802836300504700535f028028", + "0x35c00533d02802836300503300501f02802836300521900501f028028363", + "0x35d028246005363005028020028242005363005231005031028028363005", + "0x36300524924600735c02824900536300524900501b028249005363005028", + "0x35b02824c00536300524a24b00702d02824b00536300502802302824a005", + "0x36300524200509202835d00536300535d00504f02824f00536300524c005", + "0xa00524f00536300524f0050840280070053630050070050c0028242005", + "0x503102802836300504500501c02802836300502800702824f00724235d", + "0x252005363005252005092028253005363005028359028252005363005231", + "0x41a25825600736300725325235d0313570282530053630052530051a8028", + "0x51c602805b005363005258005031028028363005028007028009050007", + "0x53630052190051c60280590053630050330051c60280580053630051a8", + "0x27500531d02827500536300502833b02826c0053630050460051c602805c", + "0x5b00536300505b00509202802836300527700531c02805e277007363005", + "0x5800501b02835c00536300535c0053370280070053630050070050c0028", + "0x5c00536300505c00501b02805900536300505900501b028058005363005", + "0x526c05c05905835c05e00705b00f31302826c00536300526c00501b028", + "0x536300506000509202825600536300525600504f02805d05f060031363", + "0x25600a00505d00536300505d00508402805f00536300505f0050c0028060", + "0x4600501f0280283630051a800501f02802836300502800702805d05f060", + "0x533d02802836300503300501f02802836300521900501f028028363005", + "0x282bc0053630050280200282af00536300500900503102802836300535c", + "0x50422bc00735c02804200536300504200501b028042005363005028046", + "0x2806900536300506730600702d028306005363005028023028067005363", + "0x52af00509202805000536300505000504f02806800536300506900535b", + "0x50680053630050680050840280070053630050070050c00282af005363", + "0x33d02802836300522d00501c0280283630050280070280680072af05000a", + "0x2802836300521900501f0280283630051a800501f02802836300535c005", + "0x536300502802002800600536300504000503102802836300503300501f", + "0x6f00735c02807100536300507100501b02807100536300502804302806f", + "0x536300534707400702d028074005363005028023028347005363005071", + "0x509202835d00536300535d00504f02807700536300507500535b028075", + "0x53630050770050840280070053630050070050c0028006005363005006", + "0x2836300503600501c02802836300502800702807700700635d00a005077", + "0x36300503300501f0280283630051a800501f02802836300535c00533d028", + "0x502807a028345005363005028020028346005363005364005031028028", + "0x7a00536300504334500735c02804300536300504300501b028043005363", + "0x7f00535b02807f00536300507a07900702d028079005363005028023028", + "0x34600536300534600509202835d00536300535d00504f028342005363005", + "0x34635d00a0053420053630053420050840280070053630050070050c0028", + "0x535c00533d02802836300535600501c028028363005028007028342007", + "0x280200280810053630053590050310280283630051a800501f028028363", + "0x2834000536300534000501b02834000536300502805e02807d005363005", + "0x33f33e00702d02833e00536300502802302833f00536300534007d00735c", + "0x35d00536300535d00504f02833c00536300533d00535b02833d005363005", + "0x33c0050840280070053630050070050c0028081005363005081005092028", + "0x8400501c02802836300502800702833c00708135d00a00533c005363005", + "0x2002833b00536300502d00503102802836300535c00533d028028363005", + "0x8c00536300508c00501b02808c005363005028048028337005363005028", + "0x33500702d02833500536300502802302833600536300508c33700735c028", + "0x536300535d00504f02833400536300508a00535b02808a005363005336", + "0x50840280070053630050070050c002833b00536300533b00509202835d", + "0x501c02802836300502800702833400733b35d00a005334005363005334", + "0x8800536300502300504f028333005363005020005031028028363005361", + "0x2836300502800702802841b00502804d028332005363005333005092028", + "0x2836300536100501c02802836300501f005047028028363005028361028", + "0x33100509202808800536300500a00504f028331005363005018005031028", + "0x1b028086005363005028045028330005363005028020028332005363005", + "0x36300502802302808e00536300508633000735c028086005363005086005", + "0x2832c00536300532d00535b02832d00536300508e36f00702d02836f005", + "0x50070050c002833200536300533200509202808800536300508800504f", + "0x2800702832c00733208800a00532c00536300532c005084028007005363", + "0x2002832b005363005092005031028028363005031005242028028363005", + "0x32900536300532900501b02832900536300502804602832a005363005028", + "0x32700702d02832700536300502802302832800536300532932a00735c028", + "0x536300504f00504f02808b00536300532600535b028326005363005328", + "0x50840280070053630050070050c002832b00536300532b00509202804f", + "0x700502802836300502802802808b00732b04f00a00508b00536300508b", + "0x503102802836300502800702809204f00741c00b00a007363007005028", + "0x2802836300502800b02801000536300503100500a02800f00536300500b", + "0x701000500f02800f00536300500f00509202800a00536300500a00504f", + "0x536300500f00503102802836300502800702801300541d04e1c6007363", + "0x504e02803000536300504d0051c602804d00536300504e005010028014", + "0x53630051c6005013028018005363005014005092028017005363005030", + "0x36300502800702802841e00502804d028360005363005017005014028361", + "0x1c00501702801c00536300502803002801b00536300500f005031028028", + "0x36100536300501300501302801800536300501b00509202835f005363005", + "0x2801f00541f35e00536300736000501802836000536300535f005014028", + "0x28020005363005018005031028028363005028361028028363005028007", + "0x2300542035c35d00736300735e00a00707f028020005363005020005092", + "0x36300535d00504f02802d005363005020005031028028363005028007028", + "0x4210c035b00736300736100500f02802d00536300502d00509202835d005", + "0x50c000535f02802836300535b00501c028028363005028007028084005", + "0x2802002835900536300502d00503102802836300535c00533d028028363", + "0x2835700536300535700501b02835700536300502835d0281a8005363005", + "0x3235600702d0283560053630050280230280320053630053571a800735c", + "0x35d00536300535d00504f02803300536300536400535b028364005363005", + "0x330050840280070053630050070050c0028359005363005359005092028", + "0x8400501c02802836300502800702803300735935d00a005033005363005", + "0x9202803c00536300502835902800c00536300502d005031028028363005", + "0x3c00c35d03135702803c00536300503c0051a802800c00536300500c005", + "0x504000503102802836300502800702821d219007422040036007363007", + "0x2803600536300503600504f028227005363005227005092028227005363", + "0x36300502800702804704804603142323122d00736300735c007227031312", + "0x2802002804500536300522d00503102822d00536300522d005092028028", + "0x28363005246005040028249246007363005242005036028242005363005", + "0x24b00522702824b00536300524a00521d02824a005363005249005219028", + "0x4500536300504500509202803600536300503600504f02824c005363005", + "0x4503600a00524c00536300524c0050840282310053630052310050c0028", + "0x4600503102804600536300504600509202802836300502800702824c231", + "0x25300536300504725200702d02825200536300502802302824f005363005", + "0x24f00509202803600536300503600504f02825600536300525300535b028", + "0x2560053630052560050840280480053630050480050c002824f005363005", + "0x2802836300535c00533d02802836300502800702825604824f03600a005", + "0x536300502804602805000536300502802002825800536300521d005031", + "0x2302805b00536300500905000735c02800900536300500900501b028009", + "0x36300505900535b02805900536300505b05800702d028058005363005028", + "0xc002825800536300525800509202821900536300521900504f02805c005", + "0x5c00725821900a00505c00536300505c005084028007005363005007005", + "0x536300502000503102802836300536100501c028028363005028007028", + "0x2804d02827700536300526c00509202827500536300502300504f02826c", + "0x501f005047028028363005028361028028363005028007028028424005", + "0x504f02805e00536300501800503102802836300536100501c028028363", + "0x6000536300502802002827700536300505e00509202827500536300500a", + "0x5f06000735c02805f00536300505f00501b02805f005363005028045028", + "0x2bc00536300505d2af00702d0282af00536300502802302805d005363005", + "0x27700509202827500536300527500504f0280420053630052bc00535b028", + "0x420053630050420050840280070053630050070050c0028277005363005", + "0x2802836300503100524202802836300502800702804200727727500a005", + "0x5363005028046028306005363005028020028067005363005092005031", + "0x2302806800536300506930600735c02806900536300506900501b028069", + "0x36300506f00535b02806f00536300506800600702d028006005363005028", + "0xc002806700536300506700509202804f00536300504f00504f028071005", + "0x7100706704f00a005071005363005071005084028007005363005007005", + "0x2802836300502802802802836300502824f02800b00536300502824c028", + "0x2802836300502800702801000f00742509204f007363007005028007005", + "0x504f00504f02804e00536300503100500a0281c6005363005092005031", + "0x1401300736300704e00500f0281c60053630051c600509202804f005363", + "0x50100280300053630051c600503102802836300502800702804d005426", + "0x36300500a0051c602800a00536300500a00b00725202800a005363005014", + "0x3000509202801300536300501300501302802836300502800b028017005", + "0x502800702836000542736101800736300701300500f028030005363005", + "0x9202801c00536300536100525602801b005363005030005031028028363", + "0x36300501c00525802835e00536300501800501302835f00536300501b005", + "0x36300503000503102802836300502800702802842800502804d02801f005", + "0x509202835c00536300535d00505002835d005363005028030028020005", + "0x536300535c00525802835e00536300536000501302835f005363005020", + "0x36102802836300502800702802d00542902300536300701f00500902801f", + "0xc000536300502300501002835b00536300535f005031028028363005028", + "0x50c00051c602835900536300535e005219028084005363005028020028", + "0x2835b00536300535b00509202804f00536300504f00504f0281a8005363", + "0x51a800501b02808400536300508400522d02835900536300535900505b", + "0x50590283560323570313630051a808435935b04f00b0580281a8005363", + "0x36300503200503102802836300502800702803300542a364005363007356", + "0x2800c00536300500c00509202803603c00736300536400505c02800c005", + "0xc00503102802836300502800702821900542b04000536300703600526c", + "0x21d00536300521d00509202822700536300503c00500a02821d005363005", + "0x1c02802836300502800702804600542c23122d00736300722700500f028", + "0x2802836300504000504002802836300523100535f02802836300522d005", + "0x536300502802002804800536300521d00503102802836300501700501f", + "0x4700735c02804500536300504500501b02804500536300502835d028047", + "0x536300524224600702d028246005363005028023028242005363005045", + "0x509202835700536300535700504f02824a00536300524900535b028249", + "0x536300524a0050840280070053630050070050c0028048005363005048", + "0x2836300504600501c02802836300502800702824a00704835700a00524a", + "0x524b00509202824c00536300502835902824b00536300521d005031028", + "0x736300724c24b35703135702824c00536300524c0051a802824b005363", + "0x25800536300525200503102802836300502800702825625300742d25224f", + "0x9005219028028363005050005040028009050007363005040005036028", + "0x24f00536300524f00504f02825800536300525800509202805b005363005", + "0x2800702827526c05c03142e05905800736300705b01700725800a311028", + "0x28277005363005058005031028058005363005058005092028028363005", + "0x506000504002805f06000736300505e00503602805e005363005028020", + "0x2270282af00536300505d00521d02805d00536300505f005219028028363", + "0x36300527700509202824f00536300524f00504f0282bc0053630052af005", + "0xa0052bc0053630052bc0050840280590053630050590050c0028277005", + "0x3102805c00536300505c0050920280283630050280070282bc05927724f", + "0x36300527506700702d02806700536300502802302804200536300505c005", + "0x9202824f00536300524f00504f02806900536300530600535b028306005", + "0x36300506900508402826c00536300526c0050c0028042005363005042005", + "0x36300504000504002802836300502800702806926c04224f00a005069005", + "0x502802002806800536300525600503102802836300501700501f028028", + "0x35c02806f00536300506f00501b02806f005363005028046028006005363", + "0x507134700702d02834700536300502802302807100536300506f006007", + "0x2825300536300525300504f02807500536300507400535b028074005363", + "0x50750050840280070053630050070050c0028068005363005068005092", + "0x521900504702802836300502800702807500706825300a005075005363", + "0xc00503102802836300501700501f02802836300503c005242028028363", + "0x34500536300507700509202834600536300535700504f028077005363005", + "0x2802836300501700501f02802836300502800702802842f00502804d028", + "0x535700504f02807a00536300503300535b028043005363005032005031", + "0x280070053630050070050c0028043005363005043005092028357005363", + "0x2802836300502800702807a00704335700a00507a00536300507a005084", + "0x2802836300501700501f02802836300502d005047028028363005028361", + "0x36300504f00504f02807900536300535f00503102802836300535e00501c", + "0x2804802807f005363005028020028345005363005079005092028346005", + "0x536300534207f00735c02834200536300534200501b028342005363005", + "0x535b02834000536300508107d00702d02807d005363005028023028081", + "0x536300534500509202834600536300534600504f02833f005363005340", + "0x34600a00533f00536300533f0050840280070053630050070050c0028345", + "0xb00506002802836300504d00501c02802836300502800702833f007345", + "0x4502833d00536300502802002833e0053630051c6005031028028363005", + "0x36300533c33d00735c02833c00536300533c00501b02833c005363005028", + "0x35b02808c00536300533b33700702d02833700536300502802302833b005", + "0x36300533e00509202804f00536300504f00504f02833600536300508c005", + "0xa0053360053630053360050840280070053630050070050c002833e005", + "0x506002802836300503100524202802836300502800702833600733e04f", + "0x2808a00536300502802002833500536300501000503102802836300500b", + "0x533408a00735c02833400536300533400501b028334005363005028046", + "0x2833200536300533308800702d028088005363005028023028333005363", + "0x533500509202800f00536300500f00504f02833100536300533200535b", + "0x53310053630053310050840280070053630050070050c0028335005363", + "0xb00736300700702800700502802836300502802802833100733500f00a", + "0x2801000536300504f00503102802836300502800702800f09200743004f", + "0x501000509202800b00536300500b00504f0281c600536300500a00500a", + "0x36300502800702801400543101304e0073630071c600500f028010005363", + "0x501000503102802836300501300535f02802836300504e00501c028028", + "0x501b02801700536300502835d02803000536300502802002804d005363", + "0x536300502802302801800536300501703000735c028017005363005017", + "0x4f02801b00536300536000535b02836000536300501836100702d028361", + "0x36300504d00509202800500536300500500530f02800b00536300500b005", + "0xb00501b00536300501b0050840280310053630050310050c002804d005", + "0x3102802836300501400501c02802836300502800702801b03104d00500b", + "0x536300501c00509202835f00536300502835902801c005363005010005", + "0x1f35e00736300735f01c00b03135702835f00536300535f0051a802801c", + "0x30e02835c00536300501f00503102802836300502800702835d020007432", + "0x502300530f02835e00536300535e00504f02802d023007363005005005", + "0x2802d00536300502d00530c02835c00536300535c005092028023005363", + "0x2836300535900530b0283590840c035b00a36300502d35c02335e00a0a9", + "0x3570050400280323570073630051a80050360281a8005363005028020028", + "0x2836400536300535600521d028356005363005032005219028028363005", + "0x50c000530f02835b00536300535b00504f028033005363005364005227", + "0x280310053630050310050c00280840053630050840050920280c0005363", + "0x283630050280070280330310840c035b00b005033005363005033005084", + "0x36300502804602803c00536300502802002800c00536300535d005031028", + "0x2804000536300503603c00735c02803600536300503600501b028036005", + "0x521d00535b02821d00536300504021900702d028219005363005028023", + "0x2800500536300500500530f02802000536300502000504f028227005363", + "0x52270050840280310053630050310050c002800c00536300500c005092", + "0xa00524202802836300502800702822703100c00502000b005227005363", + "0x4602823100536300502802002822d00536300500f005031028028363005", + "0x36300504623100735c02804600536300504600501b028046005363005028", + "0x35b02804500536300504804700702d028047005363005028023028048005", + "0x36300500500530f02809200536300509200504f028242005363005045005", + "0x840280310053630050310050c002822d00536300522d005092028005005", + "0xb00536300502824c02824203122d00509200b005242005363005242005", + "0x2802836300502802802802836300502824f02809200536300502824c028", + "0x2802836300502800702804e1c600743301000f007363007005028007005", + "0x36300502800b02801400536300503100500a028013005363005010005031", + "0x500f02801300536300501300509202800f00536300500f00504f028028", + "0x501300503102802836300502800702801700543403004d007363007014", + "0x283600053630053610051c6028361005363005030005010028018005363", + "0x504d00501302801c00536300501800509202801b00536300536000504e", + "0x2800702802843500502804d02835e00536300501b00501402835f005363", + "0x1702802000536300502803002801f005363005013005031028028363005", + "0x36300501700501302801c00536300501f00509202835d005363005020005", + "0x543604f00536300735e00501802835e00536300535d00501402835f005", + "0x536300501c00503102802836300502836102802836300502800702835c", + "0x7f02802300536300502300509202804f00536300504f092007252028023", + "0x50310280283630050280070280c000543735b02d00736300704f00f007", + "0x536300508400509202802d00536300502d00504f028084005363005023", + "0x280283630050280070283570054381a835900736300735f00500f028084", + "0xa00b00725202800a0053630051a8005010028032005363005084005031", + "0x1302802836300502800b02835600536300500a0051c602800a005363005", + "0x36300735900500f028032005363005032005092028359005363005359005", + "0x3c00536300503200503102802836300502800702800c005439033364007", + "0x36400501302804000536300503c005092028036005363005033005256028", + "0x702802843a00502804d02821d005363005036005258028219005363005", + "0x2822d005363005028030028227005363005032005031028028363005028", + "0x500c00501302804000536300522700509202823100536300522d005050", + "0x43b04600536300721d00500902821d005363005231005258028219005363", + "0x46005010028047005363005040005031028028363005028007028048005", + "0x28246005363005219005219028242005363005028020028045005363005", + "0x504700509202802d00536300502d00504f0282490053630050450051c6", + "0x2824200536300524200522d02824600536300524600505b028047005363", + "0x24b24a03136300524924224604702d00b05802824900536300524900501b", + "0x3102802836300502800702825200543c24f00536300724c00505902824c", + "0x525300509202825825600736300524f00505c02825300536300524b005", + "0x2836300502800702800900543d05000536300725800526c028253005363", + "0x5b00509202805800536300525600500a02805b005363005253005031028", + "0x502800702826c00543e05c05900736300705800500f02805b005363005", + "0x1c602827700536300505c00501002827500536300505b005031028028363", + "0x5e00536300505e00501b02802836300502800b02805e005363005277005", + "0x5e005342028275005363005275005092028059005363005059005013028", + "0x5f00536300527500503102802836300502800702806000543f028363007", + "0x505f0050920282af00536300505d00508102805d005363005028030028", + "0x2800702802844000502804d0280420053630052af00507d0282bc005363", + "0x30028067005363005275005031028028363005060005340028028363005", + "0x536300506700509202806900536300530600533f028306005363005028", + "0x544100606800736300705900500f02804200536300506900507d0282bc", + "0x2836300506800501c02802836300502836102802836300502800702806f", + "0x36300504200533e02802836300505000504002802836300500600535f028", + "0x52bc00503102802836300535b00533d02802836300535600501f028028", + "0x501b02807400536300502835d028347005363005028020028071005363", + "0x536300502802302807500536300507434700735c028074005363005074", + "0x4f02834500536300534600535b02834600536300507507700702d028077", + "0x3630050070050c002807100536300507100509202824a00536300524a005", + "0x502800702834500707124a00a005345005363005345005084028007005", + "0x283590280430053630052bc00503102802836300506f00501c028028363", + "0x7a00536300507a0051a802804300536300504300509202807a005363005", + "0x36300502800702808134200744207f07900736300707a04324a031357028", + "0x504200533c02807d00536300507f005031028028363005028361028028", + "0x2802836300533f00504002833e33f007363005050005036028340005363", + "0x534000507d02807d00536300507d00509202833d00536300533e005219", + "0x34033d35635b00707d04f0b002807900536300507900504f028340005363", + "0x27502802836300502800702808a33533603144308c33733b33c00a363007", + "0x33c00536300533c00509202802836300508c005242028028363005337005", + "0x533300503602833300536300502802002833400536300533c005031028", + "0x28331005363005332005219028028363005088005040028332088007363", + "0x507900504f02808600536300533000522702833000536300533100521d", + "0x2833b00536300533b0050c0028334005363005334005092028079005363", + "0x2802836300502800702808633b33407900a005086005363005086005084", + "0x36300502802302808e005363005336005031028336005363005336005092", + "0x2832c00536300532d00535b02832d00536300508a36f00702d02836f005", + "0x53350050c002808e00536300508e00509202807900536300507900504f", + "0x2800702832c33508e07900a00532c00536300532c005084028335005363", + "0x4200533e028028363005050005040028028363005028361028028363005", + "0x503102802836300535b00533d02802836300535600501f028028363005", + "0x2832900536300502804602832a00536300502802002832b005363005081", + "0x502802302832800536300532932a00735c02832900536300532900501b", + "0x8b00536300532600535b02832600536300532832700702d028327005363", + "0x70050c002832b00536300532b00509202834200536300534200504f028", + "0x702808b00732b34200a00508b00536300508b005084028007005363005", + "0x4002802836300535b00533d02802836300526c00501c028028363005028", + "0x32500536300505b00503102802836300535600501f028028363005050005", + "0x36300532300501b02832300536300502807a028324005363005028020028", + "0x2d02808500536300502802302832000536300532332400735c028323005", + "0x524a00504f02809500536300509300535b028093005363005320085007", + "0x280070053630050070050c002832500536300532500509202824a005363", + "0x2802836300502800702809500732524a00a005095005363005095005084", + "0x2836300525600524202802836300535b00533d028028363005009005047", + "0x524a00504f02831f00536300525300503102802836300535600501f028", + "0x2800702802844400502804d02831e00536300531f005092028098005363", + "0x503102802836300535600501f02802836300535b00533d028028363005", + "0x536300524a00504f02831d00536300525200535b02809600536300524b", + "0x50840280070053630050070050c002809600536300509600509202824a", + "0x2836102802836300502800702831d00709624a00a00531d00536300531d", + "0x533d02802836300535600501f028028363005048005047028028363005", + "0x2831c00536300504000503102802836300521900501c02802836300535b", + "0x36300502802002831e00536300531c00509202809800536300502d00504f", + "0x735c02831900536300531900501b02831900536300502805e02831a005", + "0x36300531831700702d02831700536300502802302831800536300531931a", + "0x9202809800536300509800504f02831500536300531600535b028316005", + "0x3630053150050840280070053630050070050c002831e00536300531e005", + "0x36300535700501c02802836300502800702831500731e09800a005315005", + "0x508400503102802836300500b00506002802836300535b00533d028028", + "0x501b028312005363005028048028313005363005028020028314005363", + "0x536300502802302831100536300531231300735c028312005363005312", + "0x4f02830c00536300530e00535b02830e00536300531130f00702d02830f", + "0x3630050070050c002831400536300531400509202802d00536300502d005", + "0x502800702830c00731402d00a00530c00536300530c005084028007005", + "0x2300503102802836300500b00506002802836300535f00501c028028363", + "0xb00053630050a900509202830b0053630050c000504f0280a9005363005", + "0x4702802836300502836102802836300502800702802844500502804d028", + "0x2802836300500b00506002802836300535f00501c02802836300535c005", + "0x36300500f00504f0280ac00536300501c005031028028363005092005060", + "0x2804502830a0053630050280200280b00053630050ac00509202830b005", + "0x536300530830a00735c02830800536300530800501b028308005363005", + "0x535b0283050053630050b40b600702d0280b60053630050280230280b4", + "0x53630050b000509202830b00536300530b00504f0280b9005363005305", + "0x30b00a0050b90053630050b90050840280070053630050070050c00280b0", + "0xb0050600280283630050920050600280283630050280070280b90070b0", + "0x2002830300536300504e005031028028363005031005242028028363005", + "0x30100536300530100501b028301005363005028046028302005363005028", + "0x2ff00702d0282ff00536300502802302830000536300530130200735c028", + "0x53630051c600504f0280bf0053630052fe00535b0282fe005363005300", + "0x50840280070053630050070050c00283030053630053030050920281c6", + "0x70050280283630050280280280bf0073031c600a0050bf0053630050bf", + "0x503102802836300502800702809204f00744600b00a007363007005028", + "0x2802836300502800b02801000536300503100500a02800f00536300500b", + "0x701000500f02800f00536300500f00509202800a00536300500a00504f", + "0x536300500f00503102802836300502800702801300544704e1c6007363", + "0x501302803000536300501400509202804d00536300504e005256028014", + "0x2802844800502804d02801800536300504d0052580280170053630051c6", + "0x36000536300502803002836100536300500f005031028028363005028007", + "0x1300501302803000536300536100509202801b005363005360005050028", + "0x1c00536300701800500902801800536300501b005258028017005363005", + "0x503000503102802836300502836102802836300502800702835f005449", + "0x2802000536300501f0051c602801f00536300501c00501002835e005363", + "0x2000a0070ac02835e00536300535e00509202802000536300502000501b", + "0x35e00503102802836300502800702835b02d02303144a35c35d007363007", + "0xc00053630050c000509202835d00536300535d00504f0280c0005363005", + "0x1c0280283630050280070281a800544b35908400736300701700500f028", + "0x2802836300535c00530a02802836300535900535f028028363005084005", + "0x536300502835d0280320053630050280200283570053630050c0005031", + "0x2302836400536300535603200735c02835600536300535600501b028356", + "0x36300500c00535b02800c00536300536403300702d028033005363005028", + "0xc002835700536300535700509202835d00536300535d00504f02803c005", + "0x3c00735735d00a00503c00536300503c005084028007005363005007005", + "0x53630050c00050310280283630051a800501c028028363005028007028", + "0x400051a8028036005363005036005092028040005363005028359028036", + "0x2822d22700744c21d21900736300704003635d031357028040005363005", + "0x536300521900504f02823100536300521d005031028028363005028007", + "0x310b402835c00536300535c005308028231005363005231005092028219", + "0x24200544d0450053630070470050b602804704804603136300535c231219", + "0x5363005028020028246005363005048005031028028363005028007028", + "0x735c02824b00536300524a0050b902824a005363005045005305028249", + "0x524f00504002825224f00736300524c00503602824c00536300524b249", + "0x22702825600536300525300521d028253005363005252005219028028363", + "0x36300524600509202804600536300504600504f028258005363005256005", + "0xa0052580053630052580050840280070053630050070050c0028246005", + "0x35b028050005363005048005031028028363005028007028258007246046", + "0x36300505000509202804600536300504600504f028009005363005242005", + "0xa0050090053630050090050840280070053630050070050c0028050005", + "0x503102802836300535c00530a028028363005028007028009007050046", + "0x2805900536300502804602805800536300502802002805b00536300522d", + "0x502802302805c00536300505905800735c02805900536300505900501b", + "0x27700536300527500535b02827500536300505c26c00702d02826c005363", + "0x70050c002805b00536300505b00509202822700536300522700504f028", + "0x702827700705b22700a005277005363005277005084028007005363005", + "0x1c02802836300535b00530a02802836300502d00530a028028363005028", + "0x536300502300504f02805e00536300535e005031028028363005017005", + "0x36300502800702802844e00502804d02805f00536300505e005092028060", + "0x36300501700501c02802836300535f005047028028363005028361028028", + "0x509202806000536300500a00504f02805d005363005030005031028028", + "0x282bc0053630050280450282af00536300502802002805f00536300505d", + "0x50280230280420053630052bc2af00735c0282bc0053630052bc00501b", + "0x6900536300530600535b02830600536300504206700702d028067005363", + "0x70050c002805f00536300505f00509202806000536300506000504f028", + "0x702806900705f06000a005069005363005069005084028007005363005", + "0x28068005363005092005031028028363005031005242028028363005028", + "0x536300506f00501b02806f005363005028046028006005363005028020", + "0x702d02834700536300502802302807100536300506f00600735c02806f", + "0x36300504f00504f02807500536300507400535b028074005363005071347", + "0x840280070053630050070050c002806800536300506800509202804f005", + "0x502802836300502802802807500706804f00a005075005363005075005", + "0x3102802836300502800702809204f00744f00b00a007363007005028007", + "0x36300500a00504f02801000536300503100500a02800f00536300500b005", + "0x45004e1c600736300701000500f02800f00536300500f00509202800a005", + "0x504e00535f0280283630051c600501c028028363005028007028013005", + "0x2835d02804d00536300502802002801400536300500f005031028028363", + "0x536300503004d00735c02803000536300503000501b028030005363005", + "0x535b02836100536300501701800702d028018005363005028023028017", + "0x536300501400509202800a00536300500a00504f028360005363005361", + "0xa00a0053600053630053600050840280070053630050070050c0028014", + "0xf00503102802836300501300501c028028363005028007028360007014", + "0x2801b00536300501b00509202801c00536300502835902801b005363005", + "0x745135e35f00736300701c01b00a03135702801c00536300501c0051a8", + "0x502833b02835d00536300535e00503102802836300502800702802001f", + "0x2835d00536300535d00509202835f00536300535f00504f02835c005363", + "0x35b02d02300a36300535c00735d35f00a3030280070053630050070050c0", + "0x3350280283630050280070283590054520840053630070c00053360280c0", + "0x3570053630050280200281a800536300502d005031028028363005084005", + "0x356005219028028363005032005040028356032007363005357005036028", + "0xc00536300503300522702803300536300536400521d028364005363005", + "0x35b0050c00281a80053630051a800509202802300536300502300504f028", + "0x702800c35b1a802300a00500c00536300500c00508402835b005363005", + "0x3600536300535900535b02803c00536300502d005031028028363005028", + "0x35b0050c002803c00536300503c00509202802300536300502300504f028", + "0x702803635b03c02300a00503600536300503600508402835b005363005", + "0x28219005363005028020028040005363005020005031028028363005028", + "0x521d21900735c02821d00536300521d00501b02821d005363005028046", + "0x2823100536300522722d00702d02822d005363005028023028227005363", + "0x504000509202801f00536300501f00504f02804600536300523100535b", + "0x50460053630050460050840280070053630050070050c0028040005363", + "0x3102802836300503100524202802836300502800702804600704001f00a", + "0x45005363005028046028047005363005028020028048005363005092005", + "0x2802302824200536300504504700735c02804500536300504500501b028", + "0x536300524900535b02824900536300524224600702d028246005363005", + "0x50c002804800536300504800509202804f00536300504f00504f02824a", + "0x2824a00704804f00a00524a00536300524a005084028007005363005007", + "0x2809204f00745300b00a007363007005028007005028028363005028028", + "0x536300503100500a02800f00536300500b005031028028363005028007", + "0x500f02800f00536300500f00509202800a00536300500a00504f028010", + "0x51c600501c02802836300502800702801300545404e1c6007363007010", + "0x2802002801400536300500f00503102802836300504e00535f028028363", + "0x2803000536300503000501b02803000536300502835d02804d005363005", + "0x1701800702d02801800536300502802302801700536300503004d00735c", + "0xa00536300500a00504f02836000536300536100535b028361005363005", + "0x3600050840280070053630050070050c0028014005363005014005092028", + "0x1300501c02802836300502800702836000701400a00a005360005363005", + "0x9202801c00536300502835902801b00536300500f005031028028363005", + "0x1c01b00a03135702801c00536300501c0051a802801b00536300501b005", + "0x535e00503102802836300502800702802001f00745535e35f007363007", + "0x9202835f00536300535f00504f02835c00536300502833b02835d005363", + "0x735d35f00a3020280070053630050070050c002835d00536300535d005", + "0x283590054560840053630070c00053360280c035b02d02300a36300535c", + "0x1a800536300502d005031028028363005084005335028028363005028007", + "0x32005040028356032007363005357005036028357005363005028020028", + "0x2803300536300536400521d028364005363005356005219028028363005", + "0x51a800509202802300536300502300504f02800c005363005033005227", + "0x500c00536300500c00508402835b00536300535b0050c00281a8005363", + "0x2803c00536300502d00503102802836300502800702800c35b1a802300a", + "0x503c00509202802300536300502300504f02803600536300535900535b", + "0x503600536300503600508402835b00536300535b0050c002803c005363", + "0x2804000536300502000503102802836300502800702803635b03c02300a", + "0x536300521d00501b02821d005363005028046028219005363005028020", + "0x702d02822d00536300502802302822700536300521d21900735c02821d", + "0x36300501f00504f02804600536300523100535b02823100536300522722d", + "0x840280070053630050070050c002804000536300504000509202801f005", + "0x24202802836300502800702804600704001f00a005046005363005046005", + "0x47005363005028020028048005363005092005031028028363005031005", + "0x4504700735c02804500536300504500501b028045005363005028046028", + "0x24900536300524224600702d028246005363005028023028242005363005", + "0x4800509202804f00536300504f00504f02824a00536300524900535b028", + "0x24a00536300524a0050840280070053630050070050c0028048005363005", + "0x736300700702800700502802836300502802802824a00704804f00a005", + "0x1000536300504f00503102802836300502800702800f09200745704f00b", + "0x1000509202800b00536300500b00504f0281c600536300500a00500a028", + "0x502800702801400545801304e0073630071c600500f028010005363005", + "0x1000503102802836300501300535f02802836300504e00501c028028363", + "0x1b02801700536300502835d02803000536300502802002804d005363005", + "0x36300502802302801800536300501703000735c028017005363005017005", + "0x2801b00536300536000535b02836000536300501836100702d028361005", + "0x504d00509202800500536300500500530102800b00536300500b00504f", + "0x501b00536300501b0050840280310053630050310050c002804d005363", + "0x2802836300501400501c02802836300502800702801b03104d00500b00b", + "0x36300501c00509202835f00536300502835902801c005363005010005031", + "0x35e00736300735f01c00b03135702835f00536300535f0051a802801c005", + "0x2835c00536300501f00503102802836300502800702835d02000745901f", + "0x36300535c00509202835e00536300535e00504f02802300536300502833b", + "0x3000280310053630050310050c002800500536300500500530102835c005", + "0x3630073590053360283590840c035b02d00b36300502303100535c35e00b", + "0x310280283630051a800533502802836300502800702835700545a1a8005", + "0x736300535600503602835600536300502802002803200536300535b005", + "0x521d02800c005363005033005219028028363005364005040028033364", + "0x536300502d00504f02803600536300503c00522702803c00536300500c", + "0x50c00280320053630050320050920280c00053630050c000530102802d", + "0x360840320c002d00b005036005363005036005084028084005363005084", + "0x36300535700535b02804000536300535b005031028028363005028007028", + "0x920280c00053630050c000530102802d00536300502d00504f028219005", + "0x3630052190050840280840053630050840050c0028040005363005040005", + "0x535d0050310280283630050280070282190840400c002d00b005219005", + "0x501b02822d00536300502804602822700536300502802002821d005363", + "0x536300502802302823100536300522d22700735c02822d00536300522d", + "0x4f02804700536300504800535b02804800536300523104600702d028046", + "0x36300521d005092028005005363005005005301028020005363005020005", + "0xb0050470053630050470050840280310053630050310050c002821d005", + "0x3102802836300500a00524202802836300502800702804703121d005020", + "0x24600536300502804602824200536300502802002804500536300500f005", + "0x2802302824900536300524624200735c02824600536300524600501b028", + "0x536300524b00535b02824b00536300524924a00702d02824a005363005", + "0x509202800500536300500500530102809200536300509200504f02824c", + "0x536300524c0050840280310053630050310050c0028045005363005045", + "0x700502800700502802836300502802802824c03104500509200b00524c", + "0x36300500b00503102802836300502800702809204f00745b00b00a007363", + "0x9202800a00536300500a00504f02801000536300503100500a02800f005", + "0x702801300545c04e1c600736300701000500f02800f00536300500f005", + "0x3102802836300504e00535f0280283630051c600501c028028363005028", + "0x3000536300502835d02804d00536300502802002801400536300500f005", + "0x2802302801700536300503004d00735c02803000536300503000501b028", + "0x536300536100535b02836100536300501701800702d028018005363005", + "0x50c002801400536300501400509202800a00536300500a00504f028360", + "0x2836000701400a00a005360005363005360005084028007005363005007", + "0x1b00536300500f00503102802836300501300501c028028363005028007", + "0x501c0051a802801b00536300501b00509202801c005363005028359028", + "0x702802001f00745d35e35f00736300701c01b00a03135702801c005363", + "0x2835c00536300502833b02835d00536300535e005031028028363005028", + "0x50070050c002835d00536300535d00509202835f00536300535f00504f", + "0x53360280c035b02d02300a36300535c00735d35f00a2ff028007005363", + "0x36300508400533502802836300502800702835900545e0840053630070c0", + "0x3570050360283570053630050280200281a800536300502d005031028028", + "0x364005363005356005219028028363005032005040028356032007363005", + "0x2300504f02800c00536300503300522702803300536300536400521d028", + "0x35b00536300535b0050c00281a80053630051a8005092028023005363005", + "0x2836300502800702800c35b1a802300a00500c00536300500c005084028", + "0x2300504f02803600536300535900535b02803c00536300502d005031028", + "0x35b00536300535b0050c002803c00536300503c005092028023005363005", + "0x2836300502800702803635b03c02300a005036005363005036005084028", + "0x363005028046028219005363005028020028040005363005020005031028", + "0x2822700536300521d21900735c02821d00536300521d00501b02821d005", + "0x523100535b02823100536300522722d00702d02822d005363005028023", + "0x2804000536300504000509202801f00536300501f00504f028046005363", + "0x704001f00a0050460053630050460050840280070053630050070050c0", + "0x363005092005031028028363005031005242028028363005028007028046", + "0x4500501b028045005363005028046028047005363005028020028048005", + "0x24600536300502802302824200536300504504700735c028045005363005", + "0x504f02824a00536300524900535b02824900536300524224600702d028", + "0x53630050070050c002804800536300504800509202804f00536300504f", + "0x36300502802802824a00704804f00a00524a00536300524a005084028007", + "0x36300502800702809204f00745f00b00a007363007005028007005028028", + "0x504f02801000536300503100500a02800f00536300500b005031028028", + "0x736300701000500f02800f00536300500f00509202800a00536300500a", + "0x2801400536300500f00503102802836300502800702801300546004e1c6", + "0x50140050920281c60053630051c600501302804d00536300504e005010", + "0x170300073630071c600500f02804d00536300504d00501b028014005363", + "0x5010028361005363005014005031028028363005028007028018005461", + "0x5363005361005092028030005363005030005013028360005363005017", + "0x546201c01b00736300703000500f02836000536300536000501b028361", + "0x36300501c00535f02802836300501b00501c02802836300502800702835f", + "0x536100503102802836300504d00501f02802836300536000501f028028", + "0x501b02802000536300502835d02801f00536300502802002835e005363", + "0x536300502802302835d00536300502001f00735c028020005363005020", + "0x4f02802d00536300502300535b02802300536300535d35c00702d02835c", + "0x3630050070050c002835e00536300535e00509202800a00536300500a005", + "0x502800702802d00735e00a00a00502d00536300502d005084028007005", + "0x2835902835b00536300536100503102802836300535f00501c028028363", + "0xc00053630050c00051a802835b00536300535b0050920280c0005363005", + "0x3630050280070283571a80074633590840073630070c035b00a031357028", + "0x51c602835600536300504d0051c6028032005363005359005031028028", + "0x36300503300501b028033005363005364356007326028364005363005360", + "0x34202803200536300503200509202808400536300508400504f028033005", + "0x36300503200503102802836300502800702800c005464028363007033005", + "0x4000501b0280400053630050282fe02803600536300502802002803c005", + "0x736300521900503602821900536300504003600735c028040005363005", + "0x521d02822d00536300522700521902802836300521d00504002822721d", + "0x536300508400504f02804600536300523100522702823100536300522d", + "0x50840280070053630050070050c002803c00536300503c005092028084", + "0x534002802836300502800702804600703c08400a005046005363005046", + "0x2804700536300502802002804800536300503200503102802836300500c", + "0x504504700735c02804500536300504500501b0280450053630050280bf", + "0x2824900536300524224600702d028246005363005028023028242005363", + "0x504800509202808400536300508400504f02824a00536300524900535b", + "0x524a00536300524a0050840280070053630050070050c0028048005363", + "0x1f02802836300536000501f02802836300502800702824a00704808400a", + "0x24c00536300502802002824b00536300535700503102802836300504d005", + "0x24f24c00735c02824f00536300524f00501b02824f005363005028046028", + "0x25600536300525225300702d028253005363005028023028252005363005", + "0x24b0050920281a80053630051a800504f02825800536300525600535b028", + "0x2580053630052580050840280070053630050070050c002824b005363005", + "0x2802836300501800501c02802836300502800702825800724b1a800a005", + "0x536300502802002805000536300501400503102802836300504d00501f", + "0x900735c02805b00536300505b00501b02805b005363005028048028009", + "0x536300505805900702d02805900536300502802302805800536300505b", + "0x509202800a00536300500a00504f02826c00536300505c00535b02805c", + "0x536300526c0050840280070053630050070050c0028050005363005050", + "0x2836300501300501c02802836300502800702826c00705000a00a00526c", + "0x36300502804502827700536300502802002827500536300500f005031028", + "0x2806000536300505e27700735c02805e00536300505e00501b02805e005", + "0x505d00535b02805d00536300506005f00702d02805f005363005028023", + "0x2827500536300527500509202800a00536300500a00504f0282af005363", + "0x727500a00a0052af0053630052af0050840280070053630050070050c0", + "0x3630050920050310280283630050310052420280283630050280070282af", + "0x6700501b0280670053630050280460280420053630050280200282bc005", + "0x6900536300502802302830600536300506704200735c028067005363005", + "0x504f02800600536300506800535b02806800536300530606900702d028", + "0x53630050070050c00282bc0053630052bc00509202804f00536300504f", + "0x3630050280280280060072bc04f00a005006005363005006005084028007", + "0x36300502800702809204f00746500b00a007363007005028007005028028", + "0x2800b02801000536300503100500a02800f00536300500b005031028028", + "0x2800f00536300500f00509202800a00536300500a00504f028028363005", + "0x503102802836300502800702801300546604e1c600736300701000500f", + "0x536300501400509202804d00536300504e00525602801400536300500f", + "0x2804d02801800536300504d0052580280170053630051c6005013028030", + "0x2803002836100536300500f005031028028363005028007028028467005", + "0x3000536300536100509202801b005363005360005050028360005363005", + "0x1800500902801800536300501b005258028017005363005013005013028", + "0x2802836300502836102802836300502800702835f00546801c005363007", + "0x36300502802002801f00536300501c00501002835e005363005030005031", + "0x4f02835c00536300501f0051c602835d005363005017005219028020005", + "0x36300535d00505b02835e00536300535e00509202800a00536300500a005", + "0x5802835c00536300535c00501b02802000536300502000522d02835d005", + "0xc000536300735b00505902835b02d02303136300535c02035d35e00a00b", + "0x505c02835900536300502d005031028028363005028007028084005469", + "0x36300735700526c0283590053630053590050920283571a80073630050c0", + "0x2836400536300535900503102802836300502800702835600546a032005", + "0x703300500f0283640053630053640050920280330053630051a800500a", + "0x2836300500c00501c02802836300502800702803600546b03c00c007363", + "0x36300536400503102802836300503200504002802836300503c00535f028", + "0x21d00501b02821d00536300502835d028219005363005028020028040005", + "0x22d00536300502802302822700536300521d21900735c02821d005363005", + "0x504f02804600536300523100535b02823100536300522722d00702d028", + "0x53630050070050c0028040005363005040005092028023005363005023", + "0x36300502800702804600704002300a005046005363005046005084028007", + "0x502835902804800536300536400503102802836300503600501c028028", + "0x280470053630050470051a8028048005363005048005092028047005363", + "0x2836300502800702824924600746c242045007363007047048023031357", + "0x504500504f02824b00536300502833b02824a005363005242005031028", + "0x280070053630050070050c002824a00536300524a005092028045005363", + "0x24f24c00a36300503224b00724a04500b2fd02803200536300503200522d", + "0x2802836300502800702825800546d2560053630072530052fc028253252", + "0x3630052560052fb02800900536300502802002805000536300524f005031", + "0x2805900536300505800900735c02802836300505b00531c02805805b007", + "0x526c00521902802836300505c00504002826c05c007363005059005036", + "0x2805e00536300527700522702827700536300527500521d028275005363", + "0x52520050c002805000536300505000509202824c00536300524c00504f", + "0x2800702805e25205024c00a00505e00536300505e005084028252005363", + "0x2805f00536300525800535b02806000536300524f005031028028363005", + "0x52520050c002806000536300506000509202824c00536300524c00504f", + "0x2800702805f25206024c00a00505f00536300505f005084028252005363", + "0x2002805d005363005249005031028028363005032005040028028363005", + "0x2bc0053630052bc00501b0282bc0053630050280460282af005363005028", + "0x6700702d0280670053630050280230280420053630052bc2af00735c028", + "0x536300524600504f02806900536300530600535b028306005363005042", + "0x50840280070053630050070050c002805d00536300505d005092028246", + "0x504702802836300502800702806900705d24600a005069005363005069", + "0x280680053630053590050310280283630051a8005242028028363005356", + "0x46e00502804d02806f00536300506800509202800600536300502300504f", + "0x508400535b02807100536300502d005031028028363005028007028028", + "0x2807100536300507100509202802300536300502300504f028347005363", + "0x707102300a0053470053630053470050840280070053630050070050c0", + "0x2836300535f005047028028363005028361028028363005028007028347", + "0x500a00504f02807400536300503000503102802836300501700501c028", + "0x4502807500536300502802002806f005363005074005092028006005363", + "0x36300507707500735c02807700536300507700501b028077005363005028", + "0x35b02804300536300534634500702d028345005363005028023028346005", + "0x36300506f00509202800600536300500600504f02807a005363005043005", + "0xa00507a00536300507a0050840280070053630050070050c002806f005", + "0x503102802836300503100524202802836300502800702807a00706f006", + "0x2834200536300502804602807f005363005028020028079005363005092", + "0x502802302808100536300534207f00735c02834200536300534200501b", + "0x33f00536300534000535b02834000536300508107d00702d02807d005363", + "0x70050c002807900536300507900509202804f00536300504f00504f028", + "0x2802833f00707904f00a00533f00536300533f005084028007005363005", + "0x702809204f00746f00b00a007363007005028007005028028363005028", + "0x1000536300503100500a02800f00536300500b005031028028363005028", + "0x1000500f02800f00536300500f00509202800a00536300500a00504f028", + "0x3630051c600501c02802836300502800702801300547004e1c6007363007", + "0x502802002801400536300500f00503102802836300504e00535f028028", + "0x35c02803000536300503000501b02803000536300502835d02804d005363", + "0x501701800702d02801800536300502802302801700536300503004d007", + "0x2800a00536300500a00504f02836000536300536100535b028361005363", + "0x53600050840280070053630050070050c0028014005363005014005092", + "0x501300501c02802836300502800702836000701400a00a005360005363", + "0x509202801c00536300502835902801b00536300500f005031028028363", + "0x701c01b00a03135702801c00536300501c0051a802801b00536300501b", + "0x36300535e00503102802836300502800702802001f00747135e35f007363", + "0x2300501b02802300536300502805102835c00536300502802002835d005", + "0x35b00536300502802302802d00536300502335c00735c028023005363005", + "0x504f0280840053630050c000535b0280c000536300502d35b00702d028", + "0x53630050070050c002835d00536300535d00509202835f00536300535f", + "0x36300502800702808400735d35f00a005084005363005084005084028007", + "0x50280460281a8005363005028020028359005363005020005031028028", + "0x320053630053571a800735c02835700536300535700501b028357005363", + "0x36400535b02836400536300503235600702d028356005363005028023028", + "0x35900536300535900509202801f00536300501f00504f028033005363005", + "0x35901f00a0050330053630050330050840280070053630050070050c0028", + "0x5092005031028028363005031005242028028363005028007028033007", + "0x501b02803600536300502804602803c00536300502802002800c005363", + "0x536300502802302804000536300503603c00735c028036005363005036", + "0x4f02822700536300521d00535b02821d00536300504021900702d028219", + "0x3630050070050c002800c00536300500c00509202804f00536300504f005", + "0x502802802822700700c04f00a005227005363005227005084028007005", + "0x502800702809204f00747200b00a007363007005028007005028028363", + "0x4f02801000536300503100500a02800f00536300500b005031028028363", + "0x36300701000500f02800f00536300500f00509202800a00536300500a005", + "0x1400536300500f00503102802836300502800702801300547304e1c6007", + "0x140050920281c60053630051c600501302804d00536300504e005010028", + "0x300073630071c600500f02804d00536300504d00501b028014005363005", + "0x535f02802836300503000501c028028363005028007028018005474017", + "0x2836100536300501400503102802836300504d00501f028028363005017", + "0x536300501b00501b02801b00536300502835d028360005363005028020", + "0x702d02835f00536300502802302801c00536300501b36000735c02801b", + "0x36300500a00504f02801f00536300535e00535b02835e00536300501c35f", + "0x840280070053630050070050c002836100536300536100509202800a005", + "0x1c02802836300502800702801f00736100a00a00501f00536300501f005", + "0x35d005363005028359028020005363005014005031028028363005018005", + "0xa03135702835d00536300535d0051a8028020005363005020005092028", + "0x503102802836300502800702835b02d00747502335c00736300735d020", + "0x35900536300502833b02808400536300504d0051c60280c0005363005023", + "0x8400501b0280c00053630050c000509202835c00536300535c00504f028", + "0x53360280323571a80313630050843590c035c00a38b028084005363005", + "0x363005356005335028028363005028007028364005476356005363007032", + "0xc00503602800c005363005028020028033005363005357005031028028", + "0x4000536300503600521902802836300503c00504002803603c007363005", + "0x1a800504f02821d00536300521900522702821900536300504000521d028", + "0x70053630050070050c00280330053630050330050920281a8005363005", + "0x2836300502800702821d0070331a800a00521d00536300521d005084028", + "0x1a800504f02822d00536300536400535b028227005363005357005031028", + "0x70053630050070050c00282270053630052270050920281a8005363005", + "0x2836300502800702822d0072271a800a00522d00536300522d005084028", + "0x36300502802002823100536300535b00503102802836300504d00501f028", + "0x735c02804800536300504800501b028048005363005028046028046005", + "0x36300504704500702d028045005363005028023028047005363005048046", + "0x9202802d00536300502d00504f02824600536300524200535b028242005", + "0x3630052460050840280070053630050070050c0028231005363005231005", + "0x36300501300501c02802836300502800702824600723102d00a005246005", + "0x502804502824a00536300502802002824900536300500f005031028028", + "0x24c00536300524b24a00735c02824b00536300524b00501b02824b005363", + "0x25200535b02825200536300524c24f00702d02824f005363005028023028", + "0x24900536300524900509202800a00536300500a00504f028253005363005", + "0x24900a00a0052530053630052530050840280070053630050070050c0028", + "0x5092005031028028363005031005242028028363005028007028253007", + "0x501b028050005363005028046028258005363005028020028256005363", + "0x536300502802302800900536300505025800735c028050005363005050", + "0x4f02805900536300505800535b02805800536300500905b00702d02805b", + "0x3630050070050c002825600536300525600509202804f00536300504f005", + "0x502802802805900725604f00a005059005363005059005084028007005", + "0x502800702809204f00747700b00a007363007005028007005028028363", + "0x4f02801000536300503100500a02800f00536300500b005031028028363", + "0x36300701000500f02800f00536300500f00509202800a00536300500a005", + "0x1400536300500f00503102802836300502800702801300547804e1c6007", + "0x140050920281c60053630051c600501302804d00536300504e005010028", + "0x300073630071c600500f02804d00536300504d00501b028014005363005", + "0x535f02802836300503000501c028028363005028007028018005479017", + "0x2836100536300501400503102802836300504d00501f028028363005017", + "0x536300501b00501b02801b00536300502835d028360005363005028020", + "0x702d02835f00536300502802302801c00536300501b36000735c02801b", + "0x36300500a00504f02801f00536300535e00535b02835e00536300501c35f", + "0x840280070053630050070050c002836100536300536100509202800a005", + "0x1c02802836300502800702801f00736100a00a00501f00536300501f005", + "0x35d005363005028359028020005363005014005031028028363005018005", + "0xa03135702835d00536300535d0051a8028020005363005020005092028", + "0x503102802836300502800702835b02d00747a02335c00736300735d020", + "0x35900536300502833b02808400536300504d0051c60280c0005363005023", + "0x8400501b0280c00053630050c000509202835c00536300535c00504f028", + "0x53360280323571a80313630050843590c035c00a38c028084005363005", + "0x36300535600533502802836300502800702836400547b356005363007032", + "0xc00503602800c005363005028020028033005363005357005031028028", + "0x4000536300503600521902802836300503c00504002803603c007363005", + "0x1a800504f02821d00536300521900522702821900536300504000521d028", + "0x70053630050070050c00280330053630050330050920281a8005363005", + "0x2836300502800702821d0070331a800a00521d00536300521d005084028", + "0x1a800504f02822d00536300536400535b028227005363005357005031028", + "0x70053630050070050c00282270053630052270050920281a8005363005", + "0x2836300502800702822d0072271a800a00522d00536300522d005084028", + "0x36300502802002823100536300535b00503102802836300504d00501f028", + "0x735c02804800536300504800501b028048005363005028046028046005", + "0x36300504704500702d028045005363005028023028047005363005048046", + "0x9202802d00536300502d00504f02824600536300524200535b028242005", + "0x3630052460050840280070053630050070050c0028231005363005231005", + "0x36300501300501c02802836300502800702824600723102d00a005246005", + "0x502804502824a00536300502802002824900536300500f005031028028", + "0x24c00536300524b24a00735c02824b00536300524b00501b02824b005363", + "0x25200535b02825200536300524c24f00702d02824f005363005028023028", + "0x24900536300524900509202800a00536300500a00504f028253005363005", + "0x24900a00a0052530053630052530050840280070053630050070050c0028", + "0x5092005031028028363005031005242028028363005028007028253007", + "0x501b028050005363005028046028258005363005028020028256005363", + "0x536300502802302800900536300505025800735c028050005363005050", + "0x4f02805900536300505800535b02805800536300500905b00702d02805b", + "0x3630050070050c002825600536300525600509202804f00536300504f005", + "0x502802802805900725604f00a005059005363005059005084028007005", + "0x502800702809204f00747c00b00a007363007005028007005028028363", + "0xb02801000536300503100500a02800f00536300500b005031028028363", + "0xf00536300500f00509202800a00536300500a00504f028028363005028", + "0x3102802836300502800702801300547d04e1c600736300701000500f028", + "0x36300504d0051c602804d00536300504e00501002801400536300500f005", + "0x1302801800536300501400509202801700536300503000504e028030005", + "0x2847e00502804d0283600053630050170050140283610053630051c6005", + "0x536300502803002801b00536300500f005031028028363005028007028", + "0x501302801800536300501b00509202835f00536300501c00501702801c", + "0x536300736000501802836000536300535f005014028361005363005013", + "0x1800503102802836300502836102802836300502800702801f00547f35e", + "0x736300735e00a007253028020005363005020005092028020005363005", + "0x2802d00536300502000503102802836300502800702802300548035c35d", + "0x736100500f02802d00536300502d00509202835d00536300535d00504f", + "0x536300502d0050310280283630050280070280840054810c035b007363", + "0x509202835b00536300535b0050130281a80053630050c0005010028359", + "0x736300735b00500f0281a80053630051a800501b028359005363005359", + "0x28364005363005359005031028028363005028007028356005482032357", + "0x5364005092028357005363005357005013028033005363005032005010", + "0x3c00c00736300735700500f02803300536300503300501b028364005363", + "0x3c00535f02802836300500c00501c028028363005028007028036005483", + "0x527502802836300503300501f0280283630051a800501f028028363005", + "0x2821900536300502802002804000536300536400503102802836300535c", + "0x521d21900735c02821d00536300521d00501b02821d00536300502835d", + "0x2823100536300522722d00702d02822d005363005028023028227005363", + "0x504000509202835d00536300535d00504f02804600536300523100535b", + "0x50460053630050460050840280070053630050070050c0028040005363", + "0x3102802836300503600501c02802836300502800702804600704035d00a", + "0x5363005048005092028047005363005028359028048005363005364005", + "0x24204500736300704704835d0313570280470053630050470051a8028048", + "0x1c602824a005363005242005031028028363005028007028249246007484", + "0x24b00736300524b00538d02802836300502800b02824b005363005033005", + "0x534202824a00536300524a00509202804500536300504500504f02824c", + "0x2836300524b00501f02802836300502800702824f00548502836300724c", + "0x36300524a00503102802836300535c0052750280283630051a800501f028", + "0x4d0282560053630050070050c0028253005363005252005092028252005", + "0x503102802836300524f005340028028363005028007028028486005028", + "0x35c00736300535c0050dc02805000536300502802002825800536300524a", + "0x1c602805800536300505b05000735c02805b00536300500900538f028009", + "0x5c05800735c02805c05900736300505900538d0280590053630051a8005", + "0x27700536300527524b00732602827500536300502824a02826c005363005", + "0x503602805e00536300527726c00735c02827700536300527700501b028", + "0x536300505f00521902802836300506000504002805f06000736300505e", + "0xb27702805d00536300505d00505b02825800536300525800509202805d", + "0x50280070280693060670314870422bc2af03136300705d05935c007258", + "0x50310282af0053630052af005092028028363005042005242028028363", + "0x53630052bc0050c00282530053630050680050920280680053630052af", + "0x363005006005036028006005363005028020028028363005028361028256", + "0x21d02834700536300507100521902802836300506f00504002807106f007", + "0x36300504500504f028075005363005074005227028074005363005347005", + "0x840282560053630052560050c0028253005363005253005092028045005", + "0x36102802836300502800702807525625304500a005075005363005075005", + "0x77005363005067005031028067005363005067005092028028363005028", + "0x34500535b02834500536300506934600702d028346005363005028023028", + "0x7700536300507700509202804500536300504500504f028043005363005", + "0x7704500a0050430053630050430050840283060053630053060050c0028", + "0x503300501f0280283630051a800501f028028363005028007028043306", + "0x2802002807a00536300524900503102802836300535c005275028028363", + "0x2807f00536300507f00501b02807f005363005028046028079005363005", + "0x34208100702d02808100536300502802302834200536300507f07900735c", + "0x24600536300524600504f02834000536300507d00535b02807d005363005", + "0x3400050840280070053630050070050c002807a00536300507a005092028", + "0x35600501c02802836300502800702834000707a24600a005340005363005", + "0x50310280283630051a800501f02802836300535c005275028028363005", + "0x2833d00536300502805e02833e00536300502802002833f005363005359", + "0x502802302833c00536300533d33e00735c02833d00536300533d00501b", + "0x8c00536300533700535b02833700536300533c33b00702d02833b005363", + "0x70050c002833f00536300533f00509202835d00536300535d00504f028", + "0x702808c00733f35d00a00508c00536300508c005084028007005363005", + "0x3102802836300535c00527502802836300508400501c028028363005028", + "0x8a00536300502804802833500536300502802002833600536300502d005", + "0x2802302833400536300508a33500735c02808a00536300508a00501b028", + "0x536300508800535b02808800536300533433300702d028333005363005", + "0x50c002833600536300533600509202835d00536300535d00504f028332", + "0x2833200733635d00a005332005363005332005084028007005363005007", + "0x33100536300502000503102802836300536100501c028028363005028007", + "0x502804d02808600536300533100509202833000536300502300504f028", + "0x36300501f005047028028363005028361028028363005028007028028488", + "0xa00504f02808e00536300501800503102802836300536100501c028028", + "0x2836f00536300502802002808600536300508e005092028330005363005", + "0x532d36f00735c02832d00536300532d00501b02832d005363005028045", + "0x2832a00536300532c32b00702d02832b00536300502802302832c005363", + "0x508600509202833000536300533000504f02832900536300532a00535b", + "0x53290053630053290050840280070053630050070050c0028086005363", + "0x3102802836300503100524202802836300502800702832900708633000a", + "0x326005363005028046028327005363005028020028328005363005092005", + "0x2802302808b00536300532632700735c02832600536300532600501b028", + "0x536300532400535b02832400536300508b32500702d028325005363005", + "0x50c002832800536300532800509202804f00536300504f00504f028323", + "0x2832300732804f00a005323005363005323005084028007005363005007", + "0x2800f09200748904f00b007363007007005007005028028363005028028", + "0x536300500a00500a02801000536300504f005031028028363005028007", + "0x500f02801000536300501000509202800b00536300500b00504f0281c6", + "0x501000503102802836300502800702801400548a01304e0073630071c6", + "0x2804e00536300504e00501302803000536300501300501002804d005363", + "0x704e00500f02803000536300503000501b02804d00536300504d005092", + "0x536300504d00503102802836300502800702836100548b018017007363", + "0x509202801700536300501700501302801b005363005018005010028360", + "0x736300701700500f02801b00536300501b00501b028360005363005360", + "0x2801f00536300536000503102802836300502800702835e00548c35f01c", + "0x501f00509202801c00536300501c00501302802000536300535f005010", + "0x35c35d00736300701c00500f02802000536300502000501b02801f005363", + "0x35c00535f02802836300535d00501c02802836300502800702802300548d", + "0x501f02802836300502000501f02802836300503000501f028028363005", + "0x2835b00536300502802002802d00536300501f00503102802836300501b", + "0x50c035b00735c0280c00053630050c000501b0280c000536300502835d", + "0x281a800536300508435900702d028359005363005028023028084005363", + "0x500b00504f0280280053630050280050c70283570053630051a800535b", + "0x280310053630050310050c002802d00536300502d00509202800b005363", + "0x2836300502800702835703102d00b02800b005357005363005357005084", + "0x36300502835902803200536300501f00503102802836300502300501c028", + "0x3570283560053630053560051a8028032005363005032005092028356005", + "0x2802836300502800702803c00c00748e03336400736300735603200b031", + "0x501b0051c60280400053630050300051c6028036005363005033005031", + "0x4f02822700536300502833b02821d0053630050200051c6028219005363", + "0x3630050280050c7028036005363005036005092028364005363005364005", + "0x1b02804000536300504000501b0280310053630050310050c0028028005", + "0x2803636400f0c602821d00536300521d00501b028219005363005219005", + "0x536300704700533602804704804623122d00b36300521d219040227031", + "0x503102802836300504500533502802836300502800702824200548f045", + "0x24a007363005249005036028249005363005028020028246005363005231", + "0x24c00521d02824c00536300524b00521902802836300524a00504002824b", + "0x460053630050460050c702825200536300524f00522702824f005363005", + "0x480050c002824600536300524600509202822d00536300522d00504f028", + "0x2825204824622d04600b005252005363005252005084028048005363005", + "0x536300524200535b028253005363005231005031028028363005028007", + "0x509202822d00536300522d00504f0280460053630050460050c7028256", + "0x53630052560050840280480053630050480050c0028253005363005253", + "0x36300503000501f02802836300502800702825604825322d04600b005256", + "0x503c00503102802836300501b00501f02802836300502000501f028028", + "0x501b028009005363005028046028050005363005028020028258005363", + "0x536300502802302805b00536300500905000735c028009005363005009", + "0xc702805c00536300505900535b02805900536300505b05800702d028058", + "0x36300525800509202800c00536300500c00504f028028005363005028005", + "0xb00505c00536300505c0050840280310053630050310050c0028258005", + "0x1f02802836300535e00501c02802836300502800702805c03125800c028", + "0x26c00536300536000503102802836300503000501f02802836300501b005", + "0x36300527700501b02827700536300502805e028275005363005028020028", + "0x2d02806000536300502802302805e00536300527727500735c028277005", + "0x50280050c702805d00536300505f00535b02805f00536300505e060007", + "0x2826c00536300526c00509202800b00536300500b00504f028028005363", + "0x26c00b02800b00505d00536300505d0050840280310053630050310050c0", + "0x503000501f02802836300536100501c02802836300502800702805d031", + "0x280480282bc0053630050280200282af00536300504d005031028028363", + "0x53630050422bc00735c02804200536300504200501b028042005363005", + "0x535b02806900536300506730600702d028306005363005028023028067", + "0x536300500b00504f0280280053630050280050c7028068005363005069", + "0x50840280310053630050310050c00282af0053630052af00509202800b", + "0x1c0280283630050280070280680312af00b02800b005068005363005068", + "0x6f005363005028020028006005363005010005031028028363005014005", + "0x7106f00735c02807100536300507100501b028071005363005028045028", + "0x7500536300534707400702d028074005363005028023028347005363005", + "0xb00504f0280280053630050280050c702807700536300507500535b028", + "0x310053630050310050c002800600536300500600509202800b005363005", + "0x36300502800702807703100600b02800b005077005363005077005084028", + "0x502802002834600536300500f00503102802836300500a005242028028", + "0x35c02804300536300504300501b028043005363005028046028345005363", + "0x507a07900702d02807900536300502802302807a005363005043345007", + "0x280280053630050280050c702834200536300507f00535b02807f005363", + "0x50310050c002834600536300534600509202809200536300509200504f", + "0x2802834203134609202800b005342005363005342005084028031005363", + "0x702801000f00749009204f007363007031005007005028028363005028", + "0x4e00536300500b00500a0281c6005363005092005031028028363005028", + "0x4e00500f0281c60053630051c600509202804f00536300504f00504f028", + "0x3630051c600503102802836300502800702804d005491014013007363007", + "0xb0280180053630050170051c6028017005363005014005010028030005", + "0x30005363005030005092028013005363005013005013028028363005028", + "0x1b00549236036100736300701300500f02801800536300501800501b028", + "0x36300536000525602801c005363005030005031028028363005028007028", + "0x25802801f00536300536100501302835e00536300501c00509202835f005", + "0x3102802836300502800702802849300502804d02802000536300535f005", + "0x536300535c00505002835c00536300502803002835d005363005030005", + "0x525802801f00536300501b00501302835e00536300535d005092028023", + "0x502800702835b00549402d005363007020005009028020005363005023", + "0x1c602808400536300502d0050100280c000536300535e005031028028363", + "0x3630050c000509202835900536300535900501b028359005363005084005", + "0x280070283643560320314953571a800736300735904f0070ac0280c0005", + "0x281a80053630051a800504f0280330053630050c0005031028028363005", + "0x2803600549603c00c00736300701f00500f028033005363005033005092", + "0x536300503c005256028040005363005033005031028028363005028007", + "0x525802822700536300500c00501302821d005363005040005092028219", + "0x503102802836300502800702802849700502804d02822d005363005219", + "0x48005363005046005050028046005363005028030028231005363005033", + "0x4800525802822700536300503600501302821d005363005231005092028", + "0x36300502800702804500549804700536300722d00500902822d005363005", + "0x51c602824600536300504700501002824200536300521d005031028028", + "0x536300524200509202824900536300524900501b028249005363005246", + "0x502800702825224f24c03149924b24a0073630072491a80070ac028242", + "0x9202824a00536300524a00504f028253005363005242005031028028363", + "0x702805000549a25825600736300722700500f028253005363005253005", + "0x535f02802836300525600501c028028363005028361028028363005028", + "0x1f02802836300524b00530a02802836300535700530a028028363005258", + "0x5b005363005028020028009005363005253005031028028363005018005", + "0x5805b00735c02805800536300505800501b02805800536300502835d028", + "0x26c00536300505905c00702d02805c005363005028023028059005363005", + "0x24a00504f0280280053630050280050c702827500536300526c00535b028", + "0x900536300500900509202800700536300500700530102824a005363005", + "0x24a02804f00527500536300527500508402800a00536300500a0050c0028", + "0x503102802836300505000501c02802836300502800702827500a009007", + "0x27700536300527700509202805e005363005028359028277005363005253", + "0x49b05f06000736300705e27724a03135702805e00536300505e0051a8028", + "0x505f0050310280283630050283610280283630050280070282af05d007", + "0x53630050420180070cb02804200536300524b3570070c90282bc005363", + "0x2bc00509202806000536300506000504f02830600536300502833b028067", + "0x280053630050280050c70280070053630050070053010282bc005363005", + "0x600922fa0280670053630050670050cf02800a00536300500a0050c0028", + "0x734700533602834707106f00606806904f36300506730600a0280072bc", + "0x2802836300507400533502802836300502800702807500549c074005363", + "0x363005346005036028346005363005028020028077005363005068005031", + "0x21d02807a005363005043005219028028363005345005040028043345007", + "0x36300506f0050c702807f00536300507900522702807900536300507a005", + "0x9202800600536300500600530102806900536300506900504f02806f005", + "0x36300507f0050840280710053630050710050c0028077005363005077005", + "0x6800503102802836300502800702807f07107700606906f04f00507f005", + "0x6f00536300506f0050c702808100536300507500535b028342005363005", + "0x34200509202800600536300500600530102806900536300506900504f028", + "0x810053630050810050840280710053630050710050c0028342005363005", + "0x2836300502836102802836300502800702808107134200606906f04f005", + "0x36300501800501f02802836300524b00530a02802836300535700530a028", + "0x502804602834000536300502802002807d0053630052af005031028028", + "0x33e00536300533f34000735c02833f00536300533f00501b02833f005363", + "0x33c00535b02833c00536300533e33d00702d02833d005363005028023028", + "0x5d00536300505d00504f0280280053630050280050c702833b005363005", + "0xa0050c002807d00536300507d005092028007005363005007005301028", + "0x33b00a07d00705d02804f00533b00536300533b00508402800a005363005", + "0x2802836300524f00530a028028363005028361028028363005028007028", + "0x2836300535700530a02802836300522700501c02802836300525200530a", + "0x524c00504f02833700536300524200503102802836300501800501f028", + "0x2800702802849d00502804d02833600536300533700509202808c005363", + "0x22700501c028028363005045005047028028363005028361028028363005", + "0x503102802836300501800501f02802836300535700530a028028363005", + "0x536300533500509202808c0053630051a800504f02833500536300521d", + "0x2804d02833400536300533600530702808a00536300508c005390028336", + "0x535600530a02802836300502836102802836300502800702802849e005", + "0x1800501f02802836300501f00501c02802836300536400530a028028363", + "0x2808800536300503200504f0283330053630050c0005031028028363005", + "0x2802836300502800702802849f00502804d028332005363005333005092", + "0x2802836300501f00501c02802836300535b005047028028363005028361", + "0x36300504f00504f02833100536300535e00503102802836300501800501f", + "0x30702808a005363005088005390028332005363005331005092028088005", + "0x36300533400530702833000536300508a005390028334005363005332005", + "0x36300504d00501c0280283630050280070280284a000502804d028086005", + "0x509202833000536300504f00504f02808e0053630051c6005031028028", + "0x2832d00536300502804502836f00536300502802002808600536300508e", + "0x502802302832c00536300532d36f00735c02832d00536300532d00501b", + "0x32900536300532a00535b02832a00536300532c32b00702d02832b005363", + "0x700530102833000536300533000504f0280280053630050280050c7028", + "0xa00536300500a0050c0028086005363005086005092028007005363005", + "0x502800702832900a08600733002804f005329005363005329005084028", + "0x2802002832800536300501000503102802836300500b005242028028363", + "0x2832600536300532600501b028326005363005028046028327005363005", + "0x8b32500702d02832500536300502802302808b00536300532632700735c", + "0x280053630050280050c702832300536300532400535b028324005363005", + "0x32800509202800700536300500700530102800f00536300500f00504f028", + "0x32300536300532300508402800a00536300500a0050c0028328005363005", + "0x700502800700502802836300502802802832300a32800700f02804f005", + "0x36300500b00503102802836300502800702809204f0074a100b00a007363", + "0xa00504f02802836300502800b02801000536300503100500a02800f005", + "0x1c600736300701000500f02800f00536300500f00509202800a005363005", + "0x1002801400536300500f0050310280283630050280070280130054a204e", + "0x36300503000504e02803000536300504d0051c602804d00536300504e005", + "0x140283610053630051c6005013028018005363005014005092028017005", + "0x310280283630050280070280284a300502804d028360005363005017005", + "0x536300501c00501702801c00536300502803002801b00536300500f005", + "0x501402836100536300501300501302801800536300501b00509202835f", + "0x502800702801f0054a435e00536300736000501802836000536300535f", + "0x20005092028020005363005018005031028028363005028361028028363", + "0x280070280230054a535c35d00736300735e00a007253028020005363005", + "0x2835d00536300535d00504f02802d005363005020005031028028363005", + "0x280840054a60c035b00736300736100500f02802d00536300502d005092", + "0x53630050c000501002835900536300502d005031028028363005028007", + "0x535b00501302802836300502800b0283570053630051a80051c60281a8", + "0x2835700536300535700501b02835900536300535900509202835b005363", + "0x50310280283630050280070283640054a735603200736300735b00500f", + "0x536300503300509202800c005363005356005256028033005363005359", + "0x2804d02804000536300500c00525802803600536300503200501302803c", + "0x280300282190053630053590050310280283630050280070280284a8005", + "0x3c00536300521900509202822700536300521d00505002821d005363005", + "0x40005009028040005363005227005258028036005363005364005013028", + "0x536300503c0050310280283630050280070282310054a922d005363007", + "0x501b0280470053630050480051c602804800536300522d005010028046", + "0x36300704735d0070ac028046005363005046005092028047005363005047", + "0x36300504600503102802836300502800702824a2492460314aa242045007", + "0xf02824b00536300524b00509202804500536300504500504f02824b005", + "0x24b0050310280283630050280070282520054ab24f24c007363007036005", + "0x25800536300525300509202825600536300524f005256028253005363005", + "0x502804d02800900536300525600525802805000536300524c005013028", + "0x502803002805b00536300524b0050310280283630050280070280284ac", + "0x2825800536300505b005092028059005363005058005050028058005363", + "0x7009005009028009005363005059005258028050005363005252005013", + "0x27500536300525800503102802836300502800702826c0054ad05c005363", + "0x5e00501b02805e0053630052770051c602827700536300505c005010028", + "0x736300705e0450070ac02827500536300527500509202805e005363005", + "0x53630052750050310280283630050280070282bc2af05d0314ae05f060", + "0x500f02804200536300504200509202806000536300506000504f028042", + "0x3630050283610280283630050280070280690054af306067007363007050", + "0x535700501f02802836300530600535f02802836300506700501c028028", + "0x24200530a02802836300535c00527502802836300505f00530a028028363", + "0x35d028006005363005028020028068005363005042005031028028363005", + "0x36300506f00600735c02806f00536300506f00501b02806f005363005028", + "0x35b02807400536300507134700702d028347005363005028023028071005", + "0x36300506800509202806000536300506000504f028075005363005074005", + "0xa0050750053630050750050840280070053630050070050c0028068005", + "0x503102802836300506900501c028028363005028007028075007068060", + "0x77005363005077005092028346005363005028359028077005363005042", + "0x4b00433450073630073460770600313570283460053630053460051a8028", + "0x504300503102802836300502836102802836300502800702807907a007", + "0x2808100536300505f2420070c902834200536300502802002807f005363", + "0x52f402833f34000736300507d00539102807d0053630050813570070cb", + "0x33f00736300533f0050d402833f00536300533f0050cf028028363005340", + "0x51c602802836300533c0050d502833c33d00736300533e0052f302833e", + "0x36300533f0052f302833700536300533b34200735c02833b00536300533d", + "0x2808a33500736300533600539202802836300508c00501f02833608c007", + "0x33333700735c0283330053630053340050b90283340053630053350052f1", + "0x3310053630053320050b902833200536300508a0052f1028088005363005", + "0x3300050360280860053630050282f002833000536300533108800735c028", + "0x32d00536300536f00521902802836300508e00504002836f08e007363005", + "0x32d00505b02808600536300508600501b02807f00536300507f005092028", + "0x32d08635c00707f00b27702834500536300534500504f02832d005363005", + "0x52420280283630050280070283273283290314b132a32b32c031363007", + "0x32600536300532c00503102832c00536300532c00509202802836300532a", + "0x32500504002832432500736300508b00503602808b005363005028020028", + "0x2832000536300532300521d028323005363005324005219028028363005", + "0x532600509202834500536300534500504f028085005363005320005227", + "0x508500536300508500508402832b00536300532b0050c0028326005363", + "0x2832900536300532900509202802836300502800702808532b32634500a", + "0x532709500702d028095005363005028023028093005363005329005031", + "0x2834500536300534500504f02809800536300531f00535b02831f005363", + "0x50980050840283280053630053280050c0028093005363005093005092", + "0x36300502836102802836300502800702809832809334500a005098005363", + "0x535c00527502802836300505f00530a02802836300535700501f028028", + "0x2802002831e00536300507900503102802836300524200530a028028363", + "0x2831d00536300531d00501b02831d005363005028046028096005363005", + "0x31c31a00702d02831a00536300502802302831c00536300531d09600735c", + "0x7a00536300507a00504f02831800536300531900535b028319005363005", + "0x3180050840280070053630050070050c002831e00536300531e005092028", + "0x502836102802836300502800702831800731e07a00a005318005363005", + "0x5000501c0280283630052bc00530a0280283630052af00530a028028363", + "0x527502802836300524200530a02802836300535700501f028028363005", + "0x31600536300505d00504f02831700536300527500503102802836300535c", + "0x283630050280070280284b200502804d028315005363005317005092028", + "0x2836300505000501c02802836300526c005047028028363005028361028", + "0x36300535c00527502802836300524200530a02802836300535700501f028", + "0x509202831600536300504500504f028314005363005258005031028028", + "0x5363005315005307028313005363005316005390028315005363005314", + "0x280283630050283610280283630050280070280284b300502804d028312", + "0x2836300503600501c02802836300524a00530a02802836300524900530a", + "0x36300504600503102802836300535c00527502802836300535700501f028", + "0x4d02830e00536300531100509202830f00536300524600504f028311005", + "0x2310050470280283630050283610280283630050280070280284b4005028", + "0x527502802836300535700501f02802836300503600501c028028363005", + "0x30f00536300535d00504f02830c00536300503c00503102802836300535c", + "0x30e00530702831300536300530f00539002830e00536300530c005092028", + "0x30b0053630053120053070280a9005363005313005390028312005363005", + "0x2802836300508400501c0280283630050280070280284b500502804d028", + "0x36300535d00504f0280b000536300502d00503102802836300535c005275", + "0x280480280ac00536300502802002830b0053630050b00050920280a9005", + "0x536300530a0ac00735c02830a00536300530a00501b02830a005363005", + "0x535b0280b60053630053080b400702d0280b4005363005028023028308", + "0x536300530b0050920280a90053630050a900504f0283050053630050b6", + "0xa900a0053050053630053050050840280070053630050070050c002830b", + "0x2000503102802836300536100501c02802836300502800702830500730b", + "0x3020053630050b900509202830300536300502300504f0280b9005363005", + "0x470280283630050283610280283630050280070280284b600502804d028", + "0x30100536300501800503102802836300536100501c02802836300501f005", + "0x502802002830200536300530100509202830300536300500a00504f028", + "0x35c0282ff0053630052ff00501b0282ff005363005028045028300005363", + "0x52fe0bf00702d0280bf0053630050280230282fe0053630052ff300007", + "0x2830300536300530300504f0282fc0053630052fd00535b0282fd005363", + "0x52fc0050840280070053630050070050c0028302005363005302005092", + "0x50310052420280283630050280070282fc00730230300a0052fc005363", + "0x280460280510053630050280200282fb005363005092005031028028363", + "0x536300538b05100735c02838b00536300538b00501b02838b005363005", + "0x535b0280dc00536300538c38d00702d02838d00536300502802302838c", + "0x53630052fb00509202804f00536300504f00504f02838f0053630050dc", + "0x4f00a00538f00536300538f0050840280070053630050070050c00282fb", + "0x4b704f00b00736300700702800700502802836300502802802838f0072fb", + "0x500a02801000536300504f00503102802836300502800702800f092007", + "0x536300501000509202800b00536300500b00504f0281c600536300500a", + "0x280283630050280070280140054b801304e0073630071c600500f028010", + "0x536300501000503102802836300501300535f02802836300504e00501c", + "0x501700501b02801700536300502835d02803000536300502802002804d", + "0x2836100536300502802302801800536300501703000735c028017005363", + "0xb00504f02801b00536300536000535b02836000536300501836100702d", + "0x4d00536300504d0050920280050053630050050052ea02800b005363005", + "0x500b00b00501b00536300501b0050840280310053630050310050c0028", + "0x1000503102802836300501400501c02802836300502800702801b03104d", + "0x2801c00536300501c00509202835f00536300502835902801c005363005", + "0x74b901f35e00736300735f01c00b03135702835f00536300535f0051a8", + "0x502833b02835c00536300501f00503102802836300502800702835d020", + "0x2835c00536300535c0050920280050053630050050052ea028023005363", + "0xc035b02d00a36300502303135c00500a0da0280310053630050310050c0", + "0x1a80054ba35900536300708400533602835e00536300535e00504f028084", + "0x536300535b005031028028363005359005335028028363005028007028", + "0x5040028364356007363005032005036028032005363005028020028357", + "0xc00536300503300521d028033005363005364005219028028363005356", + "0x2d0052ea02835e00536300535e00504f02803c00536300500c005227028", + "0xc00053630050c00050c002835700536300535700509202802d005363005", + "0x36300502800702803c0c035702d35e00b00503c00536300503c005084028", + "0x504f0280400053630051a800535b02803600536300535b005031028028", + "0x536300503600509202802d00536300502d0052ea02835e00536300535e", + "0x35e00b0050400053630050400050840280c00053630050c00050c0028036", + "0x2002821900536300535d0050310280283630050280070280400c003602d", + "0x22700536300522700501b02822700536300502804602821d005363005028", + "0x23100702d02823100536300502802302822d00536300522721d00735c028", + "0x536300502000504f02804800536300504600535b02804600536300522d", + "0x50c00282190053630052190050920280050053630050050052ea028020", + "0x4803121900502000b005048005363005048005084028031005363005031", + "0x536300500f00503102802836300500a005242028028363005028007028", + "0x524200501b028242005363005028046028045005363005028020028047", + "0x2824900536300502802302824600536300524204500735c028242005363", + "0x9200504f02824b00536300524a00535b02824a00536300524624900702d", + "0x470053630050470050920280050053630050050052ea028092005363005", + "0x509200b00524b00536300524b0050840280310053630050310050c0028", + "0x4bb04f00b00736300700700500700502802836300502802802824b031047", + "0x500a02801000536300504f00503102802836300502800702800f092007", + "0x536300501000509202800b00536300500b00504f0281c600536300500a", + "0x280283630050280070280140054bc01304e0073630071c600500f028010", + "0x504e00501302803000536300501300501002804d005363005010005031", + "0x2803000536300503000501b02804d00536300504d00509202804e005363", + "0x501c0280283630050280070283610054bd01801700736300704e00500f", + "0x3102802836300503000501f02802836300501800535f028028363005017", + "0x1c00536300502835d02801b00536300502802002836000536300504d005", + "0x2802302835f00536300501c01b00735c02801c00536300501c00501b028", + "0x536300501f00535b02801f00536300535f35e00702d02835e005363005", + "0x509202800b00536300500b00504f0280280053630050280050c7028020", + "0x53630050200050840280310053630050310050c0028360005363005360", + "0x36300536100501c02802836300502800702802003136000b02800b005020", + "0x35d00509202835c00536300502835902835d00536300504d005031028028", + "0x36300735c35d00b03135702835c00536300535c0051a802835d005363005", + "0x536300502d0050310280283630050280070280c035b0074be02d023007", + "0x2300504f0281a800536300502833b0283590053630050300051c6028084", + "0x280053630050280050c7028084005363005084005092028023005363005", + "0x2304f2e702835900536300535900501b0280310053630050310050c0028", + "0x536300703300533602803336435603235700b3630053591a8031028084", + "0x503102802836300500c00533502802836300502800702803c0054bf00c", + "0x219007363005040005036028040005363005028020028036005363005032", + "0x22700521d02822700536300521d00521902802836300521900504002821d", + "0x3560053630053560050c702823100536300522d00522702822d005363005", + "0x3640050c002803600536300503600509202835700536300535700504f028", + "0x2823136403635735600b005231005363005231005084028364005363005", + "0x536300503c00535b028046005363005032005031028028363005028007", + "0x509202835700536300535700504f0283560053630053560050c7028048", + "0x53630050480050840283640053630053640050c0028046005363005046", + "0x36300503000501f02802836300502800702804836404635735600b005048", + "0x50280460280450053630050280200280470053630050c0005031028028", + "0x24600536300524204500735c02824200536300524200501b028242005363", + "0x24a00535b02824a00536300524624900702d028249005363005028023028", + "0x35b00536300535b00504f0280280053630050280050c702824b005363005", + "0x24b0050840280310053630050310050c0028047005363005047005092028", + "0x501c02802836300502800702824b03104735b02800b00524b005363005", + "0x2824f00536300502802002824c005363005010005031028028363005014", + "0x525224f00735c02825200536300525200501b028252005363005028045", + "0x2825800536300525325600702d028256005363005028023028253005363", + "0x500b00504f0280280053630050280050c702805000536300525800535b", + "0x280310053630050310050c002824c00536300524c00509202800b005363", + "0x2836300502800702805003124c00b02800b005050005363005050005084", + "0x36300502802002800900536300500f00503102802836300500a005242028", + "0x735c02805800536300505800501b02805800536300502804602805b005", + "0x36300505905c00702d02805c00536300502802302805900536300505805b", + "0x4f0280280053630050280050c702827500536300526c00535b02826c005", + "0x3630050310050c0028009005363005009005092028092005363005092005", + "0x2802802827503100909202800b005275005363005275005084028031005", + "0x2800702809204f0074c000b00a007363007005028007005028028363005", + "0x2801000536300503100500a02800f00536300500b005031028028363005", + "0x701000500f02800f00536300500f00509202800a00536300500a00504f", + "0x536300500f0050310280283630050280070280130054c104e1c6007363", + "0x50920281c60053630051c600501302804d00536300504e005010028014", + "0x73630071c600500f02804d00536300504d00501b028014005363005014", + "0x35f02802836300503000501c0280283630050280070280180054c2017030", + "0x36100536300501400503102802836300504d00501f028028363005017005", + "0x36300501b00501b02801b00536300502835d028360005363005028020028", + "0x2d02835f00536300502802302801c00536300501b36000735c02801b005", + "0x500a00504f02801f00536300535e00535b02835e00536300501c35f007", + "0x280070053630050070050c002836100536300536100509202800a005363", + "0x2802836300502800702801f00736100a00a00501f00536300501f005084", + "0x536300502835902802000536300501400503102802836300501800501c", + "0x3135702835d00536300535d0051a802802000536300502000509202835d", + "0x3102802836300502800702835b02d0074c302335c00736300735d02000a", + "0x3590053630050282e50280840053630050280200280c0005363005023005", + "0x280d20281a800536300535908400735c02835900536300535900501b028", + "0x53630053571a800735c02835700536300535700501b028357005363005", + "0x4002803336400736300503200503602835600536300504d0051c6028032", + "0x53630050c000509202800c005363005033005219028028363005364005", + "0xa31102835c00536300535c00504f02800c00536300500c00505b0280c0", + "0x2836300502800702821d2190400314c403603c00736300700c3560070c0", + "0x502802002822700536300503c00503102803c00536300503c005092028", + "0x2802836300523100504002804623100736300522d00503602822d005363", + "0x504700522702804700536300504800521d028048005363005046005219", + "0x2822700536300522700509202835c00536300535c00504f028045005363", + "0x3622735c00a0050450053630050450050840280360053630050360050c0", + "0x5040005031028040005363005040005092028028363005028007028045", + "0x2824900536300521d24600702d028246005363005028023028242005363", + "0x524200509202835c00536300535c00504f02824a00536300524900535b", + "0x524a00536300524a0050840282190053630052190050c0028242005363", + "0x3102802836300504d00501f02802836300502800702824a21924235c00a", + "0x24f00536300502804602824c00536300502802002824b00536300535b005", + "0x2802302825200536300524f24c00735c02824f00536300524f00501b028", + "0x536300525600535b02825600536300525225300702d028253005363005", + "0x50c002824b00536300524b00509202802d00536300502d00504f028258", + "0x2825800724b02d00a005258005363005258005084028007005363005007", + "0x5000536300500f00503102802836300501300501c028028363005028007", + "0x36300505b00501b02805b005363005028045028009005363005028020028", + "0x2d02805900536300502802302805800536300505b00900735c02805b005", + "0x500a00504f02826c00536300505c00535b02805c005363005058059007", + "0x280070053630050070050c002805000536300505000509202800a005363", + "0x2802836300502800702826c00705000a00a00526c00536300526c005084", + "0x5363005028020028275005363005092005031028028363005031005242", + "0x27700735c02805e00536300505e00501b02805e005363005028046028277", + "0x536300506005f00702d02805f00536300502802302806000536300505e", + "0x509202804f00536300504f00504f0282af00536300505d00535b02805d", + "0x53630052af0050840280070053630050070050c0028275005363005275", + "0x36300700a0280070050280283630050280280282af00727504f00a0052af", + "0x536300500f0050310280283630050280070281c60100074c500f092007", + "0x509202809200536300509200504f02801300536300504f00500a02804e", + "0x280070280300054c604d01400736300701300500f02804e00536300504e", + "0x503102802836300504d00535f02802836300501400501c028028363005", + "0x2836100536300502835d02801800536300502802002801700536300504e", + "0x502802302836000536300536101800735c02836100536300536100501b", + "0x35f00536300501c00535b02801c00536300536001b00702d02801b005363", + "0x70050db0280050053630050050052e802809200536300509200504f028", + "0x170053630050170050920280310053630050310052ef028007005363005", + "0x509209200535f00536300535f00508402800b00536300500b0050c0028", + "0x3102802836300503000501c02802836300502800702835f00b017031007", + "0x536300535e00509202801f00536300502835902835e00536300504e005", + "0x35d02000736300701f35e09203135702801f00536300501f0051a802835e", + "0x33b02802d00536300535d00503102802836300502800702802335c0074c7", + "0x53630050070050db02802000536300502000504f02835b005363005028", + "0x50920280050053630050050052e80280310053630050310052ef028007", + "0x3590840c004f36300535b02d00503100702004f2e202802d00536300502d", + "0x283630050280070283640054c83560053630070320053360280323571a8", + "0x363005028020028033005363005357005031028028363005356005335028", + "0x21902802836300503c00504002803603c00736300500c00503602800c005", + "0x36300521900522702821900536300504000521d028040005363005036005", + "0xdb0281a80053630051a80052e80280c00053630050c000504f02821d005", + "0x3630050330050920283590053630053590052ef028084005363005084005", + "0x9200521d00536300521d00508402800b00536300500b0050c0028033005", + "0x536300535700503102802836300502800702821d00b0333590841a80c0", + "0x52e80280c00053630050c000504f02822d00536300536400535b028227", + "0x53630053590052ef0280840053630050840050db0281a80053630051a8", + "0x508402800b00536300500b0050c0028227005363005227005092028359", + "0x2836300502800702822d00b2273590841a80c009200522d00536300522d", + "0x363005028046028046005363005028020028231005363005023005031028", + "0x2804700536300504804600735c02804800536300504800501b028048005", + "0x524200535b02824200536300504704500702d028045005363005028023", + "0x280050053630050050052e802835c00536300535c00504f028246005363", + "0x52310050920280310053630050310052ef0280070053630050070050db", + "0x524600536300524600508402800b00536300500b0050c0028231005363", + "0x36300504f00524202802836300502800702824600b23103100700535c092", + "0x502804602824a0053630050280200282490053630051c6005031028028", + "0x24c00536300524b24a00735c02824b00536300524b00501b02824b005363", + "0x25200535b02825200536300524c24f00702d02824f005363005028023028", + "0x50053630050050052e802801000536300501000504f028253005363005", + "0x2490050920280310053630050310052ef0280070053630050070050db028", + "0x25300536300525300508402800b00536300500b0050c0028249005363005", + "0x702800700502802836300502802802825300b249031007005010092005", + "0x504f00503102802836300502800702800f0920074c904f00b007363007", + "0x2800b00536300500b00504f0281c600536300500a00500a028010005363", + "0x280140054ca01304e0073630071c600500f028010005363005010005092", + "0x2802836300501300535f02802836300504e00501c028028363005028007", + "0x536300502835d02803000536300502802002804d005363005010005031", + "0x2302801800536300501703000735c02801700536300501700501b028017", + "0x36300536000535b02836000536300501836100702d028361005363005028", + "0x920280050053630050050052e802800b00536300500b00504f02801b005", + "0x36300501b0050840280310053630050310050c002804d00536300504d005", + "0x501400501c02802836300502800702801b03104d00500b00b00501b005", + "0x509202835f00536300502835902801c005363005010005031028028363", + "0x735f01c00b03135702835f00536300535f0051a802801c00536300501c", + "0x36300501f00503102802836300502800702835d0200074cb01f35e007363", + "0x2802d0230073630050050052e10280050053630050050052e802835c005", + "0x536300535c00509202835e00536300535e00504f02802836300502800b", + "0x3160280283630050280070280c00054cc35b00536300702d00531702835c", + "0x53630050230052e802808400536300535c00503102802836300535b005", + "0x3170280840053630050840050920281a83590073630050230052e1028023", + "0x3630050283610280283630050280070280320054cd3570053630071a8005", + "0x5028020028356005363005084005031028028363005357005316028028", + "0x2802836300503300504002800c033007363005364005036028364005363", + "0x503600522702803600536300503c00521d02803c00536300500c005219", + "0x283590053630053590052e802835e00536300535e00504f028040005363", + "0x50400050840280310053630050310050c0028356005363005356005092", + "0x8400503102802836300502800702804003135635935e00b005040005363", + "0x22700536300521900509202821d0053630053590052e8028219005363005", + "0x283630050280070280284ce00502804d02822d0053630050320052e0028", + "0x23100509202821d0053630050230052e802823100536300535c005031028", + "0x35b02802836300502836102822d0053630050c00052e0028227005363005", + "0x36300521d0052e802835e00536300535e00504f02804600536300522d005", + "0x840280310053630050310050c002822700536300522700509202821d005", + "0x2802836300502800702804603122721d35e00b005046005363005046005", + "0x536300502804602804700536300502802002804800536300535d005031", + "0x2302824200536300504504700735c02804500536300504500501b028045", + "0x36300524900535b02824900536300524224600702d028246005363005028", + "0x920280050053630050050052e802802000536300502000504f02824a005", + "0x36300524a0050840280310053630050310050c0028048005363005048005", + "0x500a00524202802836300502800702824a03104800502000b00524a005", + "0x2804602824c00536300502802002824b00536300500f005031028028363", + "0x536300524f24c00735c02824f00536300524f00501b02824f005363005", + "0x535b02825600536300525225300702d028253005363005028023028252", + "0x53630050050052e802809200536300509200504f028258005363005256", + "0x50840280310053630050310050c002824b00536300524b005092028005", + "0x2800b00536300502824c02825803124b00509200b005258005363005258", + "0x502802836300502802802802836300502824f02809200536300502824c", + "0x3102802836300502800702804e1c60074cf01000f007363007005028007", + "0x2836300502800b02801400536300503100500a028013005363005010005", + "0x1400500f02801300536300501300509202800f00536300500f00504f028", + "0x3630050130050310280283630050280070280170054d003004d007363007", + "0x4e0283600053630053610051c6028361005363005030005010028018005", + "0x36300504d00501302801c00536300501800509202801b005363005360005", + "0x50280070280284d100502804d02835e00536300501b00501402835f005", + "0x501702802000536300502803002801f005363005013005031028028363", + "0x536300501700501302801c00536300501f00509202835d005363005020", + "0x35c0054d204f00536300735e00501802835e00536300535d00501402835f", + "0x2300536300501c005031028028363005028361028028363005028007028", + "0x725302802300536300502300509202804f00536300504f092007252028", + "0x230050310280283630050280070280c00054d335b02d00736300704f00f", + "0x8400536300508400509202802d00536300502d00504f028084005363005", + "0x310280283630050280070283570054d41a835900736300735f00500f028", + "0x500a00b00725202800a0053630051a8005010028032005363005084005", + "0x501302802836300502800b02835600536300500a0051c602800a005363", + "0x736300735900500f028032005363005032005092028359005363005359", + "0x2803c00536300503200503102802836300502800702800c0054d5033364", + "0x536400501302804000536300503c005092028036005363005033005256", + "0x280070280284d600502804d02821d005363005036005258028219005363", + "0x5002822d005363005028030028227005363005032005031028028363005", + "0x36300500c00501302804000536300522700509202823100536300522d005", + "0x54d704600536300721d00500902821d005363005231005258028219005", + "0x5363005040005031028028363005028361028028363005028007028048", + "0x219005219028242005363005028020028045005363005046005010028047", + "0x2d00536300502d00504f0282490053630050450051c6028246005363005", + "0x24200522d02824600536300524600505b028047005363005047005092028", + "0x24924224604702d00b05802824900536300524900501b028242005363005", + "0x280070282520054d824f00536300724c00505902824c24b24a031363005", + "0x25825600736300524f00505c02825300536300524b005031028028363005", + "0x280090054d905000536300725800526c028253005363005253005092028", + "0x536300525600500a02805b005363005253005031028028363005028007", + "0x54da05c05900736300705800500f02805b00536300505b005092028058", + "0x36300505c00535f02802836300505900501c02802836300502800702826c", + "0x535b00527502802836300535600501f028028363005050005040028028", + "0x2835d02827700536300502802002827500536300505b005031028028363", + "0x536300505e27700735c02805e00536300505e00501b02805e005363005", + "0x535b02805d00536300506005f00702d02805f005363005028023028060", + "0x536300527500509202824a00536300524a00504f0282af00536300505d", + "0x24a00a0052af0053630052af0050840280070053630050070050c0028275", + "0x5b00503102802836300526c00501c0280283630050280070282af007275", + "0x282bc0053630052bc0050920280420053630050283590282bc005363005", + "0x74db3060670073630070422bc24a0313570280420053630050420051a8", + "0x502833b028006005363005306005031028028363005028007028068069", + "0x280070053630050070050c002800600536300500600509202806f005363", + "0x505000522d02835600536300535600501b02835b00536300535b005332", + "0x4f02807434707103136300505035635b06f00700604f0df028050005363", + "0x280070280770054dc075005363007074005336028067005363005067005", + "0x20028346005363005071005031028028363005075005335028028363005", + "0x36300504300504002807a043007363005345005036028345005363005028", + "0x522702807f00536300507900521d02807900536300507a005219028028", + "0x536300534600509202806700536300506700504f02834200536300507f", + "0x6700a0053420053630053420050840283470053630053470050c0028346", + "0x535b028081005363005071005031028028363005028007028342347346", + "0x536300508100509202806700536300506700504f02807d005363005077", + "0x6700a00507d00536300507d0050840283470053630053470050c0028081", + "0x35600501f02802836300505000504002802836300502800702807d347081", + "0x2002834000536300506800503102802836300535b005275028028363005", + "0x33e00536300533e00501b02833e00536300502804602833f005363005028", + "0x33c00702d02833c00536300502802302833d00536300533e33f00735c028", + "0x536300506900504f02833700536300533b00535b02833b00536300533d", + "0x50840280070053630050070050c0028340005363005340005092028069", + "0x504702802836300502800702833700734006900a005337005363005337", + "0x27502802836300535600501f028028363005256005242028028363005009", + "0x536300524a00504f02808c00536300525300503102802836300535b005", + "0x3630050280070280284dd00502804d02833500536300508c005092028336", + "0x524b00503102802836300535600501f02802836300535b005275028028", + "0x2824a00536300524a00504f02833400536300525200535b02808a005363", + "0x53340050840280070053630050070050c002808a00536300508a005092", + "0x36300502836102802836300502800702833400708a24a00a005334005363", + "0x535b00527502802836300535600501f028028363005048005047028028", + "0x504f02833300536300504000503102802836300521900501c028028363", + "0x8800536300502802002833500536300533300509202833600536300502d", + "0x33208800735c02833200536300533200501b02833200536300502805e028", + "0x8600536300533133000702d028330005363005028023028331005363005", + "0x33500509202833600536300533600504f02808e00536300508600535b028", + "0x8e00536300508e0050840280070053630050070050c0028335005363005", + "0x2802836300535700501c02802836300502800702808e00733533600a005", + "0x536300508400503102802836300500b00506002802836300535b005275", + "0x532c00501b02832c00536300502804802832d00536300502802002836f", + "0x2832a00536300502802302832b00536300532c32d00735c02832c005363", + "0x2d00504f02832800536300532900535b02832900536300532b32a00702d", + "0x70053630050070050c002836f00536300536f00509202802d005363005", + "0x2836300502800702832800736f02d00a005328005363005328005084028", + "0x36300502300503102802836300500b00506002802836300535f00501c028", + "0x4d02808b0053630053270050920283260053630050c000504f028327005", + "0x35c0050470280283630050283610280283630050280070280284de005028", + "0x506002802836300500b00506002802836300535f00501c028028363005", + "0x32600536300500f00504f02832500536300501c005031028028363005092", + "0x36300502804502832400536300502802002808b005363005325005092028", + "0x2832000536300532332400735c02832300536300532300501b028323005", + "0x509300535b02809300536300532008500702d028085005363005028023", + "0x2808b00536300508b00509202832600536300532600504f028095005363", + "0x708b32600a0050950053630050950050840280070053630050070050c0", + "0x36300500b005060028028363005092005060028028363005028007028095", + "0x502802002831f00536300504e005031028028363005031005242028028", + "0x35c02831e00536300531e00501b02831e005363005028046028098005363", + "0x509631d00702d02831d00536300502802302809600536300531e098007", + "0x281c60053630051c600504f02831a00536300531c00535b02831c005363", + "0x531a0050840280070053630050070050c002831f00536300531f005092", + "0x502800700502802836300502802802831a00731f1c600a00531a005363", + "0x500b00503102802836300502800702809204f0074df00b00a007363007", + "0x2800a00536300500a00504f02801000536300503100500a02800f005363", + "0x280130054e004e1c600736300701000500f02800f00536300500f005092", + "0x536300504e00501002801400536300500f005031028028363005028007", + "0x501b0280140053630050140050920281c60053630051c600501302804d", + "0x280070280180054e10170300073630071c600500f02804d00536300504d", + "0x501f02802836300501700535f02802836300503000501c028028363005", + "0x2836000536300502802002836100536300501400503102802836300504d", + "0x501b36000735c02801b00536300501b00501b02801b00536300502835d", + "0x2835e00536300501c35f00702d02835f00536300502802302801c005363", + "0x536100509202800a00536300500a00504f02801f00536300535e00535b", + "0x501f00536300501f0050840280070053630050070050c0028361005363", + "0x3102802836300501800501c02802836300502800702801f00736100a00a", + "0x536300502000509202835d005363005028359028020005363005014005", + "0x2335c00736300735d02000a03135702835d00536300535d0051a8028020", + "0x200280c000536300502300503102802836300502800702835b02d0074e2", + "0x36300535908400735c02835900536300504d0051c6028084005363005028", + "0x2190280283630053570050400280323570073630051a80050360281a8005", + "0x36300536400522702836400536300535600521d028356005363005032005", + "0xc00280c00053630050c000509202835c00536300535c00504f028033005", + "0x330070c035c00a005033005363005033005084028007005363005007005", + "0x536300535b00503102802836300504d00501f028028363005028007028", + "0x503600501b02803600536300502804602803c00536300502802002800c", + "0x2821900536300502802302804000536300503603c00735c028036005363", + "0x2d00504f02822700536300521d00535b02821d00536300504021900702d", + "0x70053630050070050c002800c00536300500c00509202802d005363005", + "0x2836300502800702822700700c02d00a005227005363005227005084028", + "0x36300502802002822d00536300500f00503102802836300501300501c028", + "0x735c02804600536300504600501b028046005363005028045028231005", + "0x36300504804700702d028047005363005028023028048005363005046231", + "0x9202800a00536300500a00504f02824200536300504500535b028045005", + "0x3630052420050840280070053630050070050c002822d00536300522d005", + "0x36300503100524202802836300502800702824200722d00a00a005242005", + "0x5028046028249005363005028020028246005363005092005031028028", + "0x24b00536300524a24900735c02824a00536300524a00501b02824a005363", + "0x24f00535b02824f00536300524b24c00702d02824c005363005028023028", + "0x24600536300524600509202804f00536300504f00504f028252005363005", + "0x24604f00a0052520053630052520050840280070053630050070050c0028", + "0x74e300b00a007363007005028007005028028363005028028028252007", + "0x3100500a02800f00536300500b00503102802836300502800702809204f", + "0xf00536300500f00509202800a00536300500a00504f028010005363005", + "0x1c0280283630050280070280130054e404e1c600736300701000500f028", + "0x1400536300500f00503102802836300504e00535f0280283630051c6005", + "0x36300503000501b02803000536300502835d02804d005363005028020028", + "0x2d02801800536300502802302801700536300503004d00735c028030005", + "0x500a00504f02836000536300536100535b028361005363005017018007", + "0x280070053630050070050c002801400536300501400509202800a005363", + "0x2802836300502800702836000701400a00a005360005363005360005084", + "0x536300502835902801b00536300500f00503102802836300501300501c", + "0x3135702801c00536300501c0051a802801b00536300501b00509202801c", + "0x3102802836300502800702802001f0074e535e35f00736300701c01b00a", + "0x736300535c00503602835c00536300502802002835d00536300535e005", + "0x521d02835b00536300502d00521902802836300502300504002802d023", + "0x536300535f00504f0280840053630050c00052270280c000536300535b", + "0x50840280070053630050070050c002835d00536300535d00509202835f", + "0x503102802836300502800702808400735d35f00a005084005363005084", + "0x283570053630050280460281a8005363005028020028359005363005020", + "0x50280230280320053630053571a800735c02835700536300535700501b", + "0x3300536300536400535b02836400536300503235600702d028356005363", + "0x70050c002835900536300535900509202801f00536300501f00504f028", + "0x702803300735901f00a005033005363005033005084028007005363005", + "0x2800c005363005092005031028028363005031005242028028363005028", + "0x536300503600501b02803600536300502804602803c005363005028020", + "0x702d02821900536300502802302804000536300503603c00735c028036", + "0x36300504f00504f02822700536300521d00535b02821d005363005040219", + "0x840280070053630050070050c002800c00536300500c00509202804f005", + "0x502802836300502802802822700700c04f00a005227005363005227005", + "0x3102802836300502800702809204f0074e600b00a007363007005028007", + "0x36300500a00504f02801000536300503100500a02800f00536300500b005", + "0x4e704e1c600736300701000500f02800f00536300500f00509202800a005", + "0x4e00501002801400536300500f005031028028363005028007028013005", + "0x281c60053630051c600501302802836300504d00501f02804d005363005", + "0x280180054e80170300073630071c600500f028014005363005014005092", + "0x5363005017005010028361005363005014005031028028363005028007", + "0x501b028361005363005361005092028030005363005030005013028360", + "0x2800702835f0054e901c01b00736300703000500f028360005363005360", + "0x501f02802836300501c00535f02802836300501b00501c028028363005", + "0x2801f00536300502802002835e005363005361005031028028363005360", + "0x502001f00735c02802000536300502000501b02802000536300502835d", + "0x2802300536300535d35c00702d02835c00536300502802302835d005363", + "0x535e00509202800a00536300500a00504f02802d00536300502300535b", + "0x502d00536300502d0050840280070053630050070050c002835e005363", + "0x3102802836300535f00501c02802836300502800702802d00735e00a00a", + "0x536300535b0050920280c000536300502835902835b005363005361005", + "0x3590840073630070c035b00a0313570280c00053630050c00051a802835b", + "0x200280320053630053590050310280283630050280070283571a80074ea", + "0x36300536435600735c0283640053630053600051c6028356005363005028", + "0x21902802836300500c00504002803c00c007363005033005036028033005", + "0x36300504000522702804000536300503600521d02803600536300503c005", + "0xc002803200536300503200509202808400536300508400504f028219005", + "0x21900703208400a005219005363005219005084028007005363005007005", + "0x536300535700503102802836300536000501f028028363005028007028", + "0x522d00501b02822d00536300502804602822700536300502802002821d", + "0x2804600536300502802302823100536300522d22700735c02822d005363", + "0x1a800504f02804700536300504800535b02804800536300523104600702d", + "0x70053630050070050c002821d00536300521d0050920281a8005363005", + "0x2836300502800702804700721d1a800a005047005363005047005084028", + "0x36300502802002804500536300501400503102802836300501800501c028", + "0x735c02824600536300524600501b028246005363005028048028242005", + "0x36300524924a00702d02824a005363005028023028249005363005246242", + "0x9202800a00536300500a00504f02824c00536300524b00535b02824b005", + "0x36300524c0050840280070053630050070050c0028045005363005045005", + "0x36300501300501c02802836300502800702824c00704500a00a00524c005", + "0x502804502825200536300502802002824f00536300500f005031028028", + "0x25600536300525325200735c02825300536300525300501b028253005363", + "0x5000535b02805000536300525625800702d028258005363005028023028", + "0x24f00536300524f00509202800a00536300500a00504f028009005363005", + "0x24f00a00a0050090053630050090050840280070053630050070050c0028", + "0x5092005031028028363005031005242028028363005028007028009007", + "0x501b02805900536300502804602805800536300502802002805b005363", + "0x536300502802302805c00536300505905800735c028059005363005059", + "0x4f02827700536300527500535b02827500536300505c26c00702d02826c", + "0x3630050070050c002805b00536300505b00509202804f00536300504f005", + "0x502802802827700705b04f00a005277005363005277005084028007005", + "0x502800702809204f0074eb00b00a007363007005028007005028028363", + "0x4f02801000536300503100500a02800f00536300500b005031028028363", + "0x36300701000500f02800f00536300500f00509202800a00536300500a005", + "0x1400536300500f0050310280283630050280070280130054ec04e1c6007", + "0x36300502800b02802836300504d00501f02804d00536300504e005010028", + "0x500f0280140053630050140050920281c60053630051c6005013028028", + "0x50140050310280283630050280070280180054ed0170300073630071c6", + "0x2801b0053630053600051c6028360005363005017005010028361005363", + "0x503000501302835f00536300536100509202801c00536300501b00504e", + "0x280070280284ee00502804d02801f00536300501c00501402835e005363", + "0x1702835d005363005028030028020005363005014005031028028363005", + "0x36300501800501302835f00536300502000509202835c00536300535d005", + "0x54ef02300536300701f00501802801f00536300535c00501402835e005", + "0x536300535f00503102802836300502836102802836300502800702802d", + "0x4f00840c000736300702300a00736002835b00536300535b00509202835b", + "0xc000504f0281a800536300535b005031028028363005028007028359005", + "0x35700736300735e00500f0281a80053630051a80050920280c0005363005", + "0x100283640053630051a80050310280283630050280070283560054f1032", + "0x363005364005092028357005363005357005013028033005363005032005", + "0x4f203c00c00736300735700500f02803300536300503300501b028364005", + "0x503c00535f02802836300500c00501c028028363005028007028036005", + "0x36400503102802836300508400535e02802836300503300501f028028363", + "0x1b02821d00536300502835d028219005363005028020028040005363005", + "0x36300502802302822700536300521d21900735c02821d00536300521d005", + "0x2804600536300523100535b02823100536300522722d00702d02822d005", + "0x50070050c00280400053630050400050920280c00053630050c000504f", + "0x280070280460070400c000a005046005363005046005084028007005363", + "0x35902804800536300536400503102802836300503600501c028028363005", + "0x53630050470051a8028048005363005048005092028047005363005028", + "0x50280070282492460074f32420450073630070470480c0031357028047", + "0x3202824b0053630050330051c602824a005363005242005031028028363", + "0x36300524a00509202824f24b00736300524b00538d02824c005363005028", + "0xc02804500536300504500504f02824c00536300524c00503302824a005", + "0x50280070280502582560314f425325200736300724f08424c00724a00b", + "0x20028009005363005252005031028252005363005252005092028028363", + "0x36300505800503602805800536300524b05b00735c02805b005363005028", + "0x21d02826c00536300505c00521902802836300505900504002805c059007", + "0x36300504500504f02827700536300527500522702827500536300526c005", + "0x840282530053630052530050c0028009005363005009005092028045005", + "0x1f02802836300502800702827725300904500a005277005363005277005", + "0x536300525600503102825600536300525600509202802836300524b005", + "0x535b02805f00536300505006000702d02806000536300502802302805e", + "0x536300505e00509202804500536300504500504f02805d00536300505f", + "0x4500a00505d00536300505d0050840282580053630052580050c002805e", + "0x8400535e02802836300503300501f02802836300502800702805d25805e", + "0x460282bc0053630050280200282af005363005249005031028028363005", + "0x3630050422bc00735c02804200536300504200501b028042005363005028", + "0x35b02806900536300506730600702d028306005363005028023028067005", + "0x3630052af00509202824600536300524600504f028068005363005069005", + "0xa0050680053630050680050840280070053630050070050c00282af005", + "0x535e02802836300535600501c0280283630050280070280680072af246", + "0x2806f0053630050280200280060053630051a8005031028028363005084", + "0x507106f00735c02807100536300507100501b02807100536300502805e", + "0x2807500536300534707400702d028074005363005028023028347005363", + "0x50060050920280c00053630050c000504f02807700536300507500535b", + "0x50770053630050770050840280070053630050070050c0028006005363", + "0x3102802836300535e00501c0280283630050280070280770070060c000a", + "0x36300534600509202834500536300535900504f02834600536300535b005", + "0x283630050283610280283630050280070280284f500502804d028043005", + "0x36300535f00503102802836300535e00501c02802836300502d005047028", + "0x2002804300536300507a00509202834500536300500a00504f02807a005", + "0x7f00536300507f00501b02807f005363005028048028079005363005028", + "0x8100702d02808100536300502802302834200536300507f07900735c028", + "0x536300534500504f02834000536300507d00535b02807d005363005342", + "0x50840280070053630050070050c0028043005363005043005092028345", + "0x501c02802836300502800702834000704334500a005340005363005340", + "0x2833e00536300502802002833f00536300500f005031028028363005013", + "0x533d33e00735c02833d00536300533d00501b02833d005363005028045", + "0x2833700536300533c33b00702d02833b00536300502802302833c005363", + "0x533f00509202800a00536300500a00504f02808c00536300533700535b", + "0x508c00536300508c0050840280070053630050070050c002833f005363", + "0x3102802836300503100524202802836300502800702808c00733f00a00a", + "0x8a005363005028046028335005363005028020028336005363005092005", + "0x2802302833400536300508a33500735c02808a00536300508a00501b028", + "0x536300508800535b02808800536300533433300702d028333005363005", + "0x50c002833600536300533600509202804f00536300504f00504f028332", + "0x2833200733604f00a005332005363005332005084028007005363005007", + "0x2809204f0074f600b00a007363007005028007005028028363005028028", + "0x536300503100500a02800f00536300500b005031028028363005028007", + "0x500f02800f00536300500f00509202800a00536300500a00504f028010", + "0x500f0050310280283630050280070280130054f704e1c6007363007010", + "0x281c60053630051c600501302804d00536300504e005010028014005363", + "0x71c600500f02804d00536300504d00501b028014005363005014005092", + "0x53630050140050310280283630050280070280180054f8017030007363", + "0x5092028030005363005030005013028360005363005017005010028361", + "0x736300703000500f02836000536300536000501b028361005363005361", + "0x35f02802836300501b00501c02802836300502800702835f0054f901c01b", + "0x2802836300536000501f02802836300504d00501f02802836300501c005", + "0x536300502835d02801f00536300502802002835e005363005361005031", + "0x2302835d00536300502001f00735c02802000536300502000501b028020", + "0x36300502300535b02802300536300535d35c00702d02835c005363005028", + "0xc002835e00536300535e00509202800a00536300500a00504f02802d005", + "0x2d00735e00a00a00502d00536300502d005084028007005363005007005", + "0x536300536100503102802836300535f00501c028028363005028007028", + "0xc00051a802835b00536300535b0050920280c000536300502835902835b", + "0x283571a80074fa3590840073630070c035b00a0313570280c0005363005", + "0x35600536300502808a028032005363005359005031028028363005028007", + "0x3600051c602803300536300504d0051c6028364005363005356005334028", + "0x36300500c03c0072ee02803c03300736300503300538d02800c005363005", + "0x5033028032005363005032005092028040005363005028032028036005", + "0x536300503600501b028364005363005364005088028040005363005040", + "0x736300703636404000703200b00c02808400536300508400504f028036", + "0x536300521900509202802836300502800702823122d2270314fb21d219", + "0x4800735c028048005363005028020028046005363005219005031028219", + "0x363005045005040028242045007363005047005036028047005363005033", + "0x522702824900536300524600521d028246005363005242005219028028", + "0x536300504600509202808400536300508400504f02824a005363005249", + "0x8400a00524a00536300524a00508402821d00536300521d0050c0028046", + "0x22700509202802836300503300501f02802836300502800702824a21d046", + "0x2824c00536300502802302824b005363005227005031028227005363005", + "0x8400504f02825200536300524f00535b02824f00536300523124c00702d", + "0x22d00536300522d0050c002824b00536300524b005092028084005363005", + "0x2836300502800702825222d24b08400a005252005363005252005084028", + "0x36300535700503102802836300536000501f02802836300504d00501f028", + "0x25800501b028258005363005028046028256005363005028020028253005", + "0x900536300502802302805000536300525825600735c028258005363005", + "0x504f02805800536300505b00535b02805b00536300505000900702d028", + "0x53630050070050c00282530053630052530050920281a80053630051a8", + "0x3630050280070280580072531a800a005058005363005058005084028007", + "0x501400503102802836300504d00501f02802836300501800501c028028", + "0x501b02826c00536300502804802805c005363005028020028059005363", + "0x536300502802302827500536300526c05c00735c02826c00536300526c", + "0x4f02806000536300505e00535b02805e00536300527527700702d028277", + "0x3630050070050c002805900536300505900509202800a00536300500a005", + "0x502800702806000705900a00a005060005363005060005084028007005", + "0x2802002805f00536300500f00503102802836300501300501c028028363", + "0x282af0053630052af00501b0282af00536300502804502805d005363005", + "0x2bc04200702d0280420053630050280230282bc0053630052af05d00735c", + "0xa00536300500a00504f02830600536300506700535b028067005363005", + "0x3060050840280070053630050070050c002805f00536300505f005092028", + "0x3100524202802836300502800702830600705f00a00a005306005363005", + "0x46028068005363005028020028069005363005092005031028028363005", + "0x36300500606800735c02800600536300500600501b028006005363005028", + "0x35b02834700536300506f07100702d02807100536300502802302806f005", + "0x36300506900509202804f00536300504f00504f028074005363005347005", + "0xa0050740053630050740050840280070053630050070050c0028069005", + "0x4f00b00736300700502800700502802836300502836102807400706904f", + "0x38d02801000536300504f00503102802836300502800702800f0920074fc", + "0x501000509202800b00536300500b00504f0281c600a00736300500a005", + "0x2802836300502800702804e0054fd0283630071c6005342028010005363", + "0x3630050310050e102801300536300501000503102802836300500a00501f", + "0x2803000536300504d0052eb02804d0053630050140070072ec028014005", + "0x50300050e302801300536300501300509202800b00536300500b00504f", + "0x36300504e00534002802836300502800702803001300b031005030005363", + "0x2800b02801800536300500700500a028017005363005010005031028028", + "0x36036100736300701800500f028017005363005017005092028028363005", + "0x501002801c00536300501700503102802836300502800702801b0054fe", + "0x536300535e00504e02835e00536300535f0051c602835f005363005360", + "0x501402835d00536300536100501302802000536300501c00509202801f", + "0x50310280283630050280070280284ff00502804d02835c00536300501f", + "0x35b00536300502d00501702802d005363005028030028023005363005017", + "0x35b00501402835d00536300501b005013028020005363005023005092028", + "0x8400536300735c0050180280c000536300535d00521902835c005363005", + "0x5020005031028028363005028361028028363005028007028359005500", + "0x2803200536300502824a02835700536300508403100735c0281a8005363", + "0x1a800509202800b00536300500b00504f02835600536300503200a007326", + "0x35700536300535700522d0280c00053630050c000505b0281a8005363005", + "0x3640313630053563570c01a800b00b05802835600536300535600501b028", + "0x2802836300502836102802836300502800702800c03336403100500c033", + "0x536300502000503102802836300503100504002802836300500a00501f", + "0x2eb0280400053630050360c00072ec0280360053630053590052ed02803c", + "0x36300503c00509202800b00536300500b00504f028219005363005040005", + "0x36300502800702821903c00b0310052190053630052190050e302803c005", + "0x500700524202802836300503100504002802836300500a00501f028028", + "0x2804602822700536300502802002821d00536300500f005031028028363", + "0x536300522d22700735c02822d00536300522d00501b02822d005363005", + "0x52de02804800536300523104600702d028046005363005028023028231", + "0x536300521d00509202809200536300509200504f028047005363005048", + "0x2836300502836102804721d0920310050470053630050470050e302821d", + "0x2836300502800702809204f00750100b00a007363007005028007005028", + "0xa00504f02801000536300503100500a02800f00536300500b005031028", + "0x1c600736300701000500f02800f00536300500f00509202800a005363005", + "0x1002801400536300500f00503102802836300502800702801300550204e", + "0x36300503000501b02803000536300504d0051c602804d00536300504e005", + "0x280180053630051c600521902801700536300503000700735c028030005", + "0x501700522d02801400536300501400509202800a00536300500a00504f", + "0x36300501801701400a00a06802801800536300501800505b028017005363", + "0x501300501c02802836300502800702801b36036103100501b360361031", + "0x72d602835f00536300502803002801c00536300500f005031028028363", + "0x36300500a00504f02801f00536300535e0052d802835e00536300535f007", + "0x3100501f00536300501f0052d302801c00536300501c00509202800a005", + "0x3100524202802836300500700504002802836300502800702801f01c00a", + "0x4602835d005363005028020028020005363005092005031028028363005", + "0x36300535c35d00735c02835c00536300535c00501b02835c005363005028", + "0x2d202835b00536300502302d00702d02802d005363005028023028023005", + "0x36300502000509202804f00536300504f00504f0280c000536300535b005", + "0x3630050283610280c002004f0310050c00053630050c00052d3028020005", + "0x36300502800702809204f00750300b00a007363007005028007005028028", + "0x504f02801000536300500700500a02800f00536300500b005031028028", + "0x736300701000500f02800f00536300500f00509202800a00536300500a", + "0x2801400536300500f00503102802836300502800702801300550404e1c6", + "0x503000501b02803000536300504d0051c602804d00536300504e005010", + "0x180053630051c600521902801700536300503003100735c028030005363", + "0x1800505b02801400536300501400509202800a00536300500a00504f028", + "0x501701801400a00a07502801700536300501700522d028018005363005", + "0x1300501c02802836300502800702801b36036103100501b360361031363", + "0x2d602835f00536300502803002801c00536300500f005031028028363005", + "0x500a00504f02801f00536300535e0052d802835e00536300535f031007", + "0x501f00536300501f0052d302801c00536300501c00509202800a005363", + "0x504002802836300500700524202802836300502800702801f01c00a031", + "0x2835d005363005028020028020005363005092005031028028363005031", + "0x535c35d00735c02835c00536300535c00501b02835c005363005028046", + "0x2835b00536300502302d00702d02802d005363005028023028023005363", + "0x502000509202804f00536300504f00504f0280c000536300535b0052d2", + "0x50280200280c002004f0310050c00053630050c00052d3028020005363", + "0x35c02804f00536300504f00501b02804f00536300502824902800b005363", + "0xf00504002801000f00736300509200503602809200536300504f00b007", + "0x281c60053630051c600505b0281c6005363005010005219028028363005", + "0xa2d00280131c60073630051c60050e902804e1c60073630051c60050e9", + "0x2836300502800702801801703003150504d01400736300701304e005028", + "0x361005092028361005363005014005031028014005363005014005092028", + "0x35e35f01c03150601b36000736300703104d361031312028361005363005", + "0x363005360005031028360005363005360005092028028363005028007028", + "0x501b02801f00536300501f0050920280200053630050282ce02801f005", + "0x2303150735c35d0073630071c602001b01f00a311028020005363005020", + "0x35d00503102835d00536300535d00509202802836300502800702835b02d", + "0x2835900536300508400533402808400536300502808a0280c0005363005", + "0x53630050c00050920283570053630050280320281a80053630050282ce", + "0x501b0283590053630053590050880283570053630053570050330280c0", + "0x315083560320073630071a835935735c0c000b00c0281a80053630051a8", + "0x503102803200536300503200509202802836300502800702800c033364", + "0x536300503c0050920283560053630053560050c002803c005363005032", + "0x4702802836300502800702804000550903600536300700a0052cd02803c", + "0x21d00536300502803002821900536300503c005031028028363005036005", + "0x509202822d0053630052270050ec02822700536300521d0070072ca028", + "0x536300522d0050f00283560053630053560050c0028219005363005219", + "0x2802836300504000504702802836300502800702822d35621903100522d", + "0x536300502802002823100536300503c00503102802836300500700531c", + "0x4600735c02804800536300504800501b0280480053630050282c9028046", + "0x536300504704500702d028045005363005028023028047005363005048", + "0x50c00282310053630052310050920282460053630052420052c6028242", + "0x70282463562310310052460053630052460050f0028356005363005356", + "0x9202802836300500a00533e02802836300500700531c028028363005028", + "0x5363005028023028249005363005364005031028364005363005364005", + "0x9202824c00536300524b0052c602824b00536300500c24a00702d02824a", + "0x36300524c0050f00280330053630050330050c0028249005363005249005", + "0x2836300500700531c02802836300502800702824c03324903100524c005", + "0x502300503102802300536300502300509202802836300500a00533e028", + "0x2825300536300535b25200702d02825200536300502802302824f005363", + "0x502d0050c002824f00536300524f0050920282560053630052530052c6", + "0x502800702825602d24f0310052560053630052560050f002802d005363", + "0x1c600524202802836300500a00533e02802836300500700531c028028363", + "0x2825800536300501c00503102801c00536300501c005092028028363005", + "0x50090052c602800900536300535e05000702d028050005363005028023", + "0x2835f00536300535f0050c002825800536300525800509202805b005363", + "0x31c02802836300502800702805b35f25803100505b00536300505b0050f0", + "0x280283630051c600524202802836300500a00533e028028363005007005", + "0x36300503000503102803000536300503000509202802836300503100533d", + "0x2c602805c00536300501805900702d028059005363005028023028058005", + "0x3630050170050c002805800536300505800509202826c00536300505c005", + "0x36300502802002826c01705803100526c00536300526c0050f0028017005", + "0x4002800f09200736300500b00503602804f0053630050282c502800b005", + "0x73630050310050dc02801000536300500f005219028028363005092005", + "0x36300701004f1c600502800b27702804f00536300504f00501b0281c6031", + "0x501400524202802836300502800702801703004d03150a01401304e031", + "0x2002801800536300504e00503102804e00536300504e005092028028363", + "0x36300536036100735c02836000536300500a005327028361005363005028", + "0x52c402835f00536300501c00508102801c00536300502803002801b005", + "0x36300535e01b00735c02835e00536300535e00501b02835e00536300535f", + "0x4002835c35d00736300501f0050360280200053630050282c302801f005", + "0x536300501800509202802300536300535c00521902802836300535d005", + "0xb27702802300536300502300505b02802000536300502000501b028018", + "0x50280070281a835908403150b0c035b02d031363007023020031013018", + "0x2d00509202802836300500700531c0280283630050c0005242028028363", + "0x2803200536300502802002835700536300502d00503102802d005363005", + "0x535603200735c02835600536300535600501b0283560053630050282c2", + "0x2800c00536300536403300702d028033005363005028023028364005363", + "0x535b0050c002835700536300535700509202803c00536300500c0052c6", + "0x502800702803c35b35703100503c00536300503c0050f002835b005363", + "0x50310280840053630050840050920280283630051a8005040028028363", + "0x2190053630050400052c102804000536300502808a028036005363005084", + "0x2270050fa02802836300521d0050f802822721d0073630052190052be028", + "0x4600536300523100533402823100536300522d0052bd02822d005363005", + "0x5048005033028036005363005036005092028048005363005028032028", + "0x36300704604835903600a03c028046005363005046005088028048005363", + "0x504700509202802836300502800702824a24924603150c242045047031", + "0x1b02824c00536300502833302824b005363005047005031028047005363", + "0x524f00501b02824f00536300524c242007326028242005363005242005", + "0x2824b00536300524b0050920280450053630050450050c002824f005363", + "0x524b00503102802836300502800702825200550d02836300724f005342", + "0x282580053630052560070072ca028256005363005028030028253005363", + "0x50450050c00282530053630052530050920280500053630052580050ec", + "0x50280070280500452530310050500053630050500050f0028045005363", + "0x24b00503102802836300500700531c028028363005252005340028028363", + "0x1b0280580053630050282bb02805b005363005028020028009005363005", + "0x36300502802302805900536300505805b00735c028058005363005058005", + "0x2827500536300526c0052c602826c00536300505905c00702d02805c005", + "0x52750050f00280450053630050450050c0028009005363005009005092", + "0x36300500700531c028028363005028007028275045009031005275005363", + "0x28023028277005363005246005031028246005363005246005092028028", + "0x53630050600052c602806000536300524a05e00702d02805e005363005", + "0x50f00282490053630052490050c002827700536300527700509202805f", + "0x700531c02802836300502800702805f24927703100505f00536300505f", + "0x509202802836300503100527502802836300500a00533d028028363005", + "0x2af00536300502802302805d00536300504d00503102804d00536300504d", + "0x50920280420053630052bc0052c60282bc0053630050172af00702d028", + "0x53630050420050f00280300053630050300050c002805d00536300505d", + "0x736300700502800700502802836300502836102804203005d031005042", + "0x4e00536300500f0050310280283630050280070281c601000750e00f092", + "0x52ba0280140053630050130050fc02801300b00736300500b0052ba028", + "0x36300504e00509202809200536300509200504f02804d031007363005031", + "0x3102802836300502800702802850f02836300701404d0070fe02804e005", + "0x501700521902801704f00736300504f00507102803000536300504e005", + "0x36000536300536100521902836100a00736300500a005071028018005363", + "0x1c01b00736300736001800703000a2d0028030005363005030005092028", + "0x2801b00536300501b00509202802836300502800702801f35e35f031510", + "0x36300535d00532c02835d0053630050280fd02802000536300501b005031", + "0xfb02802000536300502000509202801c00536300501c0050c002835d005", + "0x2802836300502800702835b02d00751102335c00736300735d031092031", + "0x50c000509202835c00536300535c00504f0280c0005363005020005031", + "0x2802300536300502300532c02801c00536300501c0050c00280c0005363", + "0x504f00501302800b00536300500b00532c02800a00536300500a005013", + "0x3571a835908400a36300504f00b00a02301c0c035c09232b02804f005363", + "0x2802836300535b00508e0280283630050280070283571a835908400a005", + "0x2836300500a00501c02802836300500b00508e02802836300504f00501c", + "0x3630050282b9028356005363005028020028032005363005020005031028", + "0x2803300536300536435600735c02836400536300536400501b028364005", + "0x503c0052b802803c00536300503300c00702d02800c005363005028023", + "0x2803200536300503200509202802d00536300502d00504f028036005363", + "0x1c03202d00a00503600536300503600510402801c00536300501c0050c0", + "0x36300500b00508e02802836300504f00501c028028363005028007028036", + "0x535f00509202802836300503100508e02802836300500a00501c028028", + "0x2d02821900536300502802302804000536300535f00503102835f005363", + "0x509200504f02822700536300521d0052b802821d00536300501f219007", + "0x2835e00536300535e0050c0028040005363005040005092028092005363", + "0x2802836300502800702822735e04009200a005227005363005227005104", + "0x2836300500a00501c02802836300500b00508e02802836300504f00501c", + "0x23103100710602823100536300502803002822d00536300504e005031028", + "0x9200536300509200504f028048005363005046005105028046005363005", + "0x480051040280070053630050070050c002822d00536300522d005092028", + "0x4f00501c02802836300502800702804800722d09200a005048005363005", + "0x508e02802836300500a00501c02802836300500b00508e028028363005", + "0x280450053630050280200280470053630051c6005031028028363005031", + "0x524204500735c02824200536300524200501b028242005363005028046", + "0x2824a00536300524624900702d028249005363005028023028246005363", + "0x504700509202801000536300501000504f02824b00536300524a0052b8", + "0x524b00536300524b0051040280070053630050070050c0028047005363", + "0x736300700700500f02800700536300500500500a02824b00704701000a", + "0x2804f00536300500a00525602802836300502800702800b00551200a031", + "0x51300502804d02800f00536300504f005258028092005363005031005013", + "0x363005010005050028010005363005028030028028363005028007028028", + "0x7102800f0053630051c600525802809200536300500b0050130281c6005", + "0x700f00500902801300536300504e00521902804e092007363005092005", + "0x3000536300501400501002802836300502800702804d005514014005363", + "0x2800708602801700536300501700501b0280170053630050300051c6028", + "0x5013005242028028363005028007028360005515361018007363007017", + "0x51601c01b00736300709200500f02801800536300501800504f028028363", + "0x1b00501302835e00536300501c00525602802836300502800702835f005", + "0x702802851700502804d02802000536300535e00525802801f005363005", + "0x2835c00536300535d00505002835d005363005028030028028363005028", + "0x501f00507102802000536300535c00525802801f00536300535f005013", + "0x35b00536300702000500902802d00536300502300521902802301f007363", + "0x51c602808400536300535b0050100280283630050280070280c0005518", + "0x36300735901800708602835900536300535900501b028359005363005084", + "0x2802836300502d0052420280283630050280070280320055193571a8007", + "0x2803300551a36435600736300701f00500f0281a80053630051a800504f", + "0x536300500c0051c602800c005363005364005010028028363005028007", + "0x501402804000536300535600501302803600536300503c00504e02803c", + "0x2803002802836300502800702802851b00502804d028219005363005036", + "0x4000536300503300501302822700536300521d00501702821d005363005", + "0x21900501802822d005363005040005219028219005363005227005014028", + "0x3630072311a800725302802836300502800702804600551c231005363007", + "0x36300504735736103110302802836300502800702804500551d047048007", + "0x5b02804800536300504800504f0282460053630052420052b7028242005", + "0x2824622d0480310052460053630052460052b602822d00536300522d005", + "0x2802836300535700508e02802836300536100508e028028363005028007", + "0x2802836300502800702802851e00502804d02824900536300504500504f", + "0x2836300535700508e02802836300536100508e028028363005046005047", + "0x524a00510c02824a0053630050280300282490053630051a800504f028", + "0x524b00536300524b0052b602822d00536300522d00505b02824b005363", + "0x501c02802836300536100508e02802836300502800702824b22d249031", + "0x702802851f00502804d02824c00536300503200504f02802836300501f", + "0x1c02802836300536100508e0280283630050c0005047028028363005028", + "0x24f00536300502803002824c00536300501800504f02802836300501f005", + "0x2520052b602802d00536300502d00505b02825200536300524f00510c028", + "0x509200501c02802836300502800702825202d24c031005252005363005", + "0x502800702802852000502804d02825300536300536000504f028028363", + "0x2800504f02802836300509200501c02802836300504d005047028028363", + "0x2825800536300525600510c028256005363005028030028253005363005", + "0x2580132530310052580053630052580052b602801300536300501300505b", + "0x536300502824c02804f00536300502824c02800a00536300502824c028", + "0x36300502805d02801300536300502824c0281c600536300502824c02800f", + "0x36300502836102802836300502824f02801700536300502824c02804d005", + "0x552136036100736300701800500f02801800536300500700500a028028", + "0x536000501002801c00536300500500503102802836300502800702801b", + "0x35f00536300500b0051c602800b00536300500b04f00725202800b005363", + "0x36100500f02801c00536300501c005092028361005363005361005013028", + "0x36300501c00503102802836300502800702802000552201f35e007363007", + "0x4e02802300536300535c0051c602835c00536300501f00501002835d005", + "0x36300535e00501302835b00536300535d00509202802d005363005023005", + "0x502800702802852300502804d02808400536300502d0050140280c0005", + "0x50170281a800536300502803002835900536300501c005031028028363", + "0x536300502000501302835b0053630053590050920283570053630051a8", + "0x2190280320c00073630050c00050710280840053630053570050140280c0", + "0x9200536300708400501802802836300502800b028356005363005032005", + "0x725202803300536300535b005031028028363005028007028364005524", + "0x709202800725302803300536300503300509202809200536300509200f", + "0x2836300535600524202802836300502800702803600552503c00c007363", + "0x4000509202800c00536300500c00504f028040005363005033005031028", + "0x502800702822700552621d2190073630070c000500f028040005363005", + "0x9202823100536300521d00525602822d005363005040005031028028363", + "0x36300523100525802804800536300521900501302804600536300522d005", + "0x36300504000503102802836300502800702802852700502804d028047005", + "0x5092028246005363005242005050028242005363005028030028045005", + "0x5363005246005258028048005363005227005013028046005363005045", + "0x24b00552824a005363007047005009028249005363005048005219028047", + "0x36300524a00501002824c005363005046005031028028363005028007028", + "0x2824f0053630050310051c602803100536300503100a007252028031005", + "0x25603152925325200736300724f00c0070ac02824c00536300524c005092", + "0x25200504f02800900536300524c005031028028363005028007028050258", + "0x736300524925200710d02824900536300524900505b028252005363005", + "0x552a05900536300705800510b02800900536300500900509202805805b", + "0x505900510e02826c00536300500900503102802836300502800702805c", + "0x1400536300727700502502826c00536300526c005092028277275007363", + "0x500a02806000536300526c00503102802836300502800702805e00552b", + "0x36300506000509202801400536300501404d00706902805f005363005275", + "0x283630050280070282bc00552c2af05d00736300705f00500f028060005", + "0x5d00501302804e0053630052af005010028042005363005060005031028", + "0x536300504e01300725202804200536300504200509202805d005363005", + "0x2802836300502800702806900552d30606700736300705d00500f02804e", + "0x5067005013028010005363005306005010028068005363005042005031", + "0x100053630050101c6007252028068005363005068005092028067005363", + "0x3102802836300502800702807100552e06f00600736300706700500f028", + "0x36300504e0051c602803000536300506f005010028347005363005068005", + "0x280300053630050300170072520280750053630050100051c6028074005", + "0x53470050920280060053630050060050130280770053630050300051c6", + "0x36300502800702804300552f34534600736300700600500f028347005363", + "0x509202807900536300534500525602807a005363005347005031028028", + "0x536300507900525802834200536300534600501302807f00536300507a", + "0x536300534700503102802836300502800702802853000502804d028081", + "0x7d00509202833f00536300534000505002834000536300502803002807d", + "0x8100536300533f00525802834200536300504300501302807f005363005", + "0x503102802836300502800702833d00553133e005363007081005009028", + "0x3370053630050282b402833b00536300533e00501002833c00536300507f", + "0x5b00504f02833600536300533b0051c602808c005363005342005219028", + "0x8c00536300508c00505b02833c00536300533c00509202805b005363005", + "0x5b00b11602833600536300533600501b028337005363005337005114028", + "0x553233300536300733400511502833408a33503136300533633708c33c", + "0x533300511302833200536300508a005031028028363005028007028088", + "0x2b302833200536300533200509202802836300502800b028330331007363", + "0x533200503102802836300502800702808e005533086005363007330005", + "0x2802836300532d00511c02832c32d00736300508600512002836f005363", + "0x533100500a02832a00536300532b0052b202832b00536300532c00511b", + "0x2832700536300532900501302832800536300536f005092028329005363", + "0x2802836300502800702802853400502804d02832600536300532a005122", + "0x533100500a02832500536300508e00512402808b005363005332005031", + "0x2832700536300532400501302832800536300508b005092028324005363", + "0x70283200055353230053630073260052b0028326005363005325005122", + "0x85005363005085005092028085005363005328005031028028363005028", + "0x3102802836300502800702831f00553609509300736300732700500f028", + "0x36300509800509202831e005363005095005256028098005363005085005", + "0x4d02831c00536300531e00525802831d005363005093005013028096005", + "0x3002831a005363005085005031028028363005028007028028537005028", + "0x536300531a005092028318005363005319005050028319005363005028", + "0x521902831c00536300531800525802831d00536300531f005013028096", + "0x502800702831500553831600536300731c00500902831700536300531d", + "0x1c6028313005363005316005010028314005363005096005031028028363", + "0x36300531400509202831200536300531200501b028312005363005313005", + "0x280070280a930c30e03153930f3110073630073123350070ac028314005", + "0x2831100536300531100504f02830b005363005314005031028028363005", + "0x50920280ac0b000736300531731100710d02831700536300531700505b", + "0x502800702830800553a30a0053630070ac00510b02830b00536300530b", + "0x283050b600736300530a00510e0280b400536300530b005031028028363", + "0x702830300553b0b90053630073050050250280b40053630050b4005092", + "0x3010053630050b600500a0283020053630050b4005031028028363005028", + "0x2fe00553c2ff30000736300730100500f028302005363005302005092028", + "0x3630052ff0052560280bf005363005302005031028028363005028007028", + "0x2580282fb0053630053000050130282fc0053630050bf0050920282fd005", + "0x3102802836300502800702802853d00502804d0280510053630052fd005", + "0x536300538c00505002838c00536300502803002838b005363005302005", + "0x52580282fb0053630052fe0050130282fc00536300538b00509202838d", + "0x3630050dc0052190280dc2fb0073630052fb00507102805100536300538d", + "0x280283630050280070280c600553e0c700536300705100500902838f005", + "0x50cb0051c60280cb0053630050c70050100280c90053630052fc005031", + "0x280c90053630050c90050920280cf0053630050cf00501b0280cf005363", + "0x24202802836300502800702830700553f3902fa0073630070cf0b00072ae", + "0x53630052fa00504f0283910053630050c900503102802836300538f005", + "0x55400d42f40073630072fb00500f0283910053630053910050920282fa", + "0x50d40052560280d50053630053910050310280283630050280070282f3", + "0x282f00053630052f40050130282f10053630050d5005092028392005363", + "0x2802836300502800702802854100502804d0282ea005363005392005258", + "0x3630052e70050500282e70053630050280300280da005363005391005031", + "0x2580282f00053630052f30050130282f10053630050da0050920282e5005", + "0x3630072ea0050090280d20053630052f00052190282ea0053630052e5005", + "0x282ef0053630052f10050310280283630050280070280db0055422e8005", + "0x52e100501b0282e10053630052e20051c60282e20053630052e8005010", + "0x2e00073630072e12fa0072ae0282ef0053630052ef0050920282e1005363", + "0x4f0280e10053630052ef0050310280283630050280070282ee0055430df", + "0x50d22e000710d0280d20053630050d200505b0282e00053630052e0005", + "0xe30053630072eb00510b0280e10053630050e10050920282eb2ec007363", + "0x510e0282de0053630050e10050310280283630050280070282ed005544", + "0x3630072d80050250282de0053630052de0050920282d82d60073630050e3", + "0x50310280283630050283610280283630050280070282d20055452d3005", + "0xdf3900b930f32307707507401425303c35f0142ad0280e90053630052de", + "0x3630052ce2d60071270282ce0053630052d00052ac0282d00053630052d3", + "0x920282ec0053630052ec00504f0282ca0053630052cd0051290282cd005", + "0x282ca0e92ec0310052ca0053630052ca0051280280e90053630050e9005", + "0x23102802836300535f00501f028028363005028361028028363005028007", + "0x280283630050b90052420280283630053900052310280283630050df005", + "0x2836300507700501f02802836300532300512602802836300530f00530a", + "0x36300501400524202802836300507400501f02802836300507500501f028", + "0x52de00503102802836300503c00527502802836300525300530a028028", + "0x2c90053630050f02d60071270280f00053630052d20052ab0280ec005363", + "0xec0050920282ec0053630052ec00504f0282c60053630052c9005129028", + "0x280070282c60ec2ec0310052c60053630052c60051280280ec005363005", + "0x3c00527502802836300535f00501f028028363005028361028028363005", + "0x52420280283630053900052310280283630050df005231028028363005", + "0x1f02802836300532300512602802836300530f00530a0280283630050b9", + "0x2802836300507400501f02802836300507500501f028028363005077005", + "0x53630050e100503102802836300525300530a028028363005014005242", + "0x50920282ec0053630052ec00504f0282c40053630052ed0052a90282c5", + "0x70282c42c52ec0310052c40053630052c40051280282c50053630052c5", + "0x27502802836300535f00501f02802836300525300530a028028363005028", + "0x280283630050b900524202802836300539000523102802836300503c005", + "0x2836300507700501f02802836300532300512602802836300530f00530a", + "0x36300501400524202802836300507400501f02802836300507500501f028", + "0x50920282c20053630052ee00504f0282c30053630052ef005031028028", + "0x504702802836300502800702802854600502804d0282c10053630052c3", + "0x27502802836300535f00501f02802836300525300530a0280283630050db", + "0x280283630050b900524202802836300539000523102802836300503c005", + "0x2836300507700501f02802836300532300512602802836300530f00530a", + "0x36300501400524202802836300507400501f02802836300507500501f028", + "0x50920282c20053630052fa00504f0282be0053630052f1005031028028", + "0x2ab0280f80053630050280300280283630050283610282c10053630052be", + "0x52bd0051290282bd0053630050fa0d20071270280fa0053630050f8005", + "0x50280070282bb2c12c20310052bb0053630052bb0051280282bb005363", + "0x3c00527502802836300535f00501f02802836300525300530a028028363", + "0x52420280283630050140052420280283630052fb00501c028028363005", + "0x1f02802836300532300512602802836300530f00530a0280283630050b9", + "0x2802836300507400501f02802836300507500501f028028363005077005", + "0x52ba0050920280fc00536300530700504f0282ba0053630050c9005031", + "0x50c600504702802836300502800702802854700502804d0280fe005363", + "0x3c00527502802836300535f00501f02802836300525300530a028028363", + "0x52420280283630050140052420280283630052fb00501c028028363005", + "0x1f02802836300532300512602802836300530f00530a0280283630050b9", + "0x2802836300507400501f02802836300507500501f028028363005077005", + "0x50fd0050920280fc0053630050b000504f0280fd0053630052fc005031", + "0xfb0052ab0280fb0053630050280300280283630050283610280fe005363", + "0x53630052b80051290282b80053630052b938f0071270282b9005363005", + "0x283630050280070281040fe0fc031005104005363005104005128028104", + "0x2836300535f00501f02802836300525300530a028028363005028361028", + "0x36300530f00530a02802836300501400524202802836300503c005275028", + "0x507500501f02802836300507700501f028028363005323005126028028", + "0x52ab0281060053630050b400503102802836300507400501f028028363", + "0x3630051030051290281030053630051050b6007127028105005363005303", + "0x1280281060053630051060050920280b00053630050b000504f0282b7005", + "0x283610280283630050280070282b71060b00310052b70053630052b7005", + "0x527502802836300535f00501f02802836300525300530a028028363005", + "0x30a02802836300501400524202802836300507400501f02802836300503c", + "0x2802836300507700501f02802836300532300512602802836300530f005", + "0x3630053080052a90282b600536300530b00503102802836300507500501f", + "0x1280282b60053630052b60050920280b00053630050b000504f02810c005", + "0x530a02802836300502800702810c2b60b003100510c00536300510c005", + "0x1f02802836300525300530a0280283630050a900530a02802836300530c", + "0x2802836300507500501f02802836300503c00527502802836300535f005", + "0x2836300532300512602802836300501400524202802836300507400501f", + "0x530e00504f02810d00536300531400503102802836300507700501f028", + "0x2800702802854800502804d02810e00536300510d00509202810b005363", + "0x501f02802836300525300530a028028363005315005047028028363005", + "0x1f02802836300507500501f02802836300503c00527502802836300535f", + "0x28028363005323005126028028363005014005242028028363005074005", + "0x36300533500504f02802500536300509600503102802836300507700501f", + "0x502803002802836300502836102810e00536300502500509202810b005", + "0x1160053630051143170071270281140053630052b40052ab0282b4005363", + "0x10e10b031005115005363005115005128028115005363005116005129028", + "0x2836300525300530a028028363005028361028028363005028007028115", + "0x36300507500501f02802836300503c00527502802836300535f00501f028", + "0x507700501f02802836300501400524202802836300507400501f028028", + "0x920282b300536300533500504f028113005363005328005031028028363", + "0x36300532700501302811c00536300532000512f028120005363005113005", + "0x36300525300530a02802836300502800702802854900502804d02811b005", + "0x507500501f02802836300503c00527502802836300535f00501f028028", + "0x7700501f02802836300501400524202802836300507400501f028028363", + "0x281220053630050880052a90282b200536300508a005031028028363005", + "0x51220051280282b20053630052b200509202833500536300533500504f", + "0x283630050283610280283630050280070281222b2335031005122005363", + "0x36300535f00501f02802836300525300530a02802836300533d005047028", + "0x507400501f02802836300507500501f02802836300503c005275028028", + "0x7f00503102802836300507700501f028028363005014005242028028363", + "0x282b300536300505b00504f0282b0005363005028030028124005363005", + "0x534200501302811c0053630052b000512f028120005363005124005092", + "0x282ad00536300511c0052ab0282ae00536300511b00521902811b005363", + "0x2b300504f0281270053630052ac0051290282ac0053630052ad2ae007127", + "0x1270053630051270051280281200053630051200050920282b3005363005", + "0x530a0280283630050283610280283630050280070281271202b3031005", + "0x1f02802836300503c00527502802836300535f00501f028028363005253", + "0x2802836300501400524202802836300501000501f02802836300504e005", + "0x5363005028030028129005363005068005031028028363005017005060", + "0x71270282ab0053630051280052ab028126005363005071005219028128", + "0x36300505b00504f02812f0053630052a90051290282a90053630052ab126", + "0x3100512f00536300512f00512802812900536300512900509202805b005", + "0x525300530a02802836300502836102802836300502800702812f12905b", + "0x4e00501f02802836300503c00527502802836300535f00501f028028363", + "0x50600280283630051c6005060028028363005014005242028028363005", + "0x282a800536300502803002812e005363005042005031028028363005017", + "0x1331340071270281330053630052a80052ab028134005363005069005219", + "0x5b00536300505b00504f0282a50053630052a70051290282a7005363005", + "0x12e05b0310052a50053630052a500512802812e00536300512e005092028", + "0x2836300525300530a0280283630050283610280283630050280070282a5", + "0x36300501300506002802836300503c00527502802836300535f00501f028", + "0x50170050600280283630051c6005060028028363005014005242028028", + "0x52190281390053630050280300282a4005363005060005031028028363", + "0x36300513a13b00712702813a0053630051390052ab02813b0053630052bc", + "0x9202805b00536300505b00504f0282a3005363005138005129028138005", + "0x282a32a405b0310052a30053630052a30051280282a40053630052a4005", + "0x1f02802836300525300530a028028363005028361028028363005028007", + "0x2802836300501300506002802836300503c00527502802836300535f005", + "0x2836300504d0050670280283630050170050600280283630051c6005060", + "0x2750071270282a100536300505e0052ab0282a200536300526c005031028", + "0x536300505b00504f0281410053630051420051290281420053630052a1", + "0x5b0310051410053630051410051280282a20053630052a200509202805b", + "0x36300525300530a0280283630050283610280283630050280070281412a2", + "0x504d00506702802836300503c00527502802836300535f00501f028028", + "0x170050600280283630051c6005060028028363005013005060028028363", + "0x2829e00536300505c0052a902829f005363005009005031028028363005", + "0x529e00512802829f00536300529f00509202805b00536300505b00504f", + "0x36300525800530a02802836300502800702829e29f05b03100529e005363", + "0x503c00527502802836300535f00501f02802836300505000530a028028", + "0x1c600506002802836300501300506002802836300504d005067028028363", + "0x4f02829d00536300524c005031028028363005017005060028028363005", + "0x2854a00502804d02814900536300529d005092028152005363005256005", + "0x2836300535f00501f02802836300524b005047028028363005028007028", + "0x36300501300506002802836300504d00506702802836300503c005275028", + "0x500a0050600280283630050170050600280283630051c6005060028028", + "0x9202815200536300500c00504f02814b005363005046005031028028363", + "0x2814d00536300502803002802836300502836102814900536300514b005", + "0x15000512902815000536300514e24900712702814e00536300514d0052ab", + "0x2800702829a14915203100529a00536300529a00512802829a005363005", + "0x506702802836300535f00501f02802836300500a005060028028363005", + "0x600280283630050c000501c02802836300501300506002802836300504d", + "0x2980053630050330050310280283630050170050600280283630051c6005", + "0x502804d02815a00536300529800509202829c00536300503600504f028", + "0x500a00506002802836300536400504702802836300502800702802854b", + "0x1300506002802836300504d00506702802836300535f00501f028028363", + "0x50600280283630051c60050600280283630050c000501c028028363005", + "0x2815900536300535b00503102802836300500f005060028028363005017", + "0x36300502836102815a00536300515900509202829c00536300502800504f", + "0x3560071270281570053630051580052ab028158005363005028030028028", + "0x5363005155005128028155005363005156005129028156005363005157", + "0x2802836300500a00506002802836300502800702815515a29c031005155", + "0x2836300504f00506002802836300501300506002802836300504d005067", + "0x36300500f0050600280283630050170050600280283630051c6005060028", + "0x1b005219028153005363005028030028154005363005005005031028028", + "0x53630052961640071270282960053630051530052ab028164005363005", + "0x509202802800536300502800504f028294005363005295005129028295", + "0x12e028294154028031005294005363005294005128028154005363005154", + "0x2804d00536300502824c02801300536300502805f0281c6005363005028", + "0x2802836300502824f0283610053630050282a802801700536300502812e", + "0x3136300700700500713402802836300503100531c028028363005028361", + "0x36300536000509202802836300502800702835e35f01c03154c01b04e360", + "0x2a702801b00536300501b00513302801f005363005360005031028360005", + "0x2a402801403001035c35d00b3630050200052a502802000536300501b005", + "0x36300502300513b02802300536300535d00513902835d00536300535d005", + "0x280840c000736300500a00513b02802836300502d00509602835b02d007", + "0x36300535b00513a02835b00536300535b00531a0280283630050c0005096", + "0x2836300535700508e0280323571a803136300535900513802835935b007", + "0x508400513a0283560053630051a80050fc028028363005032005275028", + "0x36300500c00508e02803c00c033031363005364005138028364084007363", + "0x130073060280360053630050330050fc02802836300503c005275028028", + "0x536300535c0052a302801f00536300501f00509202804e00536300504e", + "0x280300053630050300170072a20280100053630050101c60072a202835c", + "0x702802854d0283630070363560070fe02801400536300501404d007252", + "0x1f02802836300501400501f028028363005084005096028028363005028", + "0x2802836300509200501f02802836300503000527502802836300500f005", + "0x2836300501000527502802836300500b00531e02802836300535c0052a1", + "0x36300535b00509602802836300536100514202802836300504f00501f028", + "0x2804d02821900536300504000509202804000536300501f005031028028", + "0x513a02821d00536300501f00503102802836300502800702802854e005", + "0x22d00508e02804623122d03136300522700513802822735b00736300535b", + "0x13a0280480053630052310050fc028028363005046005275028028363005", + "0x508e028246242045031363005047005138028047084007363005084005", + "0x282490053630052420050fc028028363005246005275028028363005045", + "0x2800702802854f0283630072490480070fe02821d00536300521d005092", + "0x527502802836300500f00501f02802836300501400501f028028363005", + "0x31e02802836300535c0052a102802836300509200501f028028363005030", + "0x2802836300504f00501f02802836300501000527502802836300500b005", + "0x2836300508400509602802836300535b005096028028363005361005142", + "0x21900530702821900536300524a00509202824a00536300521d005031028", + "0x21d00503102802836300502800702802855000502804d02824b005363005", + "0x36300524f00508e02825325224f03136300535b00513802824c005363005", + "0x25600538f02825600536300525300514102802836300525200508e028028", + "0x36300505000508e02805b009050031363005084005138028258005363005", + "0x5800538f02805800536300505b00514102802836300500900508e028028", + "0x536300505c00501b02805c005363005059258007326028059005363005", + "0x2826c00555102836300705c00534202824c00536300524c00509202805c", + "0x536300535c00529f02827500536300524c005031028028363005028007", + "0x2805e27700736300501800529d02801800536300501836100729e028018", + "0x506000531e02805f06000736300500b00529d02802836300527700531e", + "0x2bc2af01436300505d00514902805d05e00736300505e005152028028363", + "0x30a0280283630052bc00527502807507434707106f006068069306067042", + "0x2802836300530600501f028028363005067005242028028363005042005", + "0x2836300500600512602802836300506800501f02802836300506900501f", + "0x36300534700523102802836300507100524202802836300506f00530a028", + "0x52af0051c6028028363005075005242028028363005074005231028028", + "0x34501436300534600514902834605f00736300505f005152028077005363", + "0x2802836300504300527502833c33d33e33f34007d08134207f07907a043", + "0x2836300507f00501f02802836300507900524202802836300507a00530a", + "0x36300507d00512602802836300508100501f02802836300534200501f028", + "0x533e00523102802836300533f00524202802836300534000530a028028", + "0x3450051c602802836300533c00524202802836300533d005231028028363", + "0x536300533700501b02833700536300533b07700732602833b005363005", + "0x2808c005552028363007337005342028275005363005275005092028337", + "0x736300505e005152028336005363005275005031028028363005028007", + "0x32d36f08e08633033133208833333408a01436300533500514902833505e", + "0x8800524202802836300533300530a02802836300508a00501f02832b32c", + "0x501f02802836300533100501f02802836300533200501f028028363005", + "0x24202802836300508e00530a028028363005086005126028028363005330", + "0x2802836300532c00523102802836300532d00523102802836300536f005", + "0x36300532a00538f02832a00536300533400514102802836300532b005242", + "0x32632701436300532800514902832805f00736300505f005152028329005", + "0x30a02802836300532700501f02831e09831f09509308532032332432508b", + "0x2802836300532400501f02802836300532500524202802836300508b005", + "0x2836300508500512602802836300532000501f02802836300532300501f", + "0x36300531f00523102802836300509500524202802836300509300530a028", + "0x532600514102802836300531e005242028028363005098005231028028", + "0x31c00536300531d32900732602831d00536300509600538f028096005363", + "0x31c00534202833600536300533600509202831c00536300531c00501b028", + "0x31900536300533600503102802836300502800702831a005553028363007", + "0x31431531631701436300531800514902831805e00736300505e005152028", + "0x31600527502802836300531700501f0280b030b0a930c30e30f311312313", + "0x501f02802836300531300501f028028363005314005242028028363005", + "0x30a02802836300530f00512602802836300531100501f028028363005312", + "0x280283630050a900523102802836300530c00524202802836300530e005", + "0x53630053150052f10280283630050b000524202802836300530b005231", + "0xb60b430801436300530a00514902830a05f00736300505f0051520280ac", + "0x527502802836300530800501f0282fd0bf2fe2ff3003013023030b9305", + "0x1f0280283630050b900501f0280283630053050052420280283630050b4", + "0x2802836300530100512602802836300530200501f028028363005303005", + "0x283630052fe0052310280283630052ff00524202802836300530000530a", + "0x3630050b60052f10280283630052fd0052420280283630050bf005231028", + "0x285540283630072fc0ac00714b0283190053630053190050920282fc005", + "0x2836300503000527502802836300500f00501f028028363005028007028", + "0x36300505e00531e02802836300505f00531e02802836300509200501f028", + "0x501400501f02802836300504f00501f028028363005010005275028028", + "0x4d0280510053630052fb0050920282fb005363005319005031028028363", + "0x15202838b005363005319005031028028363005028007028028555005028", + "0xc90c60c738f0dc38d01436300538c00514902838c05e00736300505e005", + "0x3630050dc00527502802836300538d00501f0282f43913073902fa0cf0cb", + "0x50c900501f0280283630050c600501f02802836300538f00530a028028", + "0x2fa00530a0280283630050cf0051260280283630050cb00501f028028363", + "0x5231028028363005307005231028028363005390005242028028363005", + "0x280d40053630050c700514d0280283630052f4005242028028363005391", + "0xd50053470280d50053630052f300500a0282f30d40073630050d40050e9", + "0x143630052f10051490282f105f00736300505f005152028392005363005", + "0x283630052f000501f0280df2e02e12e22ef0db2e80d22e52e70da2ea2f0", + "0x3630052e500501f0280283630050da00530a0280283630052ea005275028", + "0x50db0051260280283630052e800501f0280283630050d200501f028028", + "0x2e10052310280283630052e20052420280283630052ef00530a028028363", + "0x514d0280283630050df0052420280283630052e0005231028028363005", + "0x3630050e100500a0280e12ee0073630052ee0050e90282ee0053630052e7", + "0x330283920053630053920050330282eb0053630052ec0053470282ec005", + "0x72eb39200714e02838b00536300538b0050920282eb0053630052eb005", + "0x501f028028363005030005275028028363005028007028028556028363", + "0x27502802836300505e00531e02802836300505f00531e028028363005092", + "0x2802836300501400501f02802836300504f00501f028028363005010005", + "0x283630050d40052420280283630052ee00524202802836300500f00501f", + "0xe30050920282ed00536300502800504f0280e300536300538b005031028", + "0x38b00503102802836300502800702802855700502804d0282de005363005", + "0x2d60053630052d600509202802800536300502800504f0282d6005363005", + "0x2800a1500282ee0053630052ee00505b0280d40053630050d400505b028", + "0x2d00055580e90053630072d200529a0282d22d32d80313630052ee0d42d6", + "0x3630050e90052980282ce0053630052d3005031028028363005028007028", + "0x920280283630052ca0052420280283630052cd0052420280ec2ca2cd031", + "0x280070282c90055590f00053630070ec0052cd0282ce0053630052ce005", + "0x531e02802836300505f00531e0280283630050f0005047028028363005", + "0x1f02802836300504f00501f02802836300501000527502802836300505e", + "0x2802836300503000527502802836300500f00501f028028363005014005", + "0x3630052d800504f0282c60053630052ce00503102802836300509200501f", + "0x3070282c50053630052ed0053900282de0053630052c60050920282ed005", + "0x4702802836300502800702802855a00502804d0282c40053630052de005", + "0x736300505e0051520282c30053630052ce0050310280283630052c9005", + "0xfb0fd0fe0fc2ba2bb2bd0fa0f82be2c10143630052c20051490282c205e", + "0xf800530a0280283630052be0052750280283630052c100501f0282b82b9", + "0x501f0280283630052bb00501f0280283630050fa005242028028363005", + "0x2420280283630050fe00530a0280283630050fc0051260280283630052ba", + "0x280283630052b90052310280283630050fb0052310280283630050fd005", + "0x36300505f0051520281040053630052bd0051c60280283630052b8005242", + "0x2b402510e10b10d10c2b62b710310501436300510600514902810605f007", + "0x530a02802836300510300527502802836300510500501f028115116114", + "0x1f02802836300510d00501f0280283630052b60052420280283630052b7", + "0x2802836300502500530a02802836300510e00512602802836300510b005", + "0x283630051160052310280283630051140052310280283630052b4005242", + "0x11310400732602811300536300510c0051c6028028363005115005242028", + "0x2c30053630052c30050920282b30053630052b300501b0282b3005363005", + "0x2c300503102802836300502800702812000555b0283630072b3005342028", + "0x1436300511b00514902811b05e00736300505e00515202811c005363005", + "0x283630052b200501f0282a92ab1261281291272ac2ad2ae2b01241222b2", + "0x3630052b000524202802836300512400530a028028363005122005275028", + "0x51270051260280283630052ac00501f0280283630052ae00501f028028", + "0x12600523102802836300512800524202802836300512900530a028028363", + "0x51c60280283630052a90052420280283630052ab005231028028363005", + "0x36300512e00514902812e05f00736300505f00515202812f0053630052ad", + "0x3630052a800501f0282a12a22a313813a13b1392a42a52a71331342a8014", + "0x52a700524202802836300513300530a028028363005134005275028028", + "0x13b00512602802836300513900501f0280283630052a500501f028028363", + "0x523102802836300513800524202802836300513a00530a028028363005", + "0x1c60280283630052a10052420280283630052a20052310280283630052a3", + "0x514100501b02814100536300514212f0073260281420053630052a4005", + "0x555c02836300714100534202811c00536300511c005092028141005363", + "0x505e00515202829e00536300511c00503102802836300502800702829f", + "0x29c29829a15014e14d14b14915201436300529d00514902829d05e007363", + "0x30a02802836300514900527502802836300515200501f02815715815915a", + "0x2802836300514e00501f02802836300514d00524202802836300514b005", + "0x2836300529c00530a02802836300529800512602802836300515000501f", + "0x36300515800523102802836300515900523102802836300515a005242028", + "0x5f00515202815600536300529a0051c6028028363005157005242028028", + "0x29229329429529616415315401436300515500514902815505f007363005", + "0x2802836300515300527502802836300515400501f02816d28e28f290291", + "0x2836300529500501f02802836300529600524202802836300516400530a", + "0x36300529100530a02802836300529200512602802836300529400501f028", + "0x528e00523102802836300528f005231028028363005290005242028028", + "0x732602816f0053630052930051c602802836300516d005242028028363", + "0x36300529e00509202828c00536300528c00501b02828c00536300516f156", + "0x3102802836300502800702817100555d02836300728c00534202829e005", + "0x517200514902817205e00736300505e00515202828b00536300529e005", + "0x517400501f02828917c02428255e28628728814628a177175174014363", + "0x28a00524202802836300517700530a028028363005175005275028028363", + "0x501f02802836300528800501f02802836300514600501f028028363005", + "0x23102802836300528200524202802836300555e00530a028028363005287", + "0x2802836300528900524202802836300517c005231028028363005024005", + "0x27d00515902827d27f00736300527f00515a02827f00536300528600529c", + "0x5f00736300505f00515202827b00536300527c00515802827c005363005", + "0x19219327618c18a18927818718518418227901436300527a00514902827a", + "0x518400530a02802836300518200527502802836300527900501f028194", + "0x27800501f02802836300518700501f028028363005185005242028028363", + "0x524202802836300518c00530a02802836300518900501f028028363005", + "0x242028028363005192005231028028363005193005231028028363005276", + "0x736300519500515a02819500536300518a00529c028028363005194005", + "0x3302827200536300518d00515802818d005363005271005159028271195", + "0x36300528b00509202827200536300527200503302827b00536300527b005", + "0x31e02802836300502800702802855f02836300727227b00714e02828b005", + "0x2802836300504f00501f02802836300501000527502802836300505e005", + "0x2836300503000527502802836300500f00501f02802836300501400501f", + "0x36300519500512602802836300505f00531e02802836300509200501f028", + "0x2d800504f02827e00536300528b00503102802836300527f005126028028", + "0x702802856000502804d02819a00536300527e00509202826e005363005", + "0x2d80053630052d800504f02819c00536300528b005031028028363005028", + "0x19500515702827f00536300527f00515702819c00536300519c005092028", + "0x51550281a019e26d03136300519527f19c2d800a156028195005363005", + "0x36300519e00503102802836300502800702826a00556126b0053630071a0", + "0x2802836300526600512602826426526603136300526b005154028268005", + "0x3630072640052cd028268005363005268005092028028363005265005126", + "0x1f028028363005263005047028028363005028007028261005562263005", + "0x2802836300500f00501f02802836300501400501f02802836300504f005", + "0x2836300505f00531e02802836300509200501f028028363005030005275", + "0x36300526800503102802836300501000527502802836300505e00531e028", + "0x39002819a00536300526000509202826e00536300526d00504f028260005", + "0x2856300502804d02825c00536300519a00530702825f00536300526e005", + "0x5363005268005031028028363005261005047028028363005028007028", + "0x2571ac25901436300525a00514902825a05e00736300505e00515202825b", + "0x527502802836300525900501f02824124324724d24e2501b21b0251255", + "0x1f02802836300525500524202802836300525700530a0280283630051ac", + "0x280283630051b200501f0280283630051b000501f028028363005251005", + "0x2836300524700523102802836300524d005242028028363005250005126", + "0x36300524e0052f1028028363005241005242028028363005243005231028", + "0x1bd23a0143630051bb0051490281bb05f00736300505f00515202823f005", + "0x27502802836300523a00501f02822c22e2302321c423623b23818e2391bf", + "0x280283630052390052420280283630051bf00530a0280283630051bd005", + "0x2836300523b00501f02802836300523800501f02802836300518e00501f", + "0x363005230005231028028363005232005242028028363005236005126028", + "0x51c40052f102802836300522c00524202802836300522e005231028028", + "0x5640283630071c923f00714b02825b00536300525b0050920281c9005363", + "0x36300500f00501f02802836300501400501f028028363005028007028028", + "0x505f00531e02802836300509200501f028028363005030005275028028", + "0x4f00501f02802836300501000527502802836300505e00531e028028363", + "0x2822400536300526d00504f02822800536300525b005031028028363005", + "0x2802836300502800702802856500502804d028225005363005228005092", + "0x21f00514902821f05e00736300505e00515202822000536300525b005031", + "0x21e00501f0282111d82131d61d42152171d121822121a1cf21e014363005", + "0x524202802836300521a00530a0280283630051cf005275028028363005", + "0x1f0280283630051d100501f02802836300521800501f028028363005221", + "0x280283630051d400530a028028363005215005126028028363005217005", + "0x283630052110052420280283630051d8005231028028363005213005231", + "0x500a02820c2160073630052160050e90282160053630051d600514d028", + "0x736300505f00515202820a00536300520b00534702820b00536300520c", + "0x1ec1f11f81fb1fd1ff2011df20620720801436300520900514902820905f", + "0x20600530a02802836300520700527502802836300520800501f028566000", + "0x501f02802836300520100501f0280283630051df005242028028363005", + "0x30a0280283630051fb0051260280283630051fd00501f0280283630051ff", + "0x280283630050000052310280283630051ec0052310280283630051f8005", + "0x3630055670050e90285670053630051f100514d028028363005566005242", + "0x2856a00536300556900534702856900536300556800500a028568567007", + "0x522000509202856a00536300556a00503302820a00536300520a005033", + "0x2802836300502800702802856b02836300756a20a00714e028220005363", + "0x2836300509200501f02802836300503000527502802836300500f00501f", + "0x36300501000527502802836300505e00531e02802836300505f00531e028", + "0x556700524202802836300501400501f02802836300504f00501f028028", + "0x504f02856c005363005220005031028028363005216005242028028363", + "0x2802856f00502804d02856e00536300556c00509202856d00536300526d", + "0x536300526d00504f028570005363005220005031028028363005028007", + "0x505b02821600536300521600505b02857000536300557000509202826d", + "0x29a02857357257103136300556721657026d00a150028567005363005567", + "0x5572005031028028363005028007028576005575574005363007573005", + "0x2836300557700524202857957857703136300557400529802836d005363", + "0x75790052cd02836d00536300536d005092028028363005578005242028", + "0x2802836300557a00504702802836300502800702857c00557b57a005363", + "0x2836300505e00531e02802836300505f00531e02802836300509200501f", + "0x36300501400501f02802836300504f00501f028028363005010005275028", + "0x536d00503102802836300503000527502802836300500f00501f028028", + "0x2856e00536300557d00509202856d00536300557100504f02857d005363", + "0x58000502804d02857f00536300556e00530702857e00536300556d005390", + "0x36300536d00503102802836300557c005047028028363005028007028028", + "0x58336c01436300558200514902858205e00736300505e005152028581005", + "0x27502802836300536c00501f02858e58d58c58b58a589588587586585584", + "0x2802836300558500524202802836300558400530a028028363005583005", + "0x2836300558800501f02802836300558700501f02802836300558600501f", + "0x36300558b00524202802836300558a00530a028028363005589005126028", + "0x558c00515302802836300558e00524202802836300558d005231028028", + "0x59101436300559000514902859005f00736300505f00515202858f005363", + "0x2802836300559100501f02859b36a59a59959859759659559459336b592", + "0x2836300559300524202802836300536b00530a028028363005592005275", + "0x36300559600501f02802836300559500501f02802836300559400501f028", + "0x559900524202802836300559800530a028028363005597005126028028", + "0x59a00515302802836300559b00524202802836300536a005231028028363", + "0x2836300759c58f00714e02858100536300558100509202859c005363005", + "0x505e00531e02802836300505f00531e02802836300502800702802859d", + "0x1400501f02802836300504f00501f028028363005010005275028028363", + "0x501f02802836300503000527502802836300500f00501f028028363005", + "0x59f00536300557100504f02859e005363005581005031028028363005092", + "0x283630050280070280285a100502804d0285a000536300559e005092028", + "0x51490285a305e00736300505e0051520285a2005363005581005031028", + "0x501f0285ae36e5ad5ac5ab5aa5a95a85a75a63695a55a40143630055a3", + "0x24202802836300536900530a0280283630055a50052750280283630055a4", + "0x280283630055a800501f0280283630055a700501f0280283630055a6005", + "0x283630055ab00530a0280283630055aa0051260280283630055a900501f", + "0x3630055ae0052420280283630055ad0052310280283630055ac005242028", + "0x1490285b005f00736300505f0051520285af00536300536e005153028028", + "0x1f0285bc5bb5ba5b93685b85b75b65b55b45b35b25b10143630055b0005", + "0x280283630055b300530a0280283630055b20052750280283630055b1005", + "0x283630055b600501f0280283630055b500501f0280283630055b4005242", + "0x36300536800530a0280283630055b80051260280283630055b700501f028", + "0x55bc0052420280283630055ba0052310280283630055b9005242028028", + "0x14e0285a20053630055a20050920285bd0053630055bb005153028028363", + "0x36300505e00531e0280283630050280070280285be0283630075bd5af007", + "0x501400501f02802836300504f00501f028028363005010005275028028", + "0x9200501f02802836300503000527502802836300500f00501f028028363", + "0x4f0285bf0053630055a200503102802836300505f00531e028028363005", + "0x285c200502804d0285c10053630055bf0050920285c0005363005571005", + "0x36300505e0051490285c30053630055a2005031028028363005028007028", + "0x3630055c400501f0285cf5ce5cd5cc5cb3675ca5c95c85c75c65c55c4014", + "0x55c70052420280283630055c600530a0280283630055c5005275028028", + "0x5ca00501f0280283630055c900501f0280283630055c800501f028028363", + "0x52420280283630055cb00530a028028363005367005126028028363005", + "0x14d0280283630055ce0052310280283630055cd0052310280283630055cc", + "0x536600500a0283665d00073630055d00050e90285d00053630055cf005", + "0x5d45d301436300505f0051490285d20053630055d10053470285d1005363", + "0x2750280283630055d300501f0285de5dd5dc5db5da5d93705d85d75d65d5", + "0x280283630055d60052420280283630055d500530a0280283630055d4005", + "0x2836300537000501f0280283630055d800501f0280283630055d700501f", + "0x3630055db0052420280283630055da00530a0280283630055d9005126028", + "0x55de00514d0280283630055dd0052310280283630055dc005231028028", + "0x5e10053630055e000500a0285e05df0073630055df0050e90285df005363", + "0x5e20050330285d20053630055d20050330285e20053630055e1005347028", + "0x283630075e25d200714e0285c30053630055c30050920285e2005363005", + "0x504f00501f0280283630050100052750280283630050280070280285e3", + "0x3000527502802836300500f00501f02802836300501400501f028028363", + "0x52420280283630055df00524202802836300509200501f028028363005", + "0x36500536300557100504f0285e40053630055c30050310280283630055d0", + "0x283630050280070280285e600502804d0285e50053630055e4005092028", + "0x5e700509202857100536300557100504f0285e70053630055c3005031028", + "0x5df0053630055df00505b0285d00053630055d000505b0285e7005363005", + "0x53630075ea00529a0285ea5e95e80313630055df5d05e757100a150028", + "0x2980285ee0053630055e90050310280283630050280070285ed0055ec5eb", + "0x55f00052420280283630055ef0052420285f15f05ef0313630055eb005", + "0x55f35f20053630075f10052cd0285ee0053630055ee005092028028363", + "0x36300501400501f0280283630055f20050470280283630050280070285f4", + "0x509200501f02802836300503000527502802836300500f00501f028028", + "0x5ee00503102802836300504f00501f028028363005010005275028028363", + "0x5e50053630055f50050920283650053630055e800504f0285f5005363005", + "0x280283630055f40050470280283630050280070280285e600502804d028", + "0x4f5f70073260285f700536300501000538f0285f60053630055ee005031", + "0x5f60053630055f60050920285f80053630055f800501b0285f8005363005", + "0x5f60050310280283630050280070285fa0055f90283630075f8005342028", + "0x53630050925fc0073260285fc00536300503000538f0285fb005363005", + "0x53420285fb0053630055fb0050920285fd0053630055fd00501b0285fd", + "0x53630055fb0050310280283630050280070285ff0055fe0283630075fd", + "0x9202860100536300560100501b02860100536300500f014007326028600", + "0x5028007028603005602028363007601005342028600005363005600005", + "0x5164028605005363005028030028604005363005600005031028028363", + "0x53630055e800504f028607005363005606005296028606005363005605", + "0x529502804e00536300504e0050c00286040053630056040050920285e8", + "0x534002802836300502800702860704e6045e800a005607005363005607", + "0x28609005363005028020028608005363005600005031028028363005603", + "0x560a60900735c02860a00536300560a00501b02860a005363005028294", + "0x2860d00536300560b60c00702d02860c00536300502802302860b005363", + "0x56080050920285e80053630055e800504f02860e00536300560d005293", + "0x560e00536300560e00529502804e00536300504e0050c0028608005363", + "0x1f0280283630055ff00534002802836300502800702860e04e6085e800a", + "0x60f0053630055fb00503102802836300500f00501f028028363005014005", + "0x36300561100501b028611005363005028292028610005363005028020028", + "0x2d02861300536300502802302861200536300561161000735c028611005", + "0x55e800504f028372005363005614005293028614005363005612613007", + "0x2804e00536300504e0050c002860f00536300560f0050920285e8005363", + "0x2802836300502800702837204e60f5e800a005372005363005372005295", + "0x2836300500f00501f02802836300501400501f0280283630055fa005340", + "0x3630055f600503102802836300509200501f028028363005030005275028", + "0x61700501b028617005363005028291028616005363005028020028615005", + "0x61900536300502802302861800536300561761600735c028617005363005", + "0x504f02837300536300561a00529302861a00536300561861900702d028", + "0x536300504e0050c00286150053630056150050920285e80053630055e8", + "0x36300502800702837304e6155e800a00537300536300537300529502804e", + "0x503000527502802836300500f00501f02802836300501400501f028028", + "0x4f00501f02802836300501000527502802836300509200501f028028363", + "0x2861c0053630055e800504f02861b0053630055e9005031028028363005", + "0x61f00502804d02861e0053630055ed0052e002861d00536300561b005092", + "0x36300505f00531e02802836300509200501f028028363005028007028028", + "0x504f00501f02802836300501000527502802836300505e00531e028028", + "0x3000527502802836300500f00501f02802836300501400501f028028363", + "0x2861c00536300557100504f028620005363005572005031028028363005", + "0x61f00502804d02861e0053630055760052e002861d005363005620005092", + "0x36300501400501f02802836300504f00501f028028363005028007028028", + "0x509200501f02802836300503000527502802836300500f00501f028028", + "0x1000527502802836300505e00531e02802836300505f00531e028028363", + "0x2861c00536300526d00504f02862100536300519e005031028028363005", + "0x61f00502804d02861e00536300526a0052e002861d005363005621005092", + "0x36300505f00531e028028363005171005340028028363005028007028028", + "0x504f00501f02802836300501000527502802836300505e00531e028028", + "0x3000527502802836300500f00501f02802836300501400501f028028363", + "0x4f02862200536300529e00503102802836300509200501f028028363005", + "0x2862500502804d0286240053630056220050920286230053630052d8005", + "0x2836300505f00531e02802836300529f005340028028363005028007028", + "0x36300504f00501f02802836300501000527502802836300505e00531e028", + "0x503000527502802836300500f00501f02802836300501400501f028028", + "0x504f02862600536300511c00503102802836300509200501f028028363", + "0x2802862900502804d0286280053630056260050920286270053630052d8", + "0x2802836300505f00531e028028363005120005340028028363005028007", + "0x2836300504f00501f02802836300501000527502802836300505e00531e", + "0x36300503000527502802836300500f00501f02802836300501400501f028", + "0x2d800504f02862a0053630052c300503102802836300509200501f028028", + "0x702802862d00502804d02862c00536300562a00509202862b005363005", + "0x27502802836300505e00531e02802836300505f00531e028028363005028", + "0x2802836300501400501f02802836300504f00501f028028363005010005", + "0x2836300509200501f02802836300503000527502802836300500f00501f", + "0x62e00509202861c0053630052d800504f02862e0053630052d3005031028", + "0x62f00536300561e00529302861e0053630052d00052e002861d005363005", + "0x4e0050c002861d00536300561d00509202861c00536300561c00504f028", + "0x702862f04e61d61c00a00562f00536300562f00529502804e005363005", + "0x1f02802836300501400501f02802836300531a005340028028363005028", + "0x2802836300509200501f02802836300503000527502802836300500f005", + "0x2836300501000527502802836300505e00531e02802836300505f00531e", + "0x563000509202863000536300533600503102802836300504f00501f028", + "0x508c00534002802836300502800702802863200502804d028631005363", + "0x3000527502802836300500f00501f02802836300501400501f028028363", + "0x531e02802836300505f00531e02802836300509200501f028028363005", + "0x3102802836300504f00501f02802836300501000527502802836300505e", + "0x363005631005307028631005363005633005092028633005363005275005", + "0x3900282c40053630050510050920282c500536300502800504f028051005", + "0x36300562b00539002862c0053630052c400530702862b0053630052c5005", + "0x30702862300536300562700539002862800536300562c005307028627005", + "0x36300562400530702825f005363005623005390028624005363005628005", + "0x39002822500536300525c00530702822400536300525f00539002825c005", + "0x36300557e00539002857f00536300522500530702857e005363005224005", + "0x3070285c000536300559f0053900285a000536300557f00530702859f005", + "0x3630055c10053070283650053630055c00053900285c10053630055a0005", + "0x63500501b0286350053630050282900286340053630050280200285e5005", + "0x63700536300502802302863600536300563563400735c028635005363005", + "0x504f02863900536300563800529302863800536300563663700702d028", + "0x536300504e0050c00285e50053630055e5005092028365005363005365", + "0x36300502800702863904e5e536500a00563900536300563900529502804e", + "0x500f00501f02802836300501400501f02802836300526c005340028028", + "0x35c0052a102802836300509200501f028028363005030005275028028363", + "0x501f02802836300501000527502802836300500b00531e028028363005", + "0x2863a00536300524c00503102802836300536100514202802836300504f", + "0x536300502828f02837700536300502802002824b00536300563a005092", + "0x2302863c00536300563b37700735c02863b00536300563b00501b02863b", + "0x36300563e00529302863e00536300563c63d00702d02863d005363005028", + "0xc002824b00536300524b00509202802800536300502800504f02863f005", + "0x63f04e24b02800a00563f00536300563f00529502804e00536300504e005", + "0x2836300501700528e02802836300504d005060028028363005028007028", + "0x36300500f00501f02802836300500b00531e02802836300500a005096028", + "0x536100514202802836300509200501f02802836300504f00501f028028", + "0x1c0050920280283630050130050420280283630051c600528e028028363", + "0x2837800536300502802302864000536300501c00503102801c005363005", + "0x2800504f02864200536300564100529302864100536300535e37800702d", + "0x35f00536300535f0050c0028640005363005640005092028028005363005", + "0x36300500700531c02864235f64002800a005642005363005642005295028", + "0x532702801003100736300503100516d02800f005363005028020028028", + "0x36300500b00538d02804e0053630051c600f00735c0281c6005363005010", + "0x2804d00536300502816f02801400536300501304e00735c02801300b007", + "0x502824a02803000536300504d01400735c02804d00536300504d00501b", + "0x53630050170180072ee02801804f00736300504f00538d028017005363", + "0x24a02836000536300536103000735c02836100536300536100501b028361", + "0x501b01c0072ee02801c09200736300509200538d02801b005363005028", + "0x35e00536300535f36000735c02835f00536300535f00501b02835f005363", + "0x2000521902802836300501f00504002802001f00736300535e005036028", + "0x536300535d00505b02835c03100736300503100516d02835d005363005", + "0x3590840c003164335b02d02303136300735d00a35c00502800b31402835d", + "0x536300502300509202802836300535b005242028028363005028007028", + "0x35700735c0283570053630050280200281a8005363005023005031028023", + "0x36300535600503602835600536300509203200735c02803200536300504f", + "0x9202800c005363005033005219028028363005364005040028033364007", + "0x3102d1a800b31402800c00536300500c00505b0281a80053630051a8005", + "0x2802836300502800702822721d21903164404003603c03136300700c00b", + "0x504000521d02822d00536300503c00503102803c00536300503c005092", + "0x2822d00536300522d005092028046005363005231005227028231005363", + "0x4603622d0310050460053630050460050840280360053630050360050c0", + "0x363005219005031028219005363005219005092028028363005028007028", + "0x35b02804500536300522704700702d028047005363005028023028048005", + "0x36300521d0050c0028048005363005048005092028242005363005045005", + "0x36300502800702824221d04803100524200536300524200508402821d005", + "0x503100533d02802836300500b00501f02802836300504f00501f028028", + "0x50310280c00053630050c000509202802836300509200501f028028363", + "0x536300535924900702d0282490053630050280230282460053630050c0", + "0x50c002824600536300524600509202824b00536300524a00535b02824a", + "0x36102824b08424603100524b00536300524b005084028084005363005084", + "0x4f02809204f00b00a00a36300503100500702800a28c028028363005028", + "0x36300500b00509202804f00536300504f00530f02800a00536300500a005", + "0x502828b02809200b04f00a00a00509200536300509200517102800b005", + "0x502800700502802836300502836102802836300502824f02800a005363", + "0x504f00503102802836300502800702800f09200764504f00b007363007", + "0x2804e0070073630050070051740281c6005363005028172028010005363", + "0x4e00b0311750280100053630050100050920281c60053630051c6005308", + "0x1000503102802836300502800702803004d0076460140130073630071c6", + "0x1700536300501700509202801300536300501300504f028017005363005", + "0x3603610180313630050140170130310b4028014005363005014005308028", + "0x503102802836300502800702801b0056470310053630073600050b6028", + "0x35f00536300535f00530802835f00536300502817702801c005363005361", + "0x3117502801c00536300501c00509202803100536300503100a00728a028", + "0x3102802836300502800702835d02000764801f35e00736300735f007018", + "0x36300535c00509202835e00536300535e00504f02835c00536300501c005", + "0x2303136300501f35c35e0310b402801f00536300501f00530802835c005", + "0x280283630050280070280840056490c000536300735b0050b602835b02d", + "0x3630050c00053050281a800536300502817702835900536300502d005031", + "0x3560320313630053571a80071460281a80053630051a8005308028357005", + "0x9202800c0053630050320050b9028033005363005364023007288028364", + "0x36300700c00534202803300536300503300504f028359005363005359005", + "0x30502803600536300535900503102802836300502800702803c00564a028", + "0x356040033031287028036005363005036005092028040005363005031005", + "0x503600503102802836300502800702822d22700764b21d219007363007", + "0x2804800536300504600555e02804600536300521d005286028231005363", + "0x504800528202823100536300523100509202821900536300521900504f", + "0x36300522d00530a028028363005028007028048231219031005048005363", + "0x5028024028045005363005028020028047005363005036005031028028", + "0x24600536300524204500735c02824200536300524200501b028242005363", + "0x24a00517c02824a00536300524624900702d028249005363005028023028", + "0x4700536300504700509202822700536300522700504f02824b005363005", + "0x2802836300502800702824b04722703100524b00536300524b005282028", + "0x2836300535600530a02802836300503100528902802836300503c005340", + "0x36300502827f02824f00536300502802002824c005363005359005031028", + "0x2825300536300525224f00735c02825200536300525200501b028252005", + "0x525800517c02825800536300525325600702d028256005363005028023", + "0x2824c00536300524c00509202803300536300503300504f028050005363", + "0x28902802836300502800702805024c033031005050005363005050005282", + "0x536300508400517c02800900536300502d005031028028363005031005", + "0x528202800900536300500900509202802300536300502300504f02805b", + "0x35d00530a02802836300502800702805b00902303100505b00536300505b", + "0x2002805800536300501c005031028028363005031005289028028363005", + "0x5c00536300505c00501b02805c00536300502827d028059005363005028", + "0x27500702d02827500536300502802302826c00536300505c05900735c028", + "0x536300502000504f02805e00536300527700517c02827700536300526c", + "0x2003100505e00536300505e005282028058005363005058005092028020", + "0x500a00527c02802836300500700530a02802836300502800702805e058", + "0x4f02805f00536300501b00517c028060005363005361005031028028363", + "0x36300505f005282028060005363005060005092028018005363005018005", + "0x2836300503000530a02802836300502800702805f06001803100505f005", + "0x36300501000503102802836300500700530a02802836300500a00527c028", + "0x2bc00501b0282bc00536300502827d0282af00536300502802002805d005", + "0x670053630050280230280420053630052bc2af00735c0282bc005363005", + "0x504f02806900536300530600517c02830600536300504206700702d028", + "0x536300506900528202805d00536300505d00509202804d00536300504d", + "0x2802836300500a00527c02802836300502800702806905d04d031005069", + "0x536300502802002806800536300500f00503102802836300500700530a", + "0x600735c02806f00536300506f00501b02806f005363005028046028006", + "0x536300507134700702d02834700536300502802302807100536300506f", + "0x509202809200536300509200504f02807500536300507400517c028074", + "0x361028075068092031005075005363005075005282028068005363005068", + "0x27a02800b00536300502817202800a00536300502827b028028363005028", + "0x36300509200518202809200536300504f00b00727902804f005363005028", + "0x18702801000536300502818502800f00536300509200a007184028092005", + "0x36300504e0051890280283630051c600527802804e1c600736300500f005", + "0x18a02800500536300500500509202802800536300502800504f028013005", + "0x1300502800a27602801000536300501000518c028013005363005013005", + "0x702801800564c01700536300703000519302803004d014031363005010", + "0x36003136300501700519202836100536300504d005031028028363005028", + "0x502836f02802836300501c00504702802836300536000519402801c01b", + "0x9202801400536300501400504f02835e00536300502803202835f005363", + "0x36300535f00532c02801b00536300501b00518c028361005363005361005", + "0x36300535e35f01b36101400b19502835e00536300535e00503302835f005", + "0x36300502800702802300564d35c00536300735d00527102835d02001f031", + "0x470280c035b00736300535c00518d02802d005363005020005031028028", + "0x36300508400527e02835908400736300535b0052720280283630050c0005", + "0x3119a02802d00536300502d0050920281a800536300535900526e028028", + "0x2836300502800702800c03336403164e3560323570313630071a800702d", + "0x35600519c02803c005363005357005031028357005363005357005092028", + "0x3600536300503600530802821900536300502826d028040036007363005", + "0x4000530802803c00536300503c0050920280320053630050320050c0028", + "0x2836300502800702802864f02836300721903600714b028040005363005", + "0x36300503c00503102802836300503100531c02802836300504000530a028", + "0x22d00501b02822d00536300502819e02822700536300502802002821d005", + "0x4600536300502802302823100536300522d22700735c02822d005363005", + "0x504f0280470053630050480052c602804800536300523104600702d028", + "0x53630050320050c002821d00536300521d00509202801f00536300501f", + "0x36300502800702804703221d01f00a0050470053630050470050f0028032", + "0x450050920282420053630050281a002804500536300503c005031028028", + "0x2836300502800702802865002836300724204000714b028045005363005", + "0x36300502802002824600536300504500503102802836300503100531c028", + "0x735c02824a00536300524a00501b02824a00536300502819e028249005", + "0x36300524b24c00702d02824c00536300502802302824b00536300524a249", + "0x9202801f00536300501f00504f02825200536300524f0052c602824f005", + "0x3630052520050f00280320053630050320050c0028246005363005246005", + "0x36300504500503102802836300502800702825203224601f00a005252005", + "0x25800532c0282580053630050280fd028256005363005028185028253005", + "0x736300505000527202805000536300525825600726b028258005363005", + "0x509202805800536300505b00526e02802836300500900527e02805b009", + "0x705803225303119a02805800536300505800526a028253005363005253", + "0x26c00526802802836300502800702805e27727503165126c05c059031363", + "0x3102805900536300505900509202802836300503100531c028028363005", + "0x5d00536300502826602805f005363005028020028060005363005059005", + "0x280230282af00536300505d05f00735c02805d00536300505d00501b028", + "0x53630050420052c60280420053630052af2bc00702d0282bc005363005", + "0x50c002806000536300506000509202801f00536300501f00504f028067", + "0x2806705c06001f00a0050670053630050670050f002805c00536300505c", + "0x5363005275005031028275005363005275005092028028363005028007", + "0x501302802836300506900504002806806900736300505e005036028306", + "0x53630053060050920282770053630052770050c0028068005363005068", + "0x2802836300502800702807100565206f00600736300706800500f028306", + "0x36300506f00501002834700536300530600503102802836300500600501c", + "0x501b0280770053630050282650280750053630050740051c6028074005", + "0x36300534600501b028346005363005077075007326028075005363005075", + "0x345005653028363007346005342028347005363005347005092028346005", + "0x5363005028030028043005363005347005031028028363005028007028", + "0x4f02807f0053630050790050ec02807900536300507a0310072ca02807a", + "0x3630052770050c002804300536300504300509202801f00536300501f005", + "0x502800702807f27704301f00a00507f00536300507f0050f0028277005", + "0x34700503102802836300503100531c028028363005345005340028028363", + "0x1b02807d005363005028264028081005363005028020028342005363005", + "0x36300502802302834000536300507d08100735c02807d00536300507d005", + "0x2833d00536300533e0052c602833e00536300534033f00702d02833f005", + "0x52770050c002834200536300534200509202801f00536300501f00504f", + "0x2800702833d27734201f00a00533d00536300533d0050f0028277005363", + "0x503102802836300503100531c02802836300507100501c028028363005", + "0x2833700536300502826302833b00536300502802002833c005363005306", + "0x502802302808c00536300533733b00735c02833700536300533700501b", + "0x8a0053630053350052c602833500536300508c33600702d028336005363", + "0x2770050c002833c00536300533c00509202801f00536300501f00504f028", + "0x702808a27733c01f00a00508a00536300508a0050f0028277005363005", + "0x2836400536300536400509202802836300503100531c028028363005028", + "0x533400509202833300536300501f00504f028334005363005364005031", + "0x2833100536300500c00522d0283320053630050330050c0028088005363", + "0x3102802836300503100531c02802836300502800702802865400502804d", + "0x508600534602808e086007363005023005077028330005363005020005", + "0xc002808800536300533000509202833300536300501f00504f028028363", + "0x2865400502804d02833100536300508e00522d028332005363005007005", + "0x536300504d00503102802836300503100531c028028363005028007028", + "0x504f02802836300532d00534602832c32d00736300501800507702836f", + "0x53630050070050c002808800536300536f005092028333005363005014", + "0x32b00702d02832b00536300502802302833100536300532c00522d028332", + "0x536300533300504f02832900536300532a0052c602832a005363005331", + "0x50f00283320053630053320050c0028088005363005088005092028333", + "0x2826102802836300502836102832933208833300a005329005363005329", + "0x2800b00536300500b00503302800b00536300502826002800a005363005", + "0x36300502803202809200536300502803202804f00536300500b00a00725f", + "0x3302804f00536300504f00525c02802800536300502800504f02800f005", + "0x9204f02800a25b02800f00536300500f005033028092005363005092005", + "0x2800702801300565504e0053630071c600525a0281c601000736300500f", + "0x1ac02804d005363005028259028014005363005005005031028028363005", + "0x501800504702801801700736300504e00525702803000536300504d005", + "0x1b0028028363005361005251028360361007363005017005255028028363", + "0x36300501400509202801000536300501000504f02801b005363005360005", + "0x25002801b00536300501b0051b20280070053630050070050c0028014005", + "0x35e35f01c00a36300503001b00701401000b24e028030005363005030005", + "0x3102802836300502800702835d00565602000536300701f00524d02801f", + "0x2300524302835b02d02303136300502000524702835c00536300535f005", + "0x23f0280c000536300502d00524102802836300535b005047028028363005", + "0x36300508400523a0280840053630050c00051bb0280c00053630050c0005", + "0x3570052310280283630051a800523102800c0333643560323571a835900f", + "0x5231028028363005356005231028028363005032005231028028363005", + "0x1bd02802836300500c005231028028363005033005231028028363005364", + "0x536300535c00509202835900536300535900503302803c005363005028", + "0x531c02802836300502800702802865702836300703c35900714e02835c", + "0x2804000536300502802002803600536300535c005031028028363005031", + "0x521904000735c02821900536300521900501b02821900536300502819e", + "0x2822d00536300521d22700702d02822700536300502802302821d005363", + "0x503600509202801c00536300501c00504f02823100536300522d0052c6", + "0x52310053630052310050f002835e00536300535e0050c0028036005363", + "0x2804600536300535c00503102802836300502800702823135e03601c00a", + "0x50470050ec0280470053630050480310072ca028048005363005028030", + "0x2804600536300504600509202801c00536300501c00504f028045005363", + "0x35e04601c00a0050450053630050450050f002835e00536300535e0050c0", + "0x36300535f00503102802836300503100531c028028363005028007028045", + "0xc002824900536300524200509202824600536300501c00504f028242005", + "0x2865800502804d02824b00536300535d0052e002824a00536300535e005", + "0x536300500500503102802836300503100531c028028363005028007028", + "0x50c002824900536300524c00509202824600536300501000504f02824c", + "0x536300524b0052c602824b0053630050130052e002824a005363005007", + "0x50c002824900536300524900509202824600536300524600504f02824f", + "0x2824f24a24924600a00524f00536300524f0050f002824a00536300524a", + "0x2804f00536300502823902800b0053630050281bf028028363005028361", + "0x3100500a18e02804f00536300504f00518202800b00536300500b005182", + "0x2802836300502800702801304e1c603165901000f09203136300704f00b", + "0x5010005238028014005363005092005031028092005363005092005092", + "0x2803000536300503000523602802836300504d00523b02803004d007363", + "0x70300051c402801400536300501400509202800f00536300500f0050c0", + "0x2802836300501700523202802836300502800702801800565a017005363", + "0x536300502802002836100536300501400503102802836300500a00531c", + "0x36000735c02801b00536300501b00501b02801b005363005028230028360", + "0x536300501c35f00702d02835f00536300502802302801c00536300501b", + "0x509202802800536300502800504f02801f00536300535e0052c602835e", + "0x536300500f0050c0028007005363005007005301028361005363005361", + "0x502800702801f00f00736102800b00501f00536300501f0050f002800f", + "0x2822e028020005363005014005031028028363005018005047028028363", + "0x2802000536300502000509202835c00536300502823902835d005363005", + "0xf02000a18e02835c00536300535c00518202835d00536300535d005182", + "0x280283630050280070283590840c003165b35b02d02303136300735c35d", + "0x536300502300509202802836300500a00531c02802836300535b00523b", + "0x50282660283570053630050280200281a8005363005023005031028023", + "0x35600536300503235700735c02803200536300503200501b028032005363", + "0x330052c602803300536300535636400702d028364005363005028023028", + "0x1a80053630051a800509202802800536300502800504f02800c005363005", + "0xc0050f002802d00536300502d0050c0028007005363005007005301028", + "0x509202802836300502800702800c02d0071a802800b00500c005363005", + "0x736300535900503602803c0053630050c00050310280c00053630050c0", + "0x50c0028040005363005040005013028028363005036005040028040036", + "0x736300704000500f02803c00536300503c005092028084005363005084", + "0x3102802836300521900501c02802836300502800702822700565c21d219", + "0x3630052310051c602823100536300521d00501002822d00536300503c005", + "0x732602804600536300504600501b02804800536300502822c028046005", + "0x36300522d00509202804700536300504700501b028047005363005048046", + "0x3102802836300502800702804500565d02836300704700534202822d005", + "0x2490053630050282280282460053630050281c902824200536300522d005", + "0x9202824b24900736300524900522402824a246007363005246005224028", + "0x36300524b00518202824a00536300524a005182028242005363005242005", + "0x25825625303165e25224f24c03136300724b24a08424200a18e02824b005", + "0x36300524c00503102824c00536300524c005092028028363005028007028", + "0x9202824f00536300524f0050c0028252005363005252005236028050005", + "0x2800702805b00565f0090053630072520051c4028050005363005050005", + "0x28058005363005058005092028058005363005050005031028028363005", + "0x2800702806005e27703166027526c05c05900a36300700924f058031225", + "0x2805f005363005059005031028059005363005059005092028028363005", + "0x524600522002802836300505d0052680282af05d00736300526c005220", + "0x282af0053630052af0051820280283630052bc0052680280422bc007363", + "0x530a02806930600736300506700519c0280672af0073630052af005224", + "0x736300506800519c028068042007363005042005224028028363005069", + "0x52f10280710053630053060052f102802836300506f00530a02806f006", + "0x2805c00536300505c0050c002802836300502800b028347005363005006", + "0x34707100714b02805f00536300505f005092028275005363005275005182", + "0x2680280283630052af005268028028363005028007028028661028363007", + "0x2802836300500a00531c028028363005249005268028028363005275005", + "0x36300507400509202807400536300505f005031028028363005042005268", + "0x36300505f00503102802836300502800702802866200502804d028075005", + "0x19c02802836300534600530a0283453460073630052af00519c028077005", + "0x3630053450052f102802836300504300530a02807a043007363005042005", + "0x14b02807700536300507700509202807f00536300507a0052f1028079005", + "0x36300527500526802802836300502800702802866302836300707f079007", + "0x507700503102802836300500a00531c028028363005249005268028028", + "0x28081005363005075005307028075005363005342005092028342005363", + "0x2807d00536300507700503102802836300502800702802866400502804d", + "0x524900522002802836300534000526802833f340007363005275005220", + "0x33c33f00736300533f00522402802836300533e00526802833d33e007363", + "0x33d00522402802836300533700530a02833733b00736300533c00519c028", + "0x36300533500530a02833533600736300508c00519c02808c33d007363005", + "0x50920283340053630053360052f102808a00536300533b0052f1028028", + "0x36300502800702802866502836300733408a00714b02807d00536300507d", + "0x533d00526802802836300500a00531c02802836300533f005268028028", + "0x4d02808100536300533300509202833300536300507d005031028028363", + "0x19c02808800536300507d005031028028363005028007028028664005028", + "0x36300533d00519c02802836300533200530a02833133200736300533f005", + "0x2f102808e0053630053310052f102802836300533000530a028086330007", + "0x736f08e00714b02808800536300508800509202836f005363005086005", + "0x503102802836300500a00531c028028363005028007028028666028363", + "0x2802836300502836102808100536300532d00509202832d005363005088", + "0x536300532b00501b02832b00536300502821f02832c005363005028020", + "0x702d02832900536300502802302832a00536300532b32c00735c02832b", + "0x36300502800504f0283270053630053280052c602832800536300532a329", + "0xc0028007005363005007005301028081005363005081005092028028005", + "0x5c00708102800b0053270053630053270050f002805c00536300505c005", + "0x36300502821e028326005363005088005031028028363005028007028327", + "0x519c0283240053630050281cf02832500536300508b0050b902808b005", + "0x53630053230050b902802836300532000530a028320323007363005324", + "0x32500722102832500536300532500501b02809300536300502821a028085", + "0x3630050850950072ee02809500536300509500501b028095005363005093", + "0x502821702831e0053630050281d102809800536300502821802831f005", + "0x21502831c00536300531d00508102831d005363005028030028096005363", + "0x2800504f02831900536300531f0051d402831a00536300531c09631e031", + "0x7005363005007005301028326005363005326005092028028005363005", + "0x31a0051d602809800536300509800518202805c00536300505c0050c0028", + "0x9805c0073260280921d802831900536300531900521302831a005363005", + "0x31400521102802836300502800b02831431531631731800b36300531931a", + "0x5363005317005031028028363005028007028312005667313005363007", + "0x520c02831100536300531100509202830f005363005313005216028311", + "0x2836300502836102802836300502800702830c00566830e00536300730f", + "0x3630050280300280a900536300531100503102802836300530e005047028", + "0x280ac0053630050b00050ec0280b000536300530b00a0072ca02830b005", + "0x53160053010280a90053630050a900509202831800536300531800504f", + "0x50ac0053630050ac0050f00283150053630053150050c0028316005363", + "0x2802836300500a00531c0280283630050280070280ac3153160a931800b", + "0x530c30800735c02830800536300502802002830a005363005311005031", + "0x283050053630050b400522d0280b600536300530a0050920280b4005363", + "0x3102802836300500a00531c02802836300502800702802866900502804d", + "0x53030053460283023030073630053120050770280b9005363005317005", + "0x36102830500536300530200522d0280b60053630050b9005092028028363", + "0x30000536300530530100702d028301005363005028023028028363005028", + "0xb600509202831800536300531800504f0282ff0053630053000052c6028", + "0x3150053630053150050c00283160053630053160053010280b6005363005", + "0x3630050280070282ff3153160b631800b0052ff0053630052ff0050f0028", + "0x524600526802802836300524900526802802836300500a00531c028028", + "0x230282fe005363005277005031028277005363005277005092028028363", + "0x3630052fd0052c60282fd0053630050600bf00702d0280bf005363005028", + "0x3010282fe0053630052fe00509202802800536300502800504f0282fc005", + "0x3630052fc0050f002805e00536300505e0050c0028007005363005007005", + "0x505b0050470280283630050280070282fc05e0072fe02800b0052fc005", + "0x24600526802802836300524900526802802836300500a00531c028028363", + "0x24b0280510053630050280200282fb005363005050005031028028363005", + "0x36300538b05100735c02838b00536300538b00501b02838b005363005028", + "0x2c60280dc00536300538c38d00702d02838d00536300502802302838c005", + "0x3630052fb00509202802800536300502800504f02838f0053630050dc005", + "0xf002824f00536300524f0050c00280070053630050070053010282fb005", + "0x2802836300502800702838f24f0072fb02800b00538f00536300538f005", + "0x2836300524600526802802836300524900526802802836300500a00531c", + "0x50280230280c7005363005253005031028253005363005253005092028", + "0xcb0053630050c90052c60280c90053630052580c600702d0280c6005363", + "0x70053010280c70053630050c700509202802800536300502800504f028", + "0xcb0053630050cb0050f00282560053630052560050c0028007005363005", + "0x283630050450053400280283630050280070280cb2560070c702800b005", + "0x3630050280200280cf00536300522d00503102802836300500a00531c028", + "0x735c02839000536300539000501b0283900053630050282640282fa005", + "0x36300530739100702d0283910053630050280230283070053630053902fa", + "0x9202802800536300502800504f0280d40053630052f40052c60282f4005", + "0x3630050840050c00280070053630050070053010280cf0053630050cf005", + "0x280070280d40840070cf02800b0050d40053630050d40050f0028084005", + "0x503102802836300500a00531c02802836300522700501c028028363005", + "0x283920053630050282630280d50053630050280200282f300536300503c", + "0x50280230282f10053630053920d500735c02839200536300539200501b", + "0xda0053630052ea0052c60282ea0053630052f12f000702d0282f0005363", + "0x70053010282f30053630052f300509202802800536300502800504f028", + "0xda0053630050da0050f00280840053630050840050c0028007005363005", + "0x2836300500a00531c0280283630050280070280da0840072f302800b005", + "0x50280230282e70053630051c60050310281c60053630051c6005092028", + "0x2e80053630050d20052c60280d20053630050132e500702d0282e5005363", + "0x70053010282e70053630052e700509202802800536300502800504f028", + "0x2e80053630052e80050f002804e00536300504e0050c0028007005363005", + "0x536300502823902800a0053630050281bf0282e804e0072e702800b005", + "0xa20b02800b00536300500b00518202800a00536300500a00518202800b", + "0x36300502800702804e1c601003166a00f09204f03136300700b00a007005", + "0x520a02801300536300504f00503102804f00536300504f005092028028", + "0x536300504d00520802802836300501400520902804d01400736300500f", + "0x52070280130053630050130050920280920053630050920050c002804d", + "0x36300503000520602802836300502800702801700566b03000536300704d", + "0x502802002801800536300501300503102802836300503100531c028028", + "0x35c02836000536300536000501b028360005363005028230028361005363", + "0x501b01c00702d02801c00536300502802302801b005363005360361007", + "0x2802800536300502800504f02835e00536300535f0052c602835f005363", + "0x535e0050f00280920053630050920050c0028018005363005018005092", + "0x501700504702802836300502800702835e09201802800a00535e005363", + "0x282390280200053630050281df02801f005363005013005031028028363", + "0x2000536300502000518202801f00536300501f00509202835d005363005", + "0x2335c03136300735d02009201f00a20b02835d00536300535d005182028", + "0x2802836300502d0052090280283630050280070280840c035b03166c02d", + "0x36300535c00503102835c00536300535c00509202802836300503100531c", + "0x35700501b0283570053630050282660281a8005363005028020028359005", + "0x3560053630050280230280320053630053571a800735c028357005363005", + "0x504f0280330053630053640052c602836400536300503235600702d028", + "0x53630050230050c0028359005363005359005092028028005363005028", + "0x36300502800702803302335902800a0050330053630050330050f0028023", + "0x503602800c00536300535b00503102835b00536300535b005092028028", + "0x536300503600501302802836300503c00504002803603c007363005084", + "0x500f02800c00536300500c0050920280c00053630050c00050c0028036", + "0x504000501c02802836300502800702821d00566d219040007363007036", + "0x1c602822d00536300521900501002822700536300500c005031028028363", + "0x536300523100501b02804600536300502822c02823100536300522d005", + "0x9202804800536300504800501b028048005363005046231007326028231", + "0x502800702804700566e028363007048005342028227005363005227005", + "0x281ff028242005363005028201028045005363005227005031028028363", + "0x7363005246005224028249242007363005242005224028246005363005", + "0x18202824900536300524900518202804500536300504500509202824a246", + "0x66f24f24c24b03136300724a2490c004500a20b02824a00536300524a005", + "0x3102824b00536300524b005092028028363005028007028256253252031", + "0x36300524c0050c002824f00536300524f00520802825800536300524b005", + "0x567005000536300724f00520702825800536300525800509202824c005", + "0x505b00509202805b005363005258005031028028363005028007028009", + "0x27727503167126c05c05905800a36300705024c05b0311fd02805b005363", + "0x505800503102805800536300505800509202802836300502800702805e", + "0x2802836300505f00526802805d05f00736300505c005220028060005363", + "0x505d0051820280283630052af0052680282bc2af007363005242005220", + "0x6700736300504200519c02804205d00736300505d00522402805d005363", + "0x519c0280692bc0073630052bc00522402802836300530600530a028306", + "0x53630050670052f102802836300500600530a028006068007363005069", + "0x51820280590053630050590050c00280710053630050680052f102806f", + "0x36300707106f00714b02806000536300506000509202826c00536300526c", + "0x26c00526802802836300505d005268028028363005028007028028672028", + "0x526802802836300503100531c028028363005246005268028028363005", + "0x740053630053470050920283470053630050600050310280283630052bc", + "0x7500536300506000503102802836300502800702802867300502804d028", + "0x2bc00519c02802836300507700530a02834607700736300505d00519c028", + "0x7a0053630053460052f102802836300534500530a028043345007363005", + "0x7a00714b0280750053630050750050920280790053630050430052f1028", + "0x2802836300526c005268028028363005028007028028674028363007079", + "0x536300507500503102802836300503100531c028028363005246005268", + "0x2804d02834200536300507400530702807400536300507f00509202807f", + "0x5220028081005363005075005031028028363005028007028028675005", + "0x736300524600522002802836300507d00526802834007d00736300526c", + "0x19c02833d34000736300534000522402802836300533f00526802833e33f", + "0x36300533e00522402802836300533b00530a02833b33c00736300533d005", + "0x2802836300533600530a02833608c00736300533700519c02833733e007", + "0x508100509202808a00536300508c0052f102833500536300533c0052f1", + "0x2802836300502800702802867602836300708a33500714b028081005363", + "0x2836300533e00526802802836300503100531c028028363005340005268", + "0x502804d028342005363005334005092028334005363005081005031028", + "0x34000519c028333005363005081005031028028363005028007028028675", + "0x33100736300533e00519c02802836300508800530a028332088007363005", + "0x3300052f10280860053630053320052f102802836300533100530a028330", + "0x2836300708e08600714b02833300536300533300509202808e005363005", + "0x533300503102802836300503100531c028028363005028007028028677", + "0x21f02832d00536300502802002834200536300536f00509202836f005363", + "0x36300532c32d00735c02832c00536300532c00501b02832c005363005028", + "0x2c602832900536300532b32a00702d02832a00536300502802302832b005", + "0x36300534200509202802800536300502800504f028328005363005329005", + "0xa0053280053630053280050f00280590053630050590050c0028342005", + "0x1fb028327005363005333005031028028363005028007028328059342028", + "0x2836300508b00501f02808b0053630053260050b9028326005363005028", + "0x32300530a02832332400736300532500519c0283250053630050281f8028", + "0x1f102802836300532000501f0283200053630053240050b9028028363005", + "0x3270053630053270050920280930053630050281ec028085005363005028", + "0x32700a20b028093005363005093005182028085005363005085005182028", + "0x2836300502800702831d09631e03167809831f095031363007093085059", + "0x9800520802831c005363005095005031028095005363005095005092028", + "0x31c00536300531c00509202831f00536300531f0050c0028098005363005", + "0x503102802836300502800702831900567931a005363007098005207028", + "0x2831600536300502856602831700536300502800002831800536300531c", + "0x36300531800509202802800536300502800504f028315005363005028567", + "0x18202831700536300531700518202831f00536300531f0050c0028318005", + "0x36300531a005568028315005363005315005182028316005363005316005", + "0x2831131231331400a36300531a31531631731f31802809256902831a005", + "0x30f00556c02802836300502800702830e00567a30f00536300731100556a", + "0x2ca0280a900536300502803002830c005363005313005031028028363005", + "0x531400504f0280b000536300530b0050ec02830b0053630050a9031007", + "0x283120053630053120050c002830c00536300530c005092028314005363", + "0x280283630050280070280b031230c31400a0050b00053630050b00050f0", + "0x36300530e0052c60280ac00536300531300503102802836300503100531c", + "0xc00280ac0053630050ac00509202831400536300531400504f02830a005", + "0x30a3120ac31400a00530a00536300530a0050f0028312005363005312005", + "0x2836300503100531c028028363005319005047028028363005028007028", + "0x36300502824b0280b400536300502802002830800536300531c005031028", + "0x283050053630050b60b400735c0280b60053630050b600501b0280b6005", + "0x53030052c60283030053630053050b900702d0280b9005363005028023", + "0x2830800536300530800509202802800536300502800504f028302005363", + "0x31f30802800a0053020053630053020050f002831f00536300531f0050c0", + "0x36300531e00509202802836300503100531c028028363005028007028302", + "0x702d02830000536300502802302830100536300531e00503102831e005", + "0x36300502800504f0282fe0053630052ff0052c60282ff00536300531d300", + "0xf00280960053630050960050c0028301005363005301005092028028005", + "0x31c0280283630050280070282fe09630102800a0052fe0053630052fe005", + "0x28028363005242005268028028363005246005268028028363005031005", + "0x3630050280230280bf005363005275005031028275005363005275005092", + "0x282fb0053630052fc0052c60282fc00536300505e2fd00702d0282fd005", + "0x52770050c00280bf0053630050bf00509202802800536300502800504f", + "0x280070282fb2770bf02800a0052fb0053630052fb0050f0028277005363", + "0x526802802836300503100531c028028363005009005047028028363005", + "0x28051005363005258005031028028363005242005268028028363005246", + "0x536300538c00501b02838c00536300502824b02838b005363005028020", + "0x702d0280dc00536300502802302838d00536300538c38b00735c02838c", + "0x36300502800504f0280c700536300538f0052c602838f00536300538d0dc", + "0xf002824c00536300524c0050c0028051005363005051005092028028005", + "0x31c0280283630050280070280c724c05102800a0050c70053630050c7005", + "0x28028363005242005268028028363005246005268028028363005031005", + "0x3630050280230280c6005363005252005031028252005363005252005092", + "0x280cf0053630050cb0052c60280cb0053630052560c900702d0280c9005", + "0x52530050c00280c60053630050c600509202802800536300502800504f", + "0x280070280cf2530c602800a0050cf0053630050cf0050f0028253005363", + "0x503102802836300503100531c028028363005047005340028028363005", + "0x283070053630050282640283900053630050280200282fa005363005227", + "0x502802302839100536300530739000735c02830700536300530700501b", + "0x2f30053630050d40052c60280d40053630053912f400702d0282f4005363", + "0xc00050c00282fa0053630052fa00509202802800536300502800504f028", + "0x70282f30c02fa02800a0052f30053630052f30050f00280c0005363005", + "0x3102802836300503100531c02802836300521d00501c028028363005028", + "0x2f10053630050282630283920053630050280200280d500536300500c005", + "0x280230282f00053630052f139200735c0282f10053630052f100501b028", + "0x53630050da0052c60280da0053630052f02ea00702d0282ea005363005", + "0x50c00280d50053630050d500509202802800536300502800504f0282e7", + "0x282e70c00d502800a0052e70053630052e70050f00280c00053630050c0", + "0x1000536300501000509202802836300503100531c028028363005028007", + "0x4e0d200702d0280d20053630050280230282e5005363005010005031028", + "0x2800536300502800504f0280db0053630052e80052c60282e8005363005", + "0xdb0050f00281c60053630051c60050c00282e50053630052e5005092028", + "0x280070050280283630050283610280db1c62e502800a0050db005363005", + "0x4f00503102802836300502800702800f09200767b04f00b007363007005", + "0x536300504e00534702804e1c600736300500a005036028010005363005", + "0x1400503302801300536300501300503302801400536300502856d028013", + "0x36300701401300b03156e028010005363005010005092028014005363005", + "0x2836300503000523102802836300502800702801801700767c03004d007", + "0x36100509202804d00536300504d00504f028361005363005010005031028", + "0x502800702801c00567d01b3600073630071c6005570028361005363005", + "0x22d02835e00536300501b00501002835f005363005361005031028028363", + "0x36300535e00501b02835f00536300535f005092028360005363005360005", + "0x2836300502800702835d00567e02001f00736300736000557002835e005", + "0x1f00522d02802300536300502000501002835c00536300535f005031028", + "0x2300536300502300501b02835c00536300535c00509202801f005363005", + "0x310280283630050280070280c000567f35b02d00736300701f005570028", + "0x36300535900501b02835900536300535b00501002808400536300535c005", + "0x2802d00536300502d00522d0281a835900736300535900538d028359005", + "0x280070283570056800283630071a8005342028084005363005084005092", + "0x9202803200536300508400503102802836300535900501f028028363005", + "0x2803300568136435600736300735e04d007253028032005363005032005", + "0x736300502d00503602800c005363005032005031028028363005028007", + "0x509202804000536300503600521902802836300503c00504002803603c", + "0x2336400700c00b27702835600536300535600504f02800c00536300500c", + "0x24202802836300502800702804623122d03168222721d219031363007040", + "0x5363005219005031028219005363005219005092028028363005227005", + "0x50c002804500536300504800509202804700536300535600504f028048", + "0x531c02802836300502800702802868300502804d02824200536300521d", + "0x24600536300522d00503102822d00536300522d005092028028363005031", + "0x24a00557102824a00536300504624900702d028249005363005028023028", + "0x24600536300524600509202835600536300535600504f02824b005363005", + "0x24635600a00524b00536300524b0055720282310053630052310050c0028", + "0x502d00504002802836300503100531c02802836300502800702824b231", + "0x2802002824c00536300503200503102802836300502300501f028028363", + "0x2825200536300525200501b02825200536300502824b02824f005363005", + "0x25325600702d02825600536300502802302825300536300525224f00735c", + "0x3300536300503300504f028050005363005258005571028258005363005", + "0x500055720280070053630050070050c002824c00536300524c005092028", + "0x35700534002802836300502800702805000724c03300a005050005363005", + "0x32602805b00536300502824a028009005363005084005031028028363005", + "0x500900509202805800536300505800501b02805800536300505b359007", + "0x28028363005028007028059005684028363007058005342028009005363", + "0x35e04d00707f02805c00536300505c00509202805c005363005009005031", + "0x36300505c00503102802836300502800702827700568527526c007363007", + "0x21902802836300506000504002805f06000736300502d00503602805e005", + "0x36300526c00504f02805e00536300505e00509202805d00536300505f005", + "0x3060670316860422bc2af03136300705d02327500705e00b31402826c005", + "0x3630052af005092028028363005042005242028028363005028007028069", + "0x9202800600536300526c00504f0280680053630052af0050310282af005", + "0x2868700502804d0280710053630052bc0050c002806f005363005068005", + "0x536300506700509202802836300503100531c028028363005028007028", + "0x7400702d028074005363005028023028347005363005067005031028067", + "0x536300526c00504f028077005363005075005571028075005363005069", + "0x55720283060053630053060050c002834700536300534700509202826c", + "0x531c02802836300502800702807730634726c00a005077005363005077", + "0x3102802836300502300501f02802836300502d005040028028363005031", + "0x4300536300502824b02834500536300502802002834600536300505c005", + "0x2802302807a00536300504334500735c02804300536300504300501b028", + "0x536300507f00557102807f00536300507a07900702d028079005363005", + "0x50c002834600536300534600509202827700536300527700504f028342", + "0x2834200734627700a005342005363005342005572028007005363005007", + "0x2802836300535e00501f028028363005059005340028028363005028007", + "0x36300502300538d02807d005363005028573028081005363005009005031", + "0x33f00536300533f00501b02833f00536300507d340007326028340023007", + "0x702833e00568802836300733f005342028081005363005081005092028", + "0x2833d00536300508100503102802836300502300501f028028363005028", + "0x50070050c002833d00536300533d00509202804d00536300504d00504f", + "0x502d03100733d04d00b2fd02802d00536300502d00522d028007005363", + "0x34002802836300502800702808c33733b33c00a00508c33733b33c00a363", + "0x33600536300508100503102802836300502d00504002802836300533e005", + "0x8a00501b02808a005363005335023007326028335005363005028574028", + "0x68902836300708a00534202833600536300533600509202808a005363005", + "0x533600503102802836300503100531c028028363005028007028334005", + "0x501b028332005363005028051028088005363005028020028333005363", + "0x536300502802302833100536300533208800735c028332005363005332", + "0x4f02808e00536300508600557102808600536300533133000702d028330", + "0x3630050070050c002833300536300533300509202804d00536300504d005", + "0x502800702808e00733304d00a00508e00536300508e005572028007005", + "0x504f02836f005363005336005031028028363005334005340028028363", + "0x53630050070050c002806f00536300536f00509202800600536300504d", + "0x557602804500536300506f005307028047005363005006005390028071", + "0x536300532d03100736d02832d005363005028249028242005363005071", + "0x4700a00532b00536300532b00557202832b00536300532c00557702832c", + "0x3100531c0280283630050c000504002802836300502800702832b242045", + "0x503102802836300535e00501f02802836300502300501f028028363005", + "0x2832800536300502824b02832900536300502802002832a00536300535c", + "0x502802302832700536300532832900735c02832800536300532800501b", + "0x32500536300508b00557102808b00536300532732600702d028326005363", + "0x70050c002832a00536300532a00509202804d00536300504d00504f028", + "0x702832500732a04d00a005325005363005325005572028007005363005", + "0x1f02802836300503100531c02802836300535d005040028028363005028", + "0x32300536300502802002832400536300535f00503102802836300535e005", + "0x32032300735c02832000536300532000501b02832000536300502824b028", + "0x9500536300508509300702d028093005363005028023028085005363005", + "0x32400509202804d00536300504d00504f02831f005363005095005571028", + "0x31f00536300531f0055720280070053630050070050c0028324005363005", + "0x2802836300501c00504002802836300502800702831f00732404d00a005", + "0x536300502802002809800536300536100503102802836300503100531c", + "0x31e00735c02809600536300509600501b02809600536300502824b02831e", + "0x536300531d31c00702d02831c00536300502802302831d005363005096", + "0x509202804d00536300504d00504f02831900536300531a00557102831a", + "0x53630053190055720280070053630050070050c0028098005363005098", + "0x2836300501800523102802836300502800702831900709804d00a005319", + "0x3630050100050310280283630051c600504002802836300503100531c028", + "0x31600501b028316005363005028578028317005363005028020028318005", + "0x31400536300502802302831500536300531631700735c028316005363005", + "0x504f02831200536300531300557102831300536300531531400702d028", + "0x53630050070050c0028318005363005318005092028017005363005017", + "0x36300502800702831200731801700a005312005363005312005572028007", + "0x500f00503102802836300503100531c02802836300500a005040028028", + "0x501b02830e00536300502804602830f005363005028020028311005363", + "0x536300502802302830c00536300530e30f00735c02830e00536300530e", + "0x4f0280b000536300530b00557102830b00536300530c0a900702d0280a9", + "0x3630050070050c0028311005363005311005092028092005363005092005", + "0x50283610280b000731109200a0050b00053630050b0005572028007005", + "0x502800702809204f00768a00b00a007363007005028007005028028363", + "0x2801003100736300503100538d02800f00536300500b005031028028363", + "0x701000534202800f00536300500f00509202800a00536300500a00504f", + "0x1f02802836300500700531c0280283630050280070281c600568b028363", + "0x1300536300502802002804e00536300500f005031028028363005031005", + "0x1401300735c02801400536300501400501b028014005363005028579028", + "0x1700536300504d03000702d02803000536300502802302804d005363005", + "0x4e00509202800a00536300500a00504f0280180053630050170052c6028", + "0x2800702801804e00a0310050180053630050180050f002804e005363005", + "0x24a02836100536300500f0050310280283630051c6005340028028363005", + "0x36300500a00504f02801b005363005360031007326028360005363005028", + "0x38b02801b00536300501b00501b02836100536300536100509202800a005", + "0x502800702835e35f01c03100535e35f01c03136300501b00736100a00a", + "0x9200503102802836300503100501f02802836300500700531c028028363", + "0x1b02835d00536300502804602802000536300502802002801f005363005", + "0x36300502802302835c00536300535d02000735c02835d00536300535d005", + "0x2835b00536300502d0052c602802d00536300535c02300702d028023005", + "0x535b0050f002801f00536300501f00509202804f00536300504f00504f", + "0x700502800700502802836300502836102835b01f04f03100535b005363", + "0x36300500b00503102802836300502800702809204f00768c00b00a007363", + "0x2800a00536300500a00504f02801003100736300503100538d02800f005", + "0x280070281c600568d02836300701000534202800f00536300500f005092", + "0x3002804e00536300500f00503102802836300503100501f028028363005", + "0x3630050140050ec0280140053630050130070072ca028013005363005028", + "0xf002804e00536300504e00509202800a00536300500a00504f02804d005", + "0x534002802836300502800702804d04e00a03100504d00536300504d005", + "0x2801700536300502824a02803000536300500f0050310280283630051c6", + "0x3000509202800a00536300500a00504f028018005363005017031007326", + "0x501800703000a00a38c02801800536300501800501b028030005363005", + "0x3100501f02802836300502800702801b36036103100501b360361031363", + "0x2002801c00536300509200503102802836300500700531c028028363005", + "0x35e00536300535e00501b02835e00536300502804602835f005363005028", + "0x2000702d02802000536300502802302801f00536300535e35f00735c028", + "0x536300504f00504f02835c00536300535d0052c602835d00536300501f", + "0x4f03100535c00536300535c0050f002801c00536300501c00509202804f", + "0x557d02801000536300500f00557c02800f00536300502857a02835c01c", + "0x536300504e00557f0280283630051c600557e02804e1c6007363005010", + "0x1b02804d00b00736300500b00538d0280140053630050130051c6028013", + "0x501b02801703000736300504d014007031581028014005363005014005", + "0x536100536c028361018007363005017028007582028017005363005017", + "0x2802836300501b00558402801c01b007363005360005583028360005363", + "0x535e00558602835e00536300535f0052bd02835f00536300501c005585", + "0x2835d00536300502803202802000536300501f00533402801f35e007363", + "0x300050c702835c00536300535c00503302835c35d00736300535d005356", + "0x702035c03100500a03c02801800536300501800504f028030005363005", + "0x230050920280283630050280070283590840c003168e35b02d023031363", + "0x283570053630050285870281a8005363005023005031028023005363005", + "0x35d0050330281a80053630051a800509202803200536300535735e007588", + "0x35b00536300535b00501b02803200536300503200508802835d005363005", + "0x702803603c00c03168f03336435603136300703235d02d1a800a03c028", + "0x40005363005356005031028356005363005356005092028028363005028", + "0x521d00557d02821d00536300521900557c02821900536300502857a028", + "0x2823100536300522d00557f02802836300522700557e02822d227007363", + "0x4603003158102804600536300504600501b0280460053630052310051c6", + "0x504701800758202804700536300504700501b02804704800736300500b", + "0x5363005246005334028246242007363005242005586028242045007363", + "0x535602824b00536300502803202824a00536300504f35b0072ee028249", + "0x36300524c00503302804000536300504000509202824c24b00736300524b", + "0xc702803300536300503300501b02824a00536300524a00501b02824c005", + "0x24c36404000b00c02804500536300504500504f028048005363005048005", + "0x9202802836300502800702825825625303169025224f00736300724a249", + "0x536300502858702805000536300524f00503102824f00536300524f005", + "0x280580053630050920330072ee02805b005363005009242007588028009", + "0x505b00508802824b00536300524b005033028050005363005050005092", + "0x705805b24b25205000b00c02805800536300505800501b02805b005363", + "0x505900509202802836300502800702827727526c03169105c059007363", + "0x2ca02806000536300502803002805e005363005059005031028059005363", + "0x504500504f02805d00536300505f0050ec02805f00536300506000a007", + "0x280480053630050480050c702805e00536300505e005092028045005363", + "0x4805e04500b00505d00536300505d0050f002805c00536300505c0050c0", + "0x526c00509202802836300500a00531c02802836300502800702805d05c", + "0x282bc0053630052af0050920282af00536300526c00503102826c005363", + "0x69200502804d02806700536300527700522d0280420053630052750050c0", + "0x36300524200558902802836300500a00531c028028363005028007028028", + "0x509200501f02802836300524b00523102802836300503300501f028028", + "0x92028306005363005253005031028253005363005253005092028028363", + "0x36300525800522d0280420053630052560050c00282bc005363005306005", + "0x2c602806800536300506706900702d028069005363005028023028067005", + "0x3630052bc00509202804500536300504500504f028006005363005068005", + "0xf00280420053630050420050c00280480053630050480050c70282bc005", + "0x280283630050280070280060420482bc04500b005006005363005006005", + "0x2836300535b00501f02802836300500a00531c02802836300504f00501f", + "0x36300500c00509202802836300509200501f02802836300500b00501f028", + "0xc002807100536300506f00509202806f00536300500c00503102800c005", + "0x2869300502804d02807400536300503600522d02834700536300503c005", + "0x2836300500a00531c02802836300504f00501f028028363005028007028", + "0x36300509200501f02802836300500b00501f02802836300535d005231028", + "0xc00050310280c00053630050c000509202802836300535e005589028028", + "0x3470053630050840050c0028071005363005075005092028075005363005", + "0x7407700702d02807700536300502802302807400536300535900522d028", + "0x1800536300501800504f0283450053630053460052c6028346005363005", + "0x3470050c00280300053630050300050c7028071005363005071005092028", + "0x2834534703007101800b0053450053630053450050f0028347005363005", + "0x501000557c02801000536300502857a02800f09200736300504f0052f3", + "0x2802836300504e00557e02801304e0073630051c600557d0281c6005363", + "0x509200538d02804d0053630050140051c602801400536300501300557f", + "0x36300503004d03103158102804d00536300504d00501b028030092007363", + "0x36100736300501802800758202801800536300501800501b028018017007", + "0x58402835f01c00736300501b00558302801b00536300536000536c028360", + "0x536300535e0052bd02835e00536300535f00558502802836300501c005", + "0x3202835d00536300502000533402802001f00736300501f00558602801f", + "0x36300502300503302802335c00736300535c00535602835c005363005028", + "0x3c02836100536300536100504f0280170053630050170050c7028023005", + "0x50280070281a83590840316940c035b02d03136300735d02300a00500a", + "0x58702835700536300502d00503102802d00536300502d005092028028363", + "0x36300535700509202835600536300503201f007588028032005363005028", + "0x1b02835600536300535600508802835c00536300535c005033028357005", + "0x69500c03336403136300735635c35b35700a03c0280c00053630050c0005", + "0x3102836400536300536400509202802836300502800702804003603c031", + "0x36300500c00501b0280330053630050330050c0028219005363005364005", + "0x22721d0073630070c03610070ac02821900536300521900509202800c005", + "0x2804800536300521900503102802836300502800702804623122d031696", + "0x24203169704504700736300700c21d0070ac028048005363005048005092", + "0xf00539202824a005363005048005031028028363005028007028249246", + "0x30a02825625325224f00a36300524b22700703158a02824c24b007363005", + "0x2580053630052530050b902802836300525600530a028028363005252005", + "0x2836300500900530a02805805b00905000a36300524c04524f03158a028", + "0x36300502857a02805900536300505b0050b902802836300505800530a028", + "0x2827727500736300526c00557d02826c00536300505c00557c02805c005", + "0x36300505e0051c602805e00536300527700557f02802836300527500557e", + "0x5f00736300509206001703158102806000536300506000501b028060005", + "0x282bc2af00736300505d04700758202805d00536300505d00501b02805d", + "0x50280320280670053630050420053340280422bc0073630052bc005586", + "0x24a00536300524a005092028069306007363005306005356028306005363", + "0x5000530102825800536300525800501b028069005363005069005033028", + "0x5f00536300505f0050c702805900536300505900501b028050005363005", + "0x6800736300725806706903324a00b00c0282af0053630052af00504f028", + "0x6800536300506800509202802836300502800702834707106f031698006", + "0x752bc007588028075005363005028587028074005363005068005031028", + "0x306005363005306005033028074005363005074005092028077005363005", + "0x34600736300705907730600607400b00c028077005363005077005088028", + "0x34600536300534600509202802836300502800702807907a043031699345", + "0x34200b0072ca02834200536300502803002807f005363005346005031028", + "0x2af0053630052af00504f02807d0053630050810050ec028081005363005", + "0x5f0050c702805000536300505000530102807f00536300507f005092028", + "0x7d00536300507d0050f00283450053630053450050c002805f005363005", + "0x36300500b00531c02802836300502800702807d34505f05007f2af04f005", + "0x5092028340005363005043005031028043005363005043005092028028", + "0x536300507900522d02833e00536300507a0050c002833f005363005340", + "0x2836300500b00531c02802836300502800702802869a00502804d02833d", + "0x3630053060052310280283630052bc00558902802836300505900501f028", + "0x509202833c00536300506f00503102806f00536300506f005092028028", + "0x536300534700522d02833e0053630050710050c002833f00536300533c", + "0x52c602833700536300533d33b00702d02833b00536300502802302833d", + "0x536300533f0050920282af0053630052af00504f02808c005363005337", + "0x50c002805f00536300505f0050c702805000536300505000530102833f", + "0x33e05f05033f2af04f00508c00536300508c0050f002833e00536300533e", + "0x36300524900530a02802836300524600530a02802836300502800702808c", + "0x500f0050d502802836300509200501f02802836300500b00531c028028", + "0x2802002833600536300504800503102802836300522700530a028028363", + "0x2808a00536300508a00501b02808a00536300502824b028335005363005", + "0x33433300702d02833300536300502802302833400536300508a33500735c", + "0x24200536300524200504f0283320053630050880052c6028088005363005", + "0x170050c7028007005363005007005301028336005363005336005092028", + "0x3320053630053320050f00280330053630050330050c0028017005363005", + "0x36300523100530a02802836300502800702833203301700733624204f005", + "0x509200501f02802836300500b00531c02802836300504600530a028028", + "0x21900503102802836300500c00501f02802836300500f0050d5028028363", + "0x1b02808600536300502824b028330005363005028020028331005363005", + "0x36300502802302808e00536300508633000735c028086005363005086005", + "0x2832c00536300532d0052c602832d00536300508e36f00702d02836f005", + "0x500700530102833100536300533100509202822d00536300522d00504f", + "0x280330053630050330050c00280170053630050170050c7028007005363", + "0x36300502800702832c03301700733122d04f00532c00536300532c0050f0", + "0x509200501f02802836300500b00531c0280283630050c000501f028028", + "0x503102803c00536300503c00509202802836300500f0050d5028028363", + "0x53630050360050c002832a00536300532b00509202832b00536300503c", + "0x36300502800702802869b00502804d02832800536300504000522d028329", + "0x509200501f02802836300500b00531c02802836300535c005231028028", + "0x8400509202802836300501f00558902802836300500f0050d5028028363", + "0x32a005363005327005092028327005363005084005031028084005363005", + "0x50280230283280053630051a800522d0283290053630053590050c0028", + "0x32500536300508b0052c602808b00536300532832600702d028326005363", + "0x700530102832a00536300532a00509202836100536300536100504f028", + "0x3290053630053290050c00280170053630050170050c7028007005363005", + "0x502858b02832532901700732a36104f0053250053630053250050f0028", + "0x1b02800a00536300500a00501b02800b00536300502858c02800a005363", + "0x2800702802869c04f00536300700b00a00758d02800b00536300500b005", + "0x2804f00536300504f00558e028092005363005005005031028028363005", + "0x536300502859102801000536300502859002800f00536300504f00558f", + "0x50920281c60053630051c600501b02801000536300501000501b0281c6", + "0x502800702802869d04e0053630071c601000758d028092005363005092", + "0x58f02804e00536300504e00558e028013005363005092005031028028363", + "0x501300509202804d01400736300501400559202801400536300504e005", + "0x2802836300502800702803000569e02836300704d00536b028013005363", + "0x50170050920280180053630050280052ea028017005363005013005031", + "0x2800702802869f00502804d028360005363005014005593028361005363", + "0x59502801b005363005013005031028028363005014005594028028363005", + "0x35f00536300535f00501b02835f00536300502859602801c005363005028", + "0x1f00536300501f00559802801f35e00736300503035f01c02800a597028", + "0x1f00559902835e00536300535e0052ea02801b00536300501b005092028", + "0x35d00536300501b0050310280283630050280070280286a0020005363007", + "0x35d00509202801800536300535e0052ea02835c00536300502000558f028", + "0x702802869f00502804d02836000536300535c005593028361005363005", + "0x2802d00536300502859a02802300536300501b005031028028363005028", + "0x502d00559302836100536300502300509202801800536300535e0052ea", + "0x6a102836300735b00536b02835b360007363005360005592028360005363", + "0x53610050310280283630053600055940280283630050280070280c0005", + "0x281a800536300500f005593028359005363005084005092028084005363", + "0x283570053630053610050310280283630050280070280286a200502804d", + "0x280070280320056a302836300700f00536b028357005363005357005092", + "0x920283560053630053570050310280283630050c000536a028028363005", + "0x286a200502804d0281a8005363005360005593028359005363005356005", + "0x5363005357005031028028363005360005594028028363005028007028", + "0x559802800c0053630050c003300759b028033005363005028595028364", + "0x36300503c00559802803c00536300503200c00759b02800c00536300500c", + "0x286a403600536300703c00559902836400536300536400509202803c005", + "0x36300503600558f028040005363005364005031028028363005028007028", + "0x4d0281a8005363005219005593028359005363005040005092028219005", + "0x59a02821d0053630053640050310280283630050280070280286a2005028", + "0x536300522700559302835900536300521d005092028227005363005028", + "0x531c02802836300502800702822d0056a50283630071a800536b0281a8", + "0x28046005363005028020028231005363005359005031028028363005031", + "0x504804600735c02804800536300504800501b02804800536300502824b", + "0x2824200536300504704500702d028045005363005028023028047005363", + "0x52310050920280180053630050180052ea0282460053630052420052c6", + "0x52460053630052460050f00280070053630050070050c0028231005363", + "0x2824900536300535900503102802836300502800702824600723101800a", + "0x524c00558602824c00536300502859e02824b24a00736300522d00559c", + "0x2825300536300502803202825200536300524f00533402824f24c007363", + "0x256005033028249005363005249005092028256253007363005253005356", + "0x24a25225600724900b00c028252005363005252005088028256005363005", + "0x25800509202802836300502800702805805b0090316a6050258007363007", + "0x2805c005363005028587028059005363005258005031028258005363005", + "0x5900509202826c00536300505c24c00758802824c00536300524c00559f", + "0x26c00536300526c005088028253005363005253005033028059005363005", + "0x702805f06005e0316a727727500736300724b26c25305005900b00c028", + "0x5d005363005275005031028275005363005275005092028028363005028", + "0x2bc0050ec0282bc0053630052af0310072ca0282af005363005028030028", + "0x5d00536300505d0050920280180053630050180052ea028042005363005", + "0x5d01800a0050420053630050420050f00282770053630052770050c0028", + "0x505e00509202802836300503100531c028028363005028007028042277", + "0x2830600536300506700509202806700536300505e00503102805e005363", + "0x6a800502804d02806800536300505f00522d0280690053630050600050c0", + "0x36300524b00501f02802836300503100531c028028363005028007028028", + "0x500900509202802836300525300523102802836300524c005589028028", + "0x28306005363005006005092028006005363005009005031028009005363", + "0x36300502802302806800536300505800522d02806900536300505b0050c0", + "0x283470053630050710052c602807100536300506806f00702d02806f005", + "0x50690050c00283060053630053060050920280180053630050180052ea", + "0x2800702834706930601800a0053470053630053470050f0028069005363", + "0x503102802836300503100531c02802836300500f005594028028363005", + "0x2807700536300502824b028075005363005028020028074005363005092", + "0x502802302834600536300507707500735c02807700536300507700501b", + "0x7a0053630050430052c602804300536300534634500702d028345005363", + "0x70050c00280740053630050740050920280280053630050280052ea028", + "0x702807a00707402800a00507a00536300507a0050f0028007005363005", + "0x2807900536300500500503102802836300503100531c028028363005028", + "0x536300534200501b02834200536300502824b02807f005363005028020", + "0x702d02807d00536300502802302808100536300534207f00735c028342", + "0x3630050280052ea02833f0053630053400052c602834000536300508107d", + "0xf00280070053630050070050c0028079005363005079005092028028005", + "0x3136300703100500713402833f00707902800a00533f00536300533f005", + "0x36300504f00509202802836300502800702804e1c60100316a900f09204f", + "0x2a702800f00536300500f00513302801300536300504f00503102804f005", + "0x5a002836101801703004d00b3630050140052a502801400536300500f005", + "0x2802836300501800527502802836300501700527502802836300504d005", + "0x36300503000529f0280300053630050300052a302802836300536100501f", + "0x557d02801c00536300501b00557c02801b00536300502857a028360005", + "0x536300535e00557f02802836300535f00557e02835e35f00736300501c", + "0x1b02835d00b00736300500b00538d02802000536300501f0051c602801f", + "0x501b02802335c00736300535d020007031581028020005363005020005", + "0x535b00536c02835b02d007363005023028007582028023005363005023", + "0x280283630050840055840283590840073630050c00055830280c0005363", + "0x53570055860283570053630051a80052bd0281a8005363005359005585", + "0x28364005363005028032028356005363005032005334028032357007363", + "0x33005033028013005363005013005092028033364007363005364005356", + "0x35c00536300535c0050c7028360005363005360005319028033005363005", + "0x3c00c03136300735603309201300a03c02802d00536300502d00504f028", + "0xc00536300500c00509202802836300502800702821d2190400316aa036", + "0x22d35700758802822d00536300502858702822700536300500c005031028", + "0x364005363005364005033028227005363005227005092028231005363005", + "0x22700a03c02803600536300503600501b028231005363005231005088028", + "0x283630050280070282462420450316ab04704804603136300723136403c", + "0x360005149028249005363005046005031028046005363005046005092028", + "0x24a00501f02805905805b00905025825625325224f24c24b24a014363005", + "0x501f02802836300524c00530a02802836300524b005275028028363005", + "0x12602802836300525600501f02802836300525300501f028028363005252", + "0x2802836300500900524202802836300505000530a028028363005258005", + "0x2836300505900524202802836300505800523102802836300505b005231", + "0x50c002826c00536300505c00500a02805c24f00736300524f0050e9028", + "0x536300524900509202804700536300504700501b028048005363005048", + "0x2802836300502800702805e0056ac27727500736300726c00500f028249", + "0x36300527700501002806000536300524900503102802836300527500501c", + "0x50330282af00536300524f00500a02805d0053630050285a202805f005", + "0x536300505f00501b02806000536300506000509202805d00536300505d", + "0x3630050280070280670056ad0422bc00736300705d2af02d0315a302805f", + "0x50100280420053630050420055a4028306005363005060005031028028", + "0x600536300506800557c02806800536300502857a028069005363005042", + "0x7100557f02802836300506f00557e02807106f00736300500600557d028", + "0x7400536300507400501b0280740053630053470051c6028347005363005", + "0x2807700536300507700501b02807707500736300500b07435c031581028", + "0x3340280433450073630053450055860283453460073630050772bc007582", + "0x50790360072ee02807900536300505f0051c602807a005363005043005", + "0x2808134200736300534200535602834200536300502803202807f005363", + "0x507f00501b028081005363005081005033028306005363005306005092", + "0x280750053630050750050c702806900536300506900501b02807f005363", + "0x34007d00736300707f07a08104830600b00c02834600536300534600504f", + "0x2807d00536300507d00509202802836300502800702833d33e33f0316ae", + "0x533b34500758802833b00536300502858702833c00536300507d005031", + "0x33600536300508c0470072ee02808c0053630050690051c6028337005363", + "0x33700508802834200536300534200503302833c00536300533c005092028", + "0x33633734234033c00b00c02833600536300533600501b028337005363005", + "0x3350050920280283630050280070280883333340316af08a335007363007", + "0x28331005363005028030028332005363005335005031028335005363005", + "0x34600504f0280860053630053300050ec02833000536300533100a0072ca", + "0x750053630050750050c7028332005363005332005092028346005363005", + "0x33234600b0050860053630050860050f002808a00536300508a0050c0028", + "0x33400509202802836300500a00531c02802836300502800702808608a075", + "0x36f00536300508e00509202808e005363005334005031028334005363005", + "0x502804d02832c00536300508800522d02832d0053630053330050c0028", + "0x534500558902802836300500a00531c0280283630050280070280286b0", + "0x4700501f02802836300534200523102802836300506900501f028028363", + "0x2832b00536300533f00503102833f00536300533f005092028028363005", + "0x533d00522d02832d00536300533e0050c002836f00536300532b005092", + "0x2832900536300532c32a00702d02832a00536300502802302832c005363", + "0x536f00509202834600536300534600504f0283280053630053290052c6", + "0x2832d00536300532d0050c00280750053630050750050c702836f005363", + "0x2836300502800702832832d07536f34600b0053280053630053280050f0", + "0x36300505f00501f02802836300500a00531c02802836300503600501f028", + "0x506000503102802836300504700501f02802836300500b00501f028028", + "0x501b02808b005363005028263028326005363005028020028327005363", + "0x536300502802302832500536300508b32600735c02808b00536300508b", + "0x4f0283200053630053230052c602832300536300532532400702d028324", + "0x36300535c0050c7028327005363005327005092028067005363005067005", + "0xb0053200053630053200050f00280480053630050480050c002835c005", + "0x1f02802836300505e00501c02802836300502800702832004835c327067", + "0x2802836300500b00501f02802836300500a00531c028028363005036005", + "0x536300524900503102802836300524f00524202802836300504700501f", + "0x509500501b028095005363005028263028093005363005028020028085", + "0x2809800536300502802302831f00536300509509300735c028095005363", + "0x2d00504f02809600536300531e0052c602831e00536300531f09800702d", + "0x35c00536300535c0050c702808500536300508500509202802d005363005", + "0x8502d00b0050960053630050960050f00280480053630050480050c0028", + "0xa00531c02802836300503600501f02802836300502800702809604835c", + "0x509202802836300500b00501f02802836300536000531e028028363005", + "0x536300531d00509202831d005363005045005031028045005363005045", + "0x2804d02831900536300524600522d02831a0053630052420050c002831c", + "0xa00531c0280283630053640052310280283630050280070280286b1005", + "0x558902802836300500b00501f02802836300536000531e028028363005", + "0x318005363005040005031028040005363005040005092028028363005357", + "0x21d00522d02831a0053630052190050c002831c005363005318005092028", + "0x31600536300531931700702d028317005363005028023028319005363005", + "0x31c00509202802d00536300502d00504f0283150053630053160052c6028", + "0x31a00536300531a0050c002835c00536300535c0050c702831c005363005", + "0x36300502800702831531a35c31c02d00b0053150053630053150050f0028", + "0x501000509202802836300500b00501f02802836300500a00531c028028", + "0x2d028313005363005028023028314005363005010005031028010005363", + "0x502800504f0283110053630053120052c602831200536300504e313007", + "0x280070053630050070050c7028314005363005314005092028028005363", + "0x731402800b0053110053630053110050f00281c60053630051c60050c0", + "0x50285a60280100053630050283690280920053630050285a50283111c6", + "0x502836102802836300502824f0280140053630050285a702804e005363", + "0x50285a90280300053630050285a902804d0053630050285a8028028363", + "0x536300501801703004d00a5aa0280180053630050285a9028017005363", + "0x280286b23600053630073610055ac0283610053630053610055ab028361", + "0x73630050310055ad02801b00536300500a005031028028363005028007", + "0x285a902801f00536300535e0055ae02835e00536300502836e02835f01c", + "0x2835c0053630050285a902835d0053630050200055ae028020005363005", + "0x36300502d0055ae02802d0053630050285a902802300536300535c0055ae", + "0x536300535f0055b00280c000536300535b02335d01f00a5af02835b005", + "0x52e802801b00536300501b0050920280c00053630050c00055b102835f", + "0x280070283590056b30840053630070c035f0075b202801c00536300501c", + "0x55b50280283630050100055b40280283630050840055b3028028363005", + "0x5b70280283630050920055b602802836300500b00531c02802836300504e", + "0x1a800536300501b0050310280283630053600055b8028028363005014005", + "0x36300503200501b028032005363005028368028357005363005028020028", + "0x2d02836400536300502802302835600536300503235700735c028032005", + "0x502800504f02800c0053630050330052c6028033005363005356364007", + "0x280070053630050070052ef0280050053630050050050db028028005363", + "0x500c0050f00281a80053630051a800509202801c00536300501c0052e8", + "0x503102802836300502800702800c1a801c00700502804f00500c005363", + "0x400053630050360055ae0280360053630050285b902803c00536300501b", + "0x3630050285a902821d0053630052190055ae0282190053630050285a9028", + "0x55ae0282310053630050285a902822d0053630052270055ae028227005", + "0x480055b102804800536300504622d21d04000a5af028046005363005231", + "0x53630070483590075b202803c00536300503c005092028048005363005", + "0x5ba02824200536300503c0050310280283630050280070280450056b4047", + "0x2824a0053630050285bc0282490053630050285bb028246005363005028", + "0x524200509202824a00536300524a0055bf0282490053630052490055bd", + "0x6b524b01304f03136300724a2493600472460070050925c0028242005363", + "0x2825600536300524200503102802836300502800702825325224f24c00a", + "0x504f0920075c302802836300502800b02805025800736300524b0055c1", + "0x2560053630052560050920280130053630050130140075c402804f005363", + "0x503102802836300502800702805b0056b60090053630070500055c5028", + "0x53630070090055c6028058005363005058005092028058005363005256", + "0x9202826c00536300505800503102802836300502800702805c0056b7059", + "0x280070282770056b82750053630070590055c702826c00536300526c005", + "0x280600053630052750055c802805e00536300526c005031028028363005", + "0x6b900502804d02805d0053630050600055c902805f00536300505e005092", + "0x52af0050920282af00536300526c005031028028363005028007028028", + "0x280070280286b900502804d02805d0053630052770055c902805f005363", + "0x2805f0053630052bc0050920282bc005363005058005031028028363005", + "0x280283630050280070280286b900502804d02805d00536300505c0055c9", + "0x505b0055c902805f005363005042005092028042005363005256005031", + "0x3670281c600536300505d01c0075ca02802836300502836102805d005363", + "0x53630050285b90280283630050670055cb028306067007363005258005", + "0x3630050285a90280060053630050285a90280680053630050285a9028069", + "0x736300507100536702807100536300506f00606806900a5cc02806f005", + "0x55cd0283060053630053060055cd0280283630053470055cb028074347", + "0x51c604e0075cf0280750053630050743060075ce028074005363005074", + "0x283630050280070283460056ba0770053630070750052cd0281c6005363", + "0x36300505f00503102802836300500b00531c028028363005077005047028", + "0x502803202807a0053630050282490280430053630050285d0028345005", + "0x315d20283420053630050285d102807f005363005028366028079005363", + "0x50810055d302802800536300502800504f02808100536300507907a043", + "0x2834200536300534200503302807f00536300507f00501b028081005363", + "0x2834500536300534500509202834007d00736300534207f08102800a5d4", + "0x34500503102802836300502800702833e0056bb33f0053630073400055d5", + "0x2836300533b00504702833b33c00736300533f0055d602833d005363005", + "0x36300507d00504f02808c0053630050285d10283370053630050285d7028", + "0x3302833700536300533700501b02833c00536300533c0055d302807d005", + "0x9202833533600736300508c33733c07d00a5d402808c00536300508c005", + "0x280070283340056bc08a0053630073350055d502833d00536300533d005", + "0x33208800736300508a0055d602833300536300533d005031028028363005", + "0x53630050285d10283310053630050285d8028028363005332005047028", + "0x501b0280880053630050880055d302833600536300533600504f028330", + "0x33033108833600a5d4028330005363005330005033028331005363005331", + "0x536300708e0055d502833300536300533300509202808e086007363005", + "0x5d602832c00536300533300503102802836300502800702832d0056bd36f", + "0x536300502837002802836300532a00504702832a32b00736300536f005", + "0x32b0055d302808600536300508600504f0283280053630050285d9028329", + "0x32800536300532800503302832900536300532900501b02832b005363005", + "0x32c00536300532c00509202832632700736300532832932b08600a5d4028", + "0x50310280283630050280070283250056be08b0053630073260055d5028", + "0x283200053630050285da02832300536300502802002832400536300532c", + "0x8b0055d602808500536300532032300735c02832000536300532000501b", + "0x536300500f0100075db02802836300509300504702809300f007363005", + "0x55de0280283630050950055dd02831f09500736300500f0055dc02800f", + "0x9600501f02831d09631e0313630050980055df02809831f00736300531f", + "0x2831c31e00736300531e0055e002802836300531d005231028028363005", + "0x531900501b02831900536300531a00507402831a00536300531c0055e1", + "0x31700536300531e0055e202831800536300531908500735c028319005363", + "0x3170055e402832400536300532400509202832700536300532700504f028", + "0x531831732432700a36502831800536300531800522d028317005363005", + "0x6bf31300536300731400500602802836300502800b028314315316031363", + "0x31300506f028311005363005315005031028028363005028007028312005", + "0x31f00736300531f0055de02802836300530e00504702830e30f007363005", + "0x2310280283630050a90055e50280b030b0a903136300530c0055df02830c", + "0x3630050ac30f00735c0280ac00536300530b0051c60280283630050b0005", + "0x280283630053080055e50280b60b430803136300531f0055df02830a005", + "0x3630053050050740283050053630050b60051530280283630050b400501f", + "0x283020053630053110050920283030053630050b930a00735c0280b9005", + "0x280283630050280070280286c000502804d02830100536300530300522d", + "0x36300531200507702830000536300531500503102802836300531f0055e7", + "0x22d0283020053630053000050920280283630052ff0053460282fe2ff007", + "0x280bf0053630050280230280283630050283610283010053630052fe005", + "0x31600504f0282fc0053630052fd0052c60282fd0053630053010bf00702d", + "0x130053630050130052ef02804f00536300504f0050db028316005363005", + "0x2fc0050f00283020053630053020050920281c60053630051c60052e8028", + "0x5b40280283630050280070282fc3021c601304f31604f0052fc005363005", + "0x53630053250052c60282fb00536300532c005031028028363005010005", + "0x52ef02804f00536300504f0050db02832700536300532700504f028051", + "0x53630052fb0050920281c60053630051c60052e8028013005363005013", + "0x280070280512fb1c601304f32704f0050510053630050510050f00282fb", + "0x2c602838b0053630053330050310280283630050100055b4028028363005", + "0x36300504f0050db02808600536300508600504f02838c00536300532d005", + "0x920281c60053630051c60052e80280130053630050130052ef02804f005", + "0x1c601304f08604f00538c00536300538c0050f002838b00536300538b005", + "0x533d0050310280283630050100055b402802836300502800702838c38b", + "0x2833600536300533600504f0280dc0053630053340052c602838d005363", + "0x51c60052e80280130053630050130052ef02804f00536300504f0050db", + "0x50dc0053630050dc0050f002838d00536300538d0050920281c6005363", + "0x283630050100055b40280283630050280070280dc38d1c601304f33604f", + "0x7d00504f0280c700536300533e0052c602838f005363005345005031028", + "0x130053630050130052ef02804f00536300504f0050db02807d005363005", + "0xc70050f002838f00536300538f0050920281c60053630051c60052e8028", + "0x470280283630050280070280c738f1c601304f07d04f0050c7005363005", + "0xc600536300505f0050310280283630050100055b4028028363005346005", + "0xcb0050ec0280cb0053630050c900b0072ca0280c9005363005028030028", + "0x4f00536300504f0050db02802800536300502800504f0280cf005363005", + "0xc60050920281c60053630051c60052e80280130053630050130052ef028", + "0xcf0c61c601304f02804f0050cf0053630050cf0050f00280c6005363005", + "0x283630050100055b40280283630052520055e8028028363005028007028", + "0x3630050920055b602802836300500b00531c02802836300504e0055b5028", + "0x50280200282fa0053630052420050310280283630050140055b7028028", + "0x35c02830700536300530700501b0283070053630050285e9028390005363", + "0x53630050285bc0282f40053630050285bb028391005363005307390007", + "0x55bf0282f40053630052f40055bd02824f00536300524f0052ef0280d4", + "0x283920d52f30313630050d42f425324f01c00b5ea0280d40053630050d4", + "0x53630052fa00509202824c00536300524c0050db02802836300502800b", + "0x52ef0282f30053630052f30052e802839100536300539100522d0282fa", + "0x50280070282f00056c12f10053630073920055c50280d50053630050d5", + "0x5c60282ea0053630052ea0050920282ea0053630052fa005031028028363", + "0x52ea0050310280283630050280070282e70056c20da0053630072f1005", + "0x6c30d20053630070da0055c70282e50053630052e50050920282e5005363", + "0xd20055c80280db0053630052e50050310280283630050280070282e8005", + "0x2e10053630052ef0055c90282e20053630050db0050920282ef005363005", + "0x2e00053630052e50050310280283630050280070280286c400502804d028", + "0x502804d0282e10053630052e80055c90282e20053630052e0005092028", + "0xdf0050920280df0053630052ea0050310280283630050280070280286c4", + "0x70280286c400502804d0282e10053630052e70055c90282e2005363005", + "0x2e20053630052ee0050920282ee0053630052fa005031028028363005028", + "0x52e12f30075ca0280283630050283610282e10053630052f00055c9028", + "0x282eb0053630053912ec00702d0282ec0053630050280230280e1005363", + "0x524c0050db02802800536300502800504f0280e30053630052eb0052c6", + "0x280e10053630050e10052e80280d50053630050d50052ef02824c005363", + "0xd524c02804f0050e30053630050e30050f00282e20053630052e2005092", + "0x100055b40280283630050450055eb0280283630050280070280e32e20e1", + "0x55b602802836300500b00531c02802836300504e0055b5028028363005", + "0x310280283630053600055b80280283630050140055b7028028363005092", + "0x2d60053630050285ed0282de0053630050280200282ed00536300503c005", + "0x280230282d80053630052d62de00735c0282d60053630052d600501b028", + "0x53630052d20052c60282d20053630052d82d300702d0282d3005363005", + "0x52ef0280050053630050050050db02802800536300502800504f0280e9", + "0x53630052ed00509202801c00536300501c0052e8028007005363005007", + "0x280070280e92ed01c00700502804f0050e90053630050e90050f00282ed", + "0x531c02802836300504e0055b50280283630050100055b4028028363005", + "0x310280283630050140055b70280283630050920055b602802836300500b", + "0x2cd00536300502824b0282ce0053630050280200282d000536300500a005", + "0x280230282ca0053630052cd2ce00735c0282cd0053630052cd00501b028", + "0x53630050f00052c60280f00053630052ca0ec00702d0280ec005363005", + "0x52ef0280050053630050050050db02802800536300502800504f0282c9", + "0x53630052d00050920280310053630050310052e8028007005363005007", + "0x55ee0282c92d003100700502804f0052c90053630052c90050f00282d0", + "0x53630050310055ae02803100536300502836e028007005007363005028", + "0x50285a902804f00536300500b0055ae02800b0053630050285a902800a", + "0x5ae0280100053630050285a902800f0053630050920055ae028092005363", + "0x55ef02804e0053630051c600f04f00a00a5af0281c6005363005010005", + "0x53630050050052e802804e00536300504e0055b1028007005363005007", + "0x280283630050280070280140056c501300536300704e0070075f0028005", + "0x5f20280283630050280070280286c600502804d0280283630050130055f1", + "0x3000536300504d00516402804d005363005028030028028363005014005", + "0x170052950280050053630050050052e8028017005363005030005296028", + "0x3132802804f0310073630050310050dc028017005007005017005363005", + "0x2836300502800702801304e1c60316c701000f09203136300704f005028", + "0x50285f4028014005363005092005031028092005363005092005092028", + "0x320280170053630050285f502803000536300504d00533402804d005363", + "0x5363005018005033028014005363005014005092028018005363005028", + "0x533702801700536300501700501b028030005363005030005088028018", + "0x316c836036100736300701703001800f01400b00c028010005363005010", + "0x503102836100536300536100509202802836300502800702835f01c01b", + "0x36300501f00504002802001f00736300500b00503602835e005363005361", + "0x38d02835c0310073630050310050dc02835d005363005020005219028028", + "0x36035e00b27702835e00536300535e00509202802300a00736300500a005", + "0x283630050280070281a83590840316c90c035b02d03136300735d02335c", + "0x36300501000533d02802836300500700531c0280283630050c0005242028", + "0x502d00509202802836300500a00501f028028363005031005275028028", + "0x5da02803200536300502802002835700536300502d00503102802d005363", + "0x36300535603200735c02835600536300535600501b028356005363005028", + "0x735c02803300536300503300501b028033005363005028249028364005", + "0x536300503c00501b02803c0053630050285f602800c005363005033364", + "0x501b02804000536300502824602803600536300503c00c00735c02803c", + "0x536300502802302821900536300504003600735c028040005363005040", + "0x9202822d0053630052270052c602822700536300521921d00702d02821d", + "0x36300522d0050f002835b00536300535b0050c0028357005363005357005", + "0x536300508400509202802836300502800702822d35b35703100522d005", + "0x400280480460073630051a8005036028231005363005084005031028084", + "0x53630053590050c0028048005363005048005013028028363005046005", + "0x56ca0450470073630070480055f7028231005363005231005092028359", + "0x50450055a4028246005363005231005031028028363005028007028242", + "0x2824a0053630052490051c6028249005363005045005010028045005363", + "0x524b24a00732602824a00536300524a00501b02824b0053630050285f8", + "0x2804700536300504700501302824c00536300524c00501b02824c005363", + "0x2800702824f0056cb02836300724c005342028246005363005246005092", + "0x28252005363005252005092028252005363005246005031028028363005", + "0x501c0280283630050280070282580056cc2562530073630070470055f7", + "0x2560053630052560055a4028050005363005252005031028028363005253", + "0x50285fa02805b0053630050090051c6028009005363005256005010028", + "0x536300505805900732602805900a00736300500a00538d028058005363", + "0x501b02805000536300505000509202805c00536300505c00501b02805c", + "0x36300502800702826c0056cd02836300705c00534202805b00536300505b", + "0x50285fb02827500536300505000503102802836300500a00501f028028", + "0x5e00536300505e00501b02805e00536300527705b007326028277005363", + "0x70280600056ce02836300705e005342028275005363005275005092028", + "0x5d00536300505f00509202805f005363005275005031028028363005028", + "0x280283630050600053400280283630050280070280286cf00502804d028", + "0x2836300503100527502802836300501000533d02802836300500700531c", + "0x3630050285fc0282bc0053630050280200282af005363005275005031028", + "0x280670053630050422bc00735c02804200536300504200501b028042005", + "0x50690052c602806900536300506730600702d028306005363005028023", + "0x283590053630053590050c00282af0053630052af005092028068005363", + "0x3400280283630050280070280683592af0310050680053630050680050f0", + "0x6f0053630050282c302800600536300505000503102802836300526c005", + "0x1b02834700536300506f07100732602807100a00736300500a00538d028", + "0x363007347005342028006005363005006005092028347005363005347005", + "0x503102802836300500a00501f0280283630050280070280740056d0028", + "0x536300507705b0073260280770053630050282c9028075005363005006", + "0x534202807500536300507500509202834600536300534600501b028346", + "0x53630050750050310280283630050280070283450056d1028363007346", + "0x3630050280070280286d200502804d02807a005363005043005092028043", + "0x501000533d02802836300500700531c028028363005345005340028028", + "0x28020028079005363005075005031028028363005031005275028028363", + "0x2834200536300534200501b0283420053630050285fc02807f005363005", + "0x8107d00702d02807d00536300502802302808100536300534207f00735c", + "0x7900536300507900509202833f0053630053400052c6028340005363005", + "0x35907903100533f00536300533f0050f00283590053630053590050c0028", + "0x36300500600503102802836300507400534002802836300502800702833f", + "0x1b02833c00536300533d00a00732602833d0053630050285fd02833e005", + "0x36300733c00534202833e00536300533e00509202833c00536300533c005", + "0x33002833700536300533e00503102802836300502800702833b0056d3028", + "0x36300533600501b02833600536300508c05b00732602808c005363005028", + "0x3350056d4028363007336005342028337005363005337005092028336005", + "0x36300508a00509202808a005363005337005031028028363005028007028", + "0x33403136300703135905d03132802805d00536300507a00530702807a005", + "0x53630053340050920280283630050280070283303313320316d5088333", + "0x8e0052c102808e00536300502808a028086005363005334005031028334", + "0x2836300532d0050f802832c32d00736300536f0052be02836f005363005", + "0x32a00533402832a00536300532b0052bd02832b00536300532c0050fa028", + "0x28086005363005086005092028328005363005028032028329005363005", + "0x5088005337028329005363005329005088028328005363005328005033", + "0x3243250316d608b32632703136300732932833308600a03c028088005363", + "0x5327005031028327005363005327005092028028363005028007028323", + "0x283260053630053260050c002808b00536300508b00501b028320005363", + "0x280070280850056d702836300708b005342028320005363005320005092", + "0x28095005363005010005327028093005363005320005031028028363005", + "0x9800501b02809800536300531f09500732602831f005363005088005327", + "0x6d8028363007098005342028093005363005093005092028098005363005", + "0x50285f402809600536300509300503102802836300502800702831e005", + "0x31931a00736300531c0052be02831c00536300531d0052c102831d005363", + "0x53180052bd0283180053630053190050fa02802836300531a0050f8028", + "0x92028315005363005028032028316005363005317005334028317005363", + "0x363005316005088028315005363005315005033028096005363005096005", + "0x30e30f3110316d931231331403136300731631532609600a03c028316005", + "0x363005314005031028314005363005314005092028028363005028007028", + "0x732602831200536300531200501b0280a90053630050285f502830c005", + "0x3630053130050c002830b00536300530b00501b02830b0053630050a9312", + "0xb00056da02836300730b00534202830c00536300530c005092028313005", + "0x53630050280300280ac00536300530c005031028028363005028007028", + "0x920280b40053630053080050ec02830800536300530a0070072ca02830a", + "0x3630050b40050f00283130053630053130050c00280ac0053630050ac005", + "0x283630050b00053400280283630050280070280b43130ac0310050b4005", + "0x3630050280200280b600536300530c00503102802836300500700531c028", + "0x735c0280b90053630050b900501b0280b90053630050285ff028305005", + "0x36300530330200702d0283020053630050280230283030053630050b9305", + "0xc00280b60053630050b60050920283000053630053010052c6028301005", + "0x283003130b60310053000053630053000050f0028313005363005313005", + "0x31100536300531100509202802836300500700531c028028363005028007", + "0x30e2fe00702d0282fe0053630050280230282ff005363005311005031028", + "0x2ff0053630052ff0050920282fd0053630050bf0052c60280bf005363005", + "0x30f2ff0310052fd0053630052fd0050f002830f00536300530f0050c0028", + "0x36300500700531c02802836300531e0053400280283630050280070282fd", + "0x50286000282fb0053630050280200282fc005363005093005031028028", + "0x38b0053630050512fb00735c02805100536300505100501b028051005363", + "0x38d0052c602838d00536300538b38c00702d02838c005363005028023028", + "0x3260053630053260050c00282fc0053630052fc0050920280dc005363005", + "0x280283630050280070280dc3262fc0310050dc0053630050dc0050f0028", + "0x2836300501000533d02802836300500700531c028028363005085005340", + "0x36300502802002838f00536300532000503102802836300508800533d028", + "0x735c0280c60053630050c600501b0280c60053630050286010280c7005", + "0x3630050c90cb00702d0280cb0053630050280230280c90053630050c60c7", + "0xc002838f00536300538f0050920282fa0053630050cf0052c60280cf005", + "0x282fa32638f0310052fa0053630052fa0050f0028326005363005326005", + "0x2802836300508800533d02802836300500700531c028028363005028007", + "0x36300532500503102832500536300532500509202802836300501000533d", + "0x2c602839100536300532330700702d028307005363005028023028390005", + "0x3630053240050c00283900053630053900050920282f4005363005391005", + "0x3630050280070282f43243900310052f40053630052f40050f0028324005", + "0x533200509202802836300501000533d02802836300500700531c028028", + "0x2d0282f30053630050280230280d4005363005332005031028332005363", + "0x50d40050920283920053630050d50052c60280d50053630053302f3007", + "0x53920053630053920050f00283310053630053310050c00280d4005363", + "0x531c0280283630053350053400280283630050280070283923310d4031", + "0x3102802836300503100527502802836300501000533d028028363005007", + "0x2ea0053630050286030282f00053630050280200282f1005363005337005", + "0x280230280da0053630052ea2f000735c0282ea0053630052ea00501b028", + "0x53630052e50052c60282e50053630050da2e700702d0282e7005363005", + "0x50f00283590053630053590050c00282f10053630052f10050920280d2", + "0x33b0053400280283630050280070280d23592f10310050d20053630050d2", + "0x527502802836300501000533d02802836300500700531c028028363005", + "0x282e800536300533e00503102802836300505b00501f028028363005031", + "0x53630052ef00501b0282ef0053630050286040280db005363005028020", + "0x702d0282e10053630050280230282e20053630052ef0db00735c0282ef", + "0x3630052e80050920280df0053630052e00052c60282e00053630052e22e1", + "0x310050df0053630050df0050f00283590053630053590050c00282e8005", + "0x700531c02802836300525800501c0280283630050280070280df3592e8", + "0x501f02802836300503100527502802836300501000533d028028363005", + "0x280e10053630050280200282ee00536300525200503102802836300500a", + "0x52ec0e100735c0282ec0053630052ec00501b0282ec00536300502824b", + "0x282ed0053630052eb0e300702d0280e30053630050280230282eb005363", + "0x53590050c00282ee0053630052ee0050920282de0053630052ed0052c6", + "0x50280070282de3592ee0310052de0053630052de0050f0028359005363", + "0x1000533d02802836300500700531c02802836300524f005340028028363", + "0x501c02802836300500a00501f028028363005031005275028028363005", + "0x282d80053630050280200282d6005363005246005031028028363005047", + "0x52d32d800735c0282d30053630052d300501b0282d30053630050285fc", + "0x282d00053630052d20e900702d0280e90053630050280230282d2005363", + "0x53590050c00282d60053630052d60050920282ce0053630052d00052c6", + "0x50280070282ce3592d60310052ce0053630052ce0050f0028359005363", + "0x1000533d02802836300500700531c02802836300524200501c028028363", + "0x503102802836300500a00501f028028363005031005275028028363005", + "0x280ec00536300502824b0282ca0053630050280200282cd005363005231", + "0x50280230280f00053630050ec2ca00735c0280ec0053630050ec00501b", + "0x2c50053630052c60052c60282c60053630050f02c900702d0282c9005363", + "0x2c50050f00283590053630053590050c00282cd0053630052cd005092028", + "0x500700531c0280283630050280070282c53592cd0310052c5005363005", + "0xa00501f02802836300503100527502802836300501000533d028028363", + "0x3102801b00536300501b00509202802836300500b005040028028363005", + "0x36300535f2c300702d0282c30053630050280230282c400536300501b005", + "0xc00282c40053630052c40050920282c10053630052c20052c60282c2005", + "0x282c101c2c40310052c10053630052c10050f002801c00536300501c005", + "0x2802836300500b00504002802836300500700531c028028363005028007", + "0x53630051c600509202802836300500a00501f028028363005031005275", + "0xf800702d0280f80053630050280230282be0053630051c60050310281c6", + "0x53630052be0050920282bd0053630050fa0052c60280fa005363005013", + "0x2be0310052bd0053630052bd0050f002804e00536300504e0050c00282be", + "0x6db00a03100736300700700500f02800700536300500500500a0282bd04e", + "0x3100501302804f00536300500a00525602802836300502800702800b005", + "0x70280286dc00502804d02800f00536300504f005258028092005363005", + "0x281c6005363005010005050028010005363005028030028028363005028", + "0x509200507102800f0053630051c600525802809200536300500b005013", + "0x1400536300700f00500902801300536300504e00521902804e092007363", + "0x51c602803000536300501400501002802836300502800702804d0056dd", + "0x3630070170280072ae02801700536300501700501b028017005363005030", + "0x280283630050130052420280283630050280070283600056de361018007", + "0x536100535602801c09200736300509200507102801b005363005028032", + "0x735f01b01c01800a60502801b00536300501b00503302835f361007363", + "0x73630050920050710280283630050280070280200056df01f35e007363", + "0x2802336100736300536100535602835c00536300535d00534702835d092", + "0x35c35e03156e02801f00536300501f00501302835c00536300535c005033", + "0x2d00a6050280283630050280070280840c00076e035b02d007363007023", + "0x52190280283630050280070283570056e11a835900736300735b361092", + "0x53630051a800521902835600536300503200560602803200536300501f", + "0x4f02800c005363005033005608028033005363005356364007607028364", + "0x702800c35900700500c00536300500c005609028359005363005359005", + "0x26302803c00536300502802002802836300501f00501c028028363005028", + "0x36300503603c00735c02803600536300503600501b028036005363005028", + "0x60a02821d00536300504021900702d028219005363005028023028040005", + "0x36300522700560902835700536300535700504f02822700536300521d005", + "0x28028363005084005231028028363005028007028227357007005227005", + "0x2836300536100523102802836300509200501c02802836300501f00501c", + "0x36300523100501b02823100536300502860b02822d005363005028020028", + "0x2d02804800536300502802302804600536300523122d00735c028231005", + "0x50c000504f02804500536300504700560a028047005363005046048007", + "0x3630050280070280450c00070050450053630050450056090280c0005363", + "0x36300502802002802836300509200501c028028363005361005231028028", + "0x735c02824600536300524600501b028246005363005028263028242005", + "0x36300524924a00702d02824a005363005028023028249005363005246242", + "0x60902802000536300502000504f02824c00536300524b00560a02824b005", + "0x9200501c02802836300502800702824c02000700524c00536300524c005", + "0x60702825200536300524f00560c02824f005363005028030028028363005", + "0x536000504f028256005363005253005608028253005363005252013007", + "0x363005028007028256360007005256005363005256005609028360005363", + "0x36300502803002802836300509200501c02802836300504d005047028028", + "0x2800900536300505001300760702805000536300525800560c028258005", + "0x505b00560902802800536300502800504f02805b005363005009005608", + "0x36300700502800700502802836300502836102805b02800700505b005363", + "0x536300504f00503102802836300502800702800f0920076e204f00b007", + "0x9202800b00536300500b00504f0281c600a00736300500a00538d028010", + "0x502800702804e0056e30283630071c6005342028010005363005010005", + "0x560d02801300536300501000503102802836300500a00501f028028363", + "0x36300504d00560f02804d00536300501400700760e028014005363005031", + "0x61002801300536300501300509202800b00536300500b00504f028030005", + "0x534002802836300502800702803001300b031005030005363005030005", + "0xb00536300500b00504f02801700536300501000503102802836300504e", + "0x2836036101803136300500700b00761102800700536300500700505b028", + "0x702801c0056e401b005363007360005612028017005363005017005092", + "0x536300501b03100761302835f005363005017005031028028363005028", + "0x504f02802000536300501f00a00732602801f00536300502824a02835e", + "0x536300536100505b02835f00536300535f005092028018005363005018", + "0xb11602802000536300502000501b02835e00536300535e005114028361", + "0x502800702802335c35d03100502335c35d03136300502035e36135f018", + "0x1700503102802836300503100511c02802836300500a00501f028028363", + "0x536300535b36100760e02835b00536300501c00561402802d005363005", + "0x509202801800536300501800504f0280840053630050c000560f0280c0", + "0x702808402d01803100508400536300508400561002802d00536300502d", + "0x24202802836300503100511c02802836300500a00501f028028363005028", + "0x1a800536300502802002835900536300500f005031028028363005007005", + "0x3571a800735c02835700536300535700501b028357005363005028046028", + "0x36400536300503235600702d028356005363005028023028032005363005", + "0x35900509202809200536300509200504f028033005363005364005372028", + "0x28361028033359092031005033005363005033005610028359005363005", + "0x2800702809204f0076e500b00a007363007005028007005028028363005", + "0x2801000536300500700500a02800f00536300500b005031028028363005", + "0x536300500f00509202800a00536300500a00504f02802836300502800b", + "0x280283630050280070280130056e604e1c600736300701000500f02800f", + "0x501400509202804d00536300504e00525602801400536300500f005031", + "0x2801800536300504d0052580280170053630051c6005013028030005363", + "0x2836100536300500f0050310280283630050280070280286e700502804d", + "0x36300536100509202801b005363005360005050028360005363005028030", + "0x21902801800536300501b005258028017005363005013005013028030005", + "0x2800702835e0056e835f00536300701800500902801c005363005017005", + "0x2802000536300535f00501002801f005363005030005031028028363005", + "0x502000501b02801f00536300501f00509202835d00536300503100500a", + "0x36300502800702802d0056e902335c00736300735d00500f028020005363", + "0x52190280c000536300502300501002835b00536300501f005031028028", + "0x53630050c00051c60283590053630050200051c602808400536300535c", + "0x1b0283570053630051a83590073260281a80053630051a800501b0281a8", + "0x36300508400505b02835b00536300535b005092028357005363005357005", + "0x3610280283630050280070280320056ea028363007357005342028084005", + "0xa00536300500a00504f02835600536300535b005031028028363005028", + "0x8400505b02801c00536300501c00505b028356005363005356005092028", + "0x36403100500c03336403136300508401c35600a00a150028084005363005", + "0x36300503200534002802836300502836102802836300502800702800c033", + "0x3600533f02803600536300502803002803c00536300535b005031028028", + "0x36300521900561602821900536300504008401c031615028040005363005", + "0x61702803c00536300503c00509202800a00536300500a00504f02821d005", + "0x2836102802836300502800702821d03c00a03100521d00536300521d005", + "0x524202802836300502000501f02802836300502d00501c028028363005", + "0x2822d00536300502802002822700536300501f00503102802836300501c", + "0x523122d00735c02823100536300523100501b02823100536300502824b", + "0x2804700536300504604800702d028048005363005028023028046005363", + "0x522700509202800a00536300500a00504f028045005363005047005618", + "0x502800702804522700a031005045005363005045005617028227005363", + "0x503000503102802836300535e005047028028363005028361028028363", + "0x615028249005363005246005081028246005363005028030028242005363", + "0xa00504f02824b00536300524a00561602824a00536300524903101c031", + "0x24b00536300524b00561702824200536300524200509202800a005363005", + "0x24202802836300503100524202802836300502800702824b24200a031005", + "0x24f00536300502802002824c005363005092005031028028363005007005", + "0x25224f00735c02825200536300525200501b028252005363005028046028", + "0x25800536300525325600702d028256005363005028023028253005363005", + "0x24c00509202804f00536300504f00504f028050005363005258005618028", + "0x2836102805024c04f03100505000536300505000561702824c005363005", + "0x2800702809204f0076eb00b00a007363007005028007005028028363005", + "0x2801000536300500700515902800f00536300500b005031028028363005", + "0x536300500f00509202800a00536300500a00504f02802836300502800b", + "0x280283630050280070280130056ec04e1c600736300701000561902800f", + "0x501400509202804d00536300504e00561a02801400536300500f005031", + "0x2801800536300504d00561b0280170053630051c6005373028030005363", + "0x2836100536300500f0050310280283630050280070280286ed00502804d", + "0x36300536100509202801b00536300536000561c028360005363005028030", + "0x11b02801800536300501b00561b028017005363005013005373028030005", + "0x2800702835e0056ee35f00536300701800561d02801c005363005017005", + "0x2802000536300535f00561e02801f005363005030005031028028363005", + "0x502000562002801f00536300501f00509202835d005363005031005159", + "0x36300502800702802d0056ef02335c00736300735d005619028020005363", + "0x511b0280c000536300502300561e02835b00536300501f005031028028", + "0x36300535900562202835902000736300502000562102808400536300535c", + "0x1c602802836300503200530a02802836300535700508e0280323571a8031", + "0x3630050c00056210280c00053630050c00056200283560053630051a8005", + "0x2836300500c00508e02803c00c0330313630053640056220283640c0007", + "0x363560073260280360053630050330051c602802836300503c00530a028", + "0x35b00536300535b00509202804000536300504000501b028040005363005", + "0x70282190056f0028363007040005342028084005363005084005157028", + "0x2000736300502000562102821d00536300535b005031028028363005028", + "0x30a02802836300522d00501f02804623122d031363005227005622028227", + "0x73630050c00056210280480053630052310050fc028028363005046005", + "0x2802836300504500501f0282462420450313630050470056220280470c0", + "0x36300521d0050920282490053630052420050fc02802836300524600530a", + "0x6230280283630050280070280286f10283630072490480070fe02821d005", + "0x24a00536300521d0050310280283630050c0005623028028363005020005", + "0x283630050280070280286f200502804d02824b00536300524a005092028", + "0x1f02825325224f03136300502000562202824c00536300521d005031028", + "0x2560053630052530052f102802836300525200508e02802836300524f005", + "0x508e02802836300525800501f0280090502580313630050c0005622028", + "0x24c00536300524c00509202805b0053630050090052f1028028363005050", + "0x24c0050310280283630050280070280286f302836300705b25600714b028", + "0x70280286f400502804d028059005363005058005092028058005363005", + "0x4f02805c00536300524c005031028028363005028361028028363005028", + "0x36300501c00515702805c00536300505c00509202800a00536300500a005", + "0x3136300508401c05c00a00a15602808400536300508400515702801c005", + "0x36300521900534002802836300502800702827727526c03100527727526c", + "0x535b0050310280283630050200056230280283630050c0005623028028", + "0x2805900536300524b00530702824b00536300505e00509202805e005363", + "0x5f00536300506000533f028060005363005028030028028363005028361", + "0x4f0282af00536300505d00562602805d00536300505f08401c031624028", + "0x3630052af00562702805900536300505900509202800a00536300500a005", + "0x280283630050283610280283630050280070282af05900a0310052af005", + "0x2836300501c00512602802836300502000562302802836300502d005628", + "0x36300502824b0280420053630050280200282bc00536300501f005031028", + "0x2830600536300506704200735c02806700536300506700501b028067005", + "0x506800562a02806800536300530606900702d028069005363005028023", + "0x282bc0053630052bc00509202800a00536300500a00504f028006005363", + "0x3610280283630050280070280062bc00a031005006005363005006005627", + "0x2806f00536300503000503102802836300535e005047028028363005028", + "0x34703101c031624028347005363005071005081028071005363005028030", + "0xa00536300500a00504f028075005363005074005626028074005363005", + "0x6f00a03100507500536300507500562702806f00536300506f005092028", + "0x363005031005126028028363005007005126028028363005028007028075", + "0x5028046028346005363005028020028077005363005092005031028028", + "0x4300536300534534600735c02834500536300534500501b028345005363", + "0x7900562a02807900536300504307a00702d02807a005363005028023028", + "0x7700536300507700509202804f00536300504f00504f02807f005363005", + "0x2802836300502836102807f07704f03100507f00536300507f005627028", + "0x2802836300502800702809204f0076f500b00a007363007005028007005", + "0x36300502800b02801000536300500700562b02800f00536300500b005031", + "0x562c02800f00536300500f00509202800a00536300500a00504f028028", + "0x500f0050310280283630050280070280130056f604e1c6007363007010", + "0x2803000536300501400509202804d00536300504e00562e028014005363", + "0x6f700502804d02801800536300504d0056300280170053630051c600562f", + "0x36300502803002836100536300500f005031028028363005028007028028", + "0x62f02803000536300536100509202801b005363005360005631028360005", + "0x36300501700518902801800536300501b005630028017005363005013005", + "0x2802836300502800702835e0056f835f00536300701800563302801c005", + "0x536300535f00563402801f005363005030005031028028363005028361", + "0x518c02800a00536300500a00504f02835d005363005020005635028020", + "0x535d03100a03163602835d00536300535d005182028031005363005031", + "0x2d00536300702300527102801f00536300501f00509202802335c007363", + "0x518d0280c000536300501f00503102802836300502800702835b0056f9", + "0x536300535c00504f02802836300535900504702835908400736300502d", + "0x518c02801c00536300501c00518a0280c00053630050c000509202835c", + "0x310050323571a803136300508401c0c035c00a276028084005363005084", + "0x1f00503102802836300501c0051940280283630050280070280323571a8", + "0x35c00536300535c00504f02836400536300535b005637028356005363005", + "0x35635c031005364005363005364005638028356005363005356005092028", + "0x2836300535e005047028028363005028361028028363005028007028364", + "0x3101c03163902800c005363005028030028033005363005030005031028", + "0x536300500a00504f02803600536300503c00563a02803c00536300500c", + "0xa03100503600536300503600563802803300536300503300509202800a", + "0x503100527e028028363005007005194028028363005028007028036033", + "0x28046028219005363005028020028040005363005092005031028028363", + "0x536300521d21900735c02821d00536300521d00501b02821d005363005", + "0x563702823100536300522722d00702d02822d005363005028023028227", + "0x536300504000509202804f00536300504f00504f028046005363005231", + "0x2836300502836102804604004f031005046005363005046005638028040", + "0x2863b02809200536300504f00537702804f00b007363005007005272028", + "0xf00536300500f00563c02809200536300509200503302800f005363005", + "0x280283630051c600523102804e1c601003136300500f09202803163d028", + "0x36300501000504f02801300a00736300500a00535602802836300502800b", + "0x2310280283630050280070280140056fa02836300701300563e028010005", + "0x4d00536300500500503102802836300503100508e02802836300500a005", + "0x504d00509202801700536300501000504f0280300053630050280fd028", + "0x280070280286fb00502804d02836100536300503000532c028018005363", + "0x5a202836000536300500500503102802836300501400563f028028363005", + "0x36300536000509202801c00a00736300500a00535602801b005363005028", + "0x310280283630050280070280286fc02836300701b01c00714e028360005", + "0x736300500a00535602835e0053630050285d902835f005363005360005", + "0x286fd02836300735e01f00714e02835f00536300535f00509202801f00a", + "0x536300502856d02802000536300535f005031028028363005028007028", + "0x14e02802000536300502000509202835c00a00736300500a00535602835d", + "0x3630050200050310280283630050280070280286fe02836300735d35c007", + "0x9202835b00a00736300500a00535602802d005363005028640028023005", + "0x50280070280286ff02836300702d35b00714e028023005363005023005", + "0x53560280840053630050283780280c0005363005023005031028028363", + "0x708435900714e0280c00053630050c000509202835900a00736300500a", + "0x6410281a80053630050c0005031028028363005028007028028700028363", + "0x3630051a800509202803200a00736300500a005356028357005363005028", + "0x3102802836300502800702802870102836300735703200714e0281a8005", + "0x53630053560050920283640053630050286420283560053630051a8005", + "0x2836102802836300502800702802870202836300736400a00714e028356", + "0x523102802836300500b00527e02802836300503100508e028028363005", + "0x2800c00536300502802002803300536300535600503102802836300504e", + "0x503c00c00735c02803c00536300503c00501b02803c005363005028703", + "0x2821900536300503604000702d028040005363005028023028036005363", + "0x503300509202801000536300501000504f02821d005363005219005704", + "0x502800702821d03301003100521d00536300521d005705028033005363", + "0x509202822d005363005028706028227005363005356005031028028363", + "0x2802870700502804d02804600536300522d00532c028231005363005227", + "0x480053630051a800503102802836300500a005231028028363005028007", + "0x504700532c028231005363005048005092028047005363005028708028", + "0x282420053630050460050fc028045005363005231005307028046005363", + "0x3102802836300500a00523102802836300502800702802870900502804d", + "0x536300524600509202824900536300502870a0282460053630050c0005", + "0x50fc02824a00536300504500530702824200536300524900532c028045", + "0x523102802836300502800702802870b00502804d02824b005363005242", + "0x2824f00536300502870c02824c00536300502300503102802836300500a", + "0x524a00530702824b00536300524f00532c02824a00536300524c005092", + "0x2800702802870d00502804d02825300536300524b0050fc028252005363", + "0x70e02825600536300502000503102802836300500a005231028028363005", + "0x536300525800532c028252005363005256005092028258005363005028", + "0x2804d0280090053630052530050fc028050005363005252005307028253", + "0x35f00503102802836300500a00523102802836300502800702802870f005", + "0x2805000536300505b00509202805800536300502871002805b005363005", + "0x50090050fc02805900536300505000530702800900536300505800532c", + "0x500a00523102802836300502800702802871100502804d02805c005363", + "0x509202827500536300502871202826c005363005360005031028028363", + "0x736300505c0052ba02805c00536300527500532c02805900536300526c", + "0x36102802836300502800702805e00571402836300727700571302827705c", + "0x8e02802836300504e00523102802836300500b00527e028028363005028", + "0x6000536300505900503102802836300503100508e02802836300505c005", + "0x36300505d00501b02805d00536300502824b02805f005363005028020028", + "0x2d0282bc0053630050280230282af00536300505d05f00735c02805d005", + "0x501000504f0280670053630050420057040280420053630052af2bc007", + "0x5067005363005067005705028060005363005060005092028010005363", + "0x715028306005363005059005031028028363005028007028067060010031", + "0x509202802836300506800508e02800606806903136300505e031010031", + "0x7434700771607106f00736300700605c0690310fb028306005363005306", + "0x36300506f00504f028075005363005306005031028028363005028007028", + "0x71702836100536300507100532c028018005363005075005092028017005", + "0x707734600714e02834604e00736300504e005356028077005363005028", + "0x18005031028028363005028361028028363005028007028028718028363", + "0x7a00536300502871702804300536300536100b00726b028345005363005", + "0x4300518c02834500536300534500509202807a00536300507a005033028", + "0x2808134200771907f07900736300704e07a01703156e028043005363005", + "0x536300507900504f02807d005363005345005031028028363005028007", + "0x503302804300536300504300518c02807d00536300507d005092028079", + "0x3100533e33f34003136300507f04307d07900a71a02807f00536300507f", + "0x4300527e02802836300508100523102802836300502800702833e33f340", + "0x60b02833c00536300502802002833d005363005345005031028028363005", + "0x36300533b33c00735c02833b00536300533b00501b02833b005363005028", + "0x70402833600536300533708c00702d02808c005363005028023028337005", + "0x36300533d00509202834200536300534200504f028335005363005336005", + "0x36300502800702833533d34203100533500536300533500570502833d005", + "0x36300501800503102802836300504e005231028028363005028361028028", + "0x509202833400536300533400532c02833400536300502871b02808a005", + "0x33133200771c0883330073630073613340170310fb02808a00536300508a", + "0x508800b00726b02833000536300508a005031028028363005028007028", + "0x2836f00536300508e08600771d02808e005363005028030028086005363", + "0x533000509202833300536300533300504f02832d00536300536f00571e", + "0x502800702832d33033303100532d00536300532d005705028330005363", + "0x8a00503102802836300500b00527e02802836300533100508e028028363", + "0x1b02832a0053630050282b902832b00536300502802002832c005363005", + "0x36300502802302832900536300532a32b00735c02832a00536300532a005", + "0x2832600536300532700570402832700536300532932800702d028328005", + "0x532600570502832c00536300532c00509202833200536300533200504f", + "0x2836300502836102802836300502800702832632c332031005326005363", + "0x36300504e00523102802836300500b00527e02802836300507400508e028", + "0x50282b902832500536300502802002808b005363005306005031028028", + "0x32300536300532432500735c02832400536300532400501b028324005363", + "0x8500570402808500536300532332000702d028320005363005028023028", + "0x8b00536300508b00509202834700536300534700504f028093005363005", + "0x736300500500525502809308b347031005093005363005093005705028", + "0x2809203100736300503100535602804f00536300500b00571f02800b00a", + "0x2800702800f00572002836300709200563e02804f00536300504f005033", + "0x5033028010005363005028721028028363005007005231028028363005", + "0x36300502800504f0281c600536300501000a00725f028010005363005010", + "0x502800702802872200502804d0280130053630051c600525c02804e005", + "0x310053560280140053630050285a202802836300500f00563f028028363", + "0x36300502800702802872302836300701404d00714e02804d031007363005", + "0x714e0280170310073630050310053560280300053630050285d9028028", + "0x18005363005028725028028363005028007028028724028363007030017", + "0x36300501800563c028360005363005028727028361005363005028726028", + "0x4d02835f00536300536000503302801c00536300536100503302801b005", + "0x2872a02835e005363005028729028028363005028007028028728005028", + "0x2801b00536300535e00563c02802000536300502872b02801f005363005", + "0x501b00572c02835f00536300502000503302801c00536300501f005033", + "0x2802300536300535f00515302835c00536300501c00515302835d005363", + "0x72f02802d00536300502872e02802836300502800702802872d00502804d", + "0x35d00536300502d00563c0280c000536300502873002835b005363005028", + "0x2803163d0280230053630050c000503302835c00536300535b005033028", + "0x35c1a80077310280283630053590052310281a835908403136300535d007", + "0x736300735708400773202835700536300535700532c028357005363005", + "0x7363007023356032031734028028363005028007028364005733356032", + "0x536300500c00a00725f02802836300502800702803603c00773500c033", + "0x525502801300536300504000525c02804e00536300503300504f028040", + "0x53630050285a202822700536300521d00571f02821d219007363005013", + "0x3173402822d00536300522d00503302822700536300522700503302822d", + "0x37c02802836300502800702804704800773604623100736300722d22704e", + "0x504504623103163d02804500536300504500563c028045005363005028", + "0x24a005363005249005074028028363005246005231028249246242031363", + "0x24a24b00732602824b00536300524b00501b02824b005363005028737028", + "0x24c00536300524c00501b02821900536300521900525c02824c005363005", + "0x4f00773102825200536300502873902824f00536300524c219007738028", + "0x36300725324200773202825300536300525300532c028253005363005252", + "0x2800900536300502873b02802836300502800702805000573a258256007", + "0x25600773202805b00536300505b00532c02805b005363005009031007731", + "0x25805803173402802836300502800702805c00573c05905800736300705b", + "0x24f00725f02802836300502800702805e27700773d27526c007363007059", + "0x536300505f06000773e02805f005363005028030028060005363005275", + "0x537d02826c00536300526c00504f0282af00536300505d00573f02805d", + "0x505e0052310280283630050280070282af26c0070052af0053630052af", + "0x50287400282bc00536300502802002802836300524f005251028028363", + "0x670053630050422bc00735c02804200536300504200501b028042005363", + "0x6900574102806900536300506730600702d028306005363005028023028", + "0x6800536300506800537d02827700536300527700504f028068005363005", + "0x523102802836300524f005251028028363005028007028068277007005", + "0x1b02806f005363005028742028006005363005028020028028363005258", + "0x36300502802302807100536300506f00600735c02806f00536300506f005", + "0x2807500536300507400574102807400536300507134700702d028347005", + "0x2807505c00700507500536300507500537d02805c00536300505c00504f", + "0x2802836300503100523102802836300524f005251028028363005028007", + "0x536300534600501b028346005363005028742028077005363005028020", + "0x702d02804300536300502802302834500536300534607700735c028346", + "0x36300505000504f02807900536300507a00574102807a005363005345043", + "0x2836300502800702807905000700507900536300507900537d028050005", + "0x36300503100523102802836300504f005231028028363005047005231028", + "0x36300502874002807f005363005028020028028363005219005251028028", + "0x2808100536300534207f00735c02834200536300534200501b028342005", + "0x534000574102834000536300508107d00702d02807d005363005028023", + "0x533f00536300533f00537d02804800536300504800504f02833f005363", + "0x4f00523102802836300503600523102802836300502800702833f048007", + "0x2802002802836300500a005251028028363005031005231028028363005", + "0x2833d00536300533d00501b02833d00536300502874002833e005363005", + "0x33c33b00702d02833b00536300502802302833c00536300533d33e00735c", + "0x3c00536300503c00504f02808c005363005337005741028337005363005", + "0x23102802836300502800702808c03c00700508c00536300508c00537d028", + "0x2802836300500a00525102802836300503100523102802836300504f005", + "0x335005363005028742028336005363005028020028028363005023005231", + "0x2802302808a00536300533533600735c02833500536300533500501b028", + "0x536300533300574102833300536300508a33400702d028334005363005", + "0x36400700508800536300508800537d02836400536300536400504f028088", + "0x9200774304f00b007363007005028007005028028363005028361028088", + "0x503100574402801000536300504f00503102802836300502800702800f", + "0x4e0313630071c600b0077450280100053630050100050920281c6005363", + "0x1700536300501000503102802836300502800702803004d007746014013", + "0x1700509202836100536300504e00504f028018005363005014005747028", + "0x1c00536300501800574902801b005363005013005748028360005363005", + "0x35f00536300501000503102802836300502800702802874a00502804d028", + "0x504d00504f02801f00536300535e00574b02835e005363005028030028", + "0x2801b00536300503000574802836000536300535f005092028361005363", + "0x701c00574c02802000536300501b0051b002801c00536300501f005749", + "0x2300536300536000503102802836300502800702835c00574d35d005363", + "0x2300a74f02802300536300502300509202802d00536300535d00574e028", + "0x283630050280070283571a83590317500840c035b03136300702d00a007", + "0x36100504f02803200536300535b00503102835b00536300535b005092028", + "0xc00053630050c00050c0028032005363005032005092028361005363005", + "0x36100b24e0280840053630050840052500280200053630050200051b2028", + "0x2800702800c03336435600a00500c03336435600a3630050840200c0032", + "0x31028359005363005359005092028028363005020005243028028363005", + "0x36300535703600702d02803600536300502802302803c005363005359005", + "0x9202836100536300536100504f028219005363005040005751028040005", + "0x3630052190057520281a80053630051a80050c002803c00536300503c005", + "0x36300535c0050470280283630050280070282191a803c36100a005219005", + "0x2003175302822700536300502803002821d005363005360005031028028", + "0x36300536100504f02823100536300522d00575402822d00536300522700a", + "0x7520280070053630050070050c002821d00536300521d005092028361005", + "0x75502802836300502800702823100721d36100a005231005363005231005", + "0x4600536300500f00503102802836300503100524302802836300500a005", + "0x36300504700501b028047005363005028046028048005363005028020028", + "0x2d02824200536300502802302804500536300504704800735c028047005", + "0x509200504f028249005363005246005751028246005363005045242007", + "0x280070053630050070050c0028046005363005046005092028092005363", + "0x2802836300502836102824900704609200a005249005363005249005752", + "0x33e0281c601000f03136300509200575702809200b00736300500b005756", + "0x36300501300522402801304e00736300500f0052200280283630051c6005", + "0x2802836300503000530a02803004d00736300501400519c028014013007", + "0x2800702801800575902836300701700575802801700536300504d0052f1", + "0x1b36000736300501300519c028361005363005005005031028028363005", + "0x536100509202801c00536300501b0052f102802836300536000530a028", + "0x2802836300502800702835f00575a02836300701c005758028361005363", + "0x2836300501000526802802836300500a00526802802836300504e005268", + "0x36300536100503102802836300500b00575c02802836300504f00575b028", + "0x4d02802000536300535e00509202801f00536300502800504f02835e005", + "0x503102802836300535f00575e02802836300502800702802875d005028", + "0x2802875f00502804d02835c00536300535d00509202835d005363005361", + "0x2802836300501300526802802836300501800575e028028363005028007", + "0x504e00519c02835c005363005023005092028023005363005005005031", + "0x3590840073630050c000519c0280c000536300502876002835b02d007363", + "0x3080283573590073630053590051740281a835b00736300535b005174028", + "0x3640077613560320073630073571a8028031175028357005363005357005", + "0x36300535c00503102802836300535600530a028028363005028007028033", + "0x14b02800c00536300500c00509202803200536300503200504f02800c005", + "0x36300500a00526802802836300502800702802876202836300735935b007", + "0x500b00575c02802836300504f00575b028028363005010005268028028", + "0xc00503102802836300502d00530a02802836300508400530a028028363", + "0x2000536300503c00509202801f00536300503200504f02803c005363005", + "0x3600536300500c00503102802836300502800702802875d00502804d028", + "0x32031175028036005363005036005092028084005363005084005308028", + "0x530a02802836300502800702822721d00776321904000736300708402d", + "0x75b02802836300501000526802802836300500a005268028028363005219", + "0x22d00536300503600503102802836300500b00575c02802836300504f005", + "0x502876402802000536300522d00509202801f00536300504000504f028", + "0x28048005363005046005766028046005363005231005765028231005363", + "0x50310050c0028007005363005007005301028047005363005048005381", + "0x702804703100702001f00b005047005363005047005767028031005363", + "0x2804500536300503600503102802836300522700530a028028363005028", + "0x76800502804d02824600536300504500509202824200536300521d00504f", + "0x36300535b00530a02802836300503300530a028028363005028007028028", + "0x535900530a02802836300502d00530a02802836300508400530a028028", + "0x9202824200536300536400504f02824900536300535c005031028028363", + "0x524b00522402824b24a007363005010005220028246005363005249005", + "0x2836300525200530a02825224f00736300524c00519c02824c24b007363", + "0x36300725300575802802836300502800b02825300536300524f0052f1028", + "0x19c028258005363005246005031028028363005028007028256005769028", + "0x3630050090052f102802836300505000530a02800905000736300524b005", + "0x5800576a02836300705b00575802825800536300525800509202805b005", + "0x2802836300524a005268028028363005028361028028363005028007028", + "0x2836300500a00526802802836300500b00575c02802836300504f00575b", + "0x5900509202805c00536300524200504f028059005363005258005031028", + "0x5800575e02802836300502800702802876b00502804d02826c005363005", + "0x28277005363005275005092028275005363005258005031028028363005", + "0x26802802836300525600575e02802836300502800702802876c00502804d", + "0x536300505e00509202805e00536300524600503102802836300524b005", + "0x502876002805f06000736300524a00519c028028363005028361028277", + "0x5f00736300505f0051740282bc2af00736300505d00519c02805d005363", + "0x1750280670053630050670053080280672bc0073630052bc005174028042", + "0x2802836300502800702800606800776d069306007363007067042242031", + "0x36300530600504f02806f00536300527700503102802836300506900530a", + "0x2876e0283630072bc05f00714b02806f00536300506f005092028306005", + "0x2836300500b00575c02802836300504f00575b028028363005028007028", + "0x36300506000530a0280283630052af00530a02802836300500a005268028", + "0x509202805c00536300530600504f02807100536300506f005031028028", + "0x503102802836300502800702802876b00502804d02826c005363005071", + "0x53630053470050920282af0053630052af00530802834700536300506f", + "0x502800702834607700776f0750740073630072af060306031175028347", + "0xb00575c02802836300504f00575b02802836300507500530a028028363", + "0x4f02834500536300534700503102802836300500a005268028028363005", + "0x536300502876402826c00536300534500509202805c005363005074005", + "0x538102807900536300507a00576602807a005363005043005765028043", + "0x53630050310050c002800700536300500700530102807f005363005079", + "0x502800702807f03100726c05c00b00507f00536300507f005767028031", + "0x504f02834200536300534700503102802836300534600530a028028363", + "0x2802877000502804d02807d005363005342005092028081005363005077", + "0x2802836300505f00530a02802836300500600530a028028363005028007", + "0x283630052bc00530a02802836300506000530a0280283630052af00530a", + "0x34000509202808100536300506800504f028340005363005277005031028", + "0xa00536300500a0051820280310053630050310050c002807d005363005", + "0x33f00a36300500b00a03107d08100b77102800b00536300500b0051d6028", + "0x2836300502800702833700577333b00536300733c00577202833c33d33e", + "0x8c00509202833600536300533b00577402808c00536300533e005031028", + "0x36300502800702808a0057753350053630073360051c402808c005363005", + "0x509202833f00536300533f00504f02833400536300508c005031028028", + "0x536300533d0050c0028007005363005007005301028334005363005334", + "0xb36300533533d00733433f00b77702833500536300533500577602833d", + "0x502800702808e005778086005363007330005382028330331332088333", + "0x77a02832d00536300508600577902836f005363005088005031028028363", + "0x36300532d00577a02802836300532c00575b02832b32c00736300504f005", + "0x77b02832800536300532b00577b02802836300532a00575b02832932a007", + "0x3630053270051c60283260053630053280051c6028327005363005329005", + "0x2832500536300532500501b02832500536300508b32600732602808b005", + "0x2800702832400577c02836300732500534202836f00536300536f005092", + "0x77d02832000536300502803002832300536300536f005031028028363005", + "0x363005093005381028093005363005085005766028085005363005320005", + "0x30102832300536300532300509202833300536300533300504f028095005", + "0x3630050950057670283310053630053310050c0028332005363005332005", + "0x532400534002802836300502800702809533133232333300b005095005", + "0x576502809800536300502877e02831f00536300536f005031028028363", + "0x536300509600538102809600536300531e00576602831e005363005098", + "0x530102831f00536300531f00509202833300536300533300504f02831d", + "0x536300531d0057670283310053630053310050c0028332005363005332", + "0x36300504f00575b02802836300502800702831d33133231f33300b00531d", + "0x504f02831a00536300508e00577f02831c005363005088005031028028", + "0x536300533200530102831c00536300531c005092028333005363005333", + "0x33300b00531a00536300531a0057670283310053630053310050c0028332", + "0x575b02802836300508a00504702802836300502800702831a33133231c", + "0x2831800536300502802002831900536300508c00503102802836300504f", + "0x531731800735c02831700536300531700501b02831700536300502824b", + "0x2831400536300531631500702d028315005363005028023028316005363", + "0x531900509202833f00536300533f00504f02831300536300531400577f", + "0x2833d00536300533d0050c0028007005363005007005301028319005363", + "0x2836300502800702831333d00731933f00b005313005363005313005767", + "0x533700577f02831200536300533e00503102802836300504f00575b028", + "0x2831200536300531200509202833f00536300533f00504f028311005363", + "0x531100576702833d00536300533d0050c0028007005363005007005301", + "0x2809200a00736300500a00522402831133d00731233f00b005311005363", + "0x519c0281c601000736300501000522402801000f007363005092005220", + "0x536300504e0052f102802836300501300530a02801304e0073630051c6", + "0x503102802836300502800702804d005780028363007014005758028014", + "0x36300501700530a02801801700736300501000519c028030005363005005", + "0x57580280300053630050300050920283610053630050180052f1028028", + "0x2836300500f005268028028363005028007028360005781028363007361", + "0x36300500b00526802802836300504f00520602802836300500a005268028", + "0x2800504f02801b005363005030005031028028363005031005268028028", + "0x702802878200502804d02835f00536300501b00509202801c005363005", + "0x2835e00536300503000503102802836300536000575e028028363005028", + "0x2802836300502800702802878300502804d02801f00536300535e005092", + "0x536300500500503102802836300501000526802802836300504d00575e", + "0x78402835c35d00736300500f00519c02801f005363005020005092028020", + "0x36300535c00517402835b02d00736300502300519c028023005363005028", + "0x8400536300508400530802808435b00736300535b0051740280c035c007", + "0x3630050280070280323570077851a83590073630070840c0028031175028", + "0x35900504f02835600536300501f0050310280283630051a800530a028028", + "0x2836300735b35c00714b028356005363005356005092028359005363005", + "0x504f00520602802836300500a005268028028363005028007028028786", + "0x2d00530a02802836300503100526802802836300500b005268028028363", + "0x4f02836400536300535600503102802836300535d00530a028028363005", + "0x2878200502804d02835f00536300536400509202801c005363005359005", + "0x36300502d005308028033005363005356005031028028363005028007028", + "0xc00736300702d35d35903117502803300536300503300509202802d005", + "0x26802802836300503c00530a02802836300502800702804003600778703c", + "0x2802836300500b00526802802836300504f00520602802836300500a005", + "0x36300500c00504f028219005363005033005031028028363005031005268", + "0x30702821d00536300501c00539002835f00536300521900509202801c005", + "0x30a02802836300502800702802878800502804d02822700536300535f005", + "0x536300503600504f02822d005363005033005031028028363005040005", + "0x36300502800702802878900502804d02804600536300522d005092028231", + "0x502d00530a02802836300535c00530a02802836300503200530a028028", + "0x1f00503102802836300535b00530a02802836300535d00530a028028363", + "0x4600536300504800509202823100536300535700504f028048005363005", + "0x22402824204500736300504700522002804700b00736300500b005224028", + "0x24a00530a02824a24900736300524600519c028246242007363005242005", + "0x578a02836300724b00575802824b0053630052490052f1028028363005", + "0x524200519c02824f00536300504600503102802836300502800702824c", + "0x282560053630052530052f102802836300525200530a028253252007363", + "0x2800702825800578b02836300725600575802824f00536300524f005092", + "0x3002805000536300524f005031028028363005045005268028028363005", + "0x536300523100504f02805b00536300500900533f028009005363005028", + "0x2804d02805c00536300505b00507d028059005363005050005092028058", + "0x24f00503102802836300525800575e02802836300502800702802878c005", + "0x702802878d00502804d02827500536300526c00509202826c005363005", + "0x3102802836300524200526802802836300524c00575e028028363005028", + "0x36300504500519c028275005363005277005092028277005363005046005", + "0x282af05d00736300505f00519c02805f00536300502878402806005e007", + "0x53080280422af0073630052af0051740282bc060007363005060005174", + "0x6806900778e3060670073630070422bc231031175028042005363005042", + "0x536300527500503102802836300530600530a028028363005028007028", + "0x714b02800600536300500600509202806700536300506700504f028006", + "0x2836300505d00530a02802836300502800702802878f0283630072af060", + "0x36300502803002806f00536300500600503102802836300505e00530a028", + "0x9202805800536300506700504f02834700536300507100533f028071005", + "0x2878c00502804d02805c00536300534700507d02805900536300506f005", + "0x36300505d005308028074005363005006005031028028363005028007028", + "0x7500736300705d05e06703117502807400536300507400509202805d005", + "0x3102802836300507700530a028028363005028007028345346007790077", + "0x536300507a00533f02807a005363005028030028043005363005074005", + "0x507d02805900536300504300509202805800536300507500504f028079", + "0x530a02802836300502800702802878c00502804d02805c005363005079", + "0x2834200536300502803002807f005363005074005031028028363005345", + "0x507f00509202805800536300534600504f028081005363005342005081", + "0x2800702802878c00502804d02805c00536300508100507d028059005363", + "0x530a02802836300506000530a02802836300506800530a028028363005", + "0x310280283630052af00530a02802836300505e00530a02802836300505d", + "0x536300534000508102834000536300502803002807d005363005275005", + "0x507d02805900536300507d00509202805800536300506900504f02833f", + "0x536300533e00507d02833e00536300505c00533c02805c00536300533f", + "0x4702802836300502800702833c00579133d00536300733e0052cd02833e", + "0x33700536300502879202833b00536300505900503102802836300533d005", + "0x509202808c00536300508c00579402808c337007363005337005793028", + "0x8833333408a3353361c636300708c00b05803179502833b00536300533b", + "0x533b00503102802836300502800702832d36f08e031796086330331332", + "0x536300533032b00728802832b00536300508633600728802832c005363", + "0x2832800536300533232900728802832900536300533132a00728802832a", + "0x7288028326005363005333327007288028327005363005088328007288", + "0x533500579702832500536300508a08b00728802808b005363005334326", + "0x2803100536300503100518202832500536300532500504f028324005363", + "0x325031798028323005363005323005182028323324007363005324005224", + "0x93005794028093337007363005337005793028085320007363005323031", + "0x31c31d09631e09831f09500f363005093085320031799028093005363005", + "0x728802831900536300531a09500728802802836300531f00579a02831a", + "0x9631700728802831700536300531d31800728802831800536300531c319", + "0x536300531500504f02831500536300531e316007288028316005363005", + "0x18202831400536300531400518202831400a00736300500a005224028315", + "0x5794028312313007363005324314315031798028324005363005324005", + "0x30b0a930c30e30f31100f363005337312313031799028337005363005337", + "0x28802830a0053630050ac31100728802802836300530f00579a0280ac0b0", + "0xb40072880280b400536300530b3080072880283080053630050b030a007", + "0x536300502879b02830500536300530c0b60072880280b60053630050a9", + "0xb900518202832c00536300532c00509202830300536300502879c0280b9", + "0x30500536300530500504f0283030053630053030051820280b9005363005", + "0x70280bf2fe2ff03179d3003013020313630073030b900732c00a20b028", + "0x2fd005363005302005031028302005363005302005092028028363005028", + "0x2fd0050920283010053630053010050c0028300005363005300005208028", + "0x3630050280070282fb00579e2fc0053630073000052070282fd005363005", + "0xa79f0280510053630050510050920280510053630052fd005031028028", + "0x3630050280070280c738f0dc0317a038d38c38b0313630070982fc301051", + "0x50920280c600536300538b00503102838b00536300538b005092028028", + "0x30e04f38c0c600a79f02838d00536300538d0055680280c60053630050c6", + "0x50920280283630050280070283073902fa0317a10cf0cb0c9031363007", + "0x53630053910050920283910053630050c90050310280c90053630050c9", + "0x2f40313630070cf38d0cb39100a7a20280cf0053630050cf005568028391", + "0x53630052f40050920280283630050280070282f13920d50317a32f30d4", + "0x55680282f00053630052f00050920282f00053630052f40050310282f4", + "0x317a42e52e70da2ea00a3630072f30d42f00311fd0282f30053630052f3", + "0x2ea0050920280283630052e50052680280283630050280070280db2e80d2", + "0x2e20073630052e70052200282ef0053630052ea0050310282ea005363005", + "0x52680280df2e000736300500a0052200280283630052e20052680282e1", + "0x2e10073630052e10052240282e10053630052e10051820280283630052e0", + "0x52240280283630052ec00530a0282ec0e10073630052ee00519c0282ee", + "0x52ed00530a0282ed0e30073630052eb00519c0282eb0df0073630050df", + "0xc00282d60053630050e30052f10282de0053630050e10052f1028028363", + "0x72d62de00714b0282ef0053630052ef0050920280da0053630050da005", + "0x52680280283630052e10052680280283630050280070280287a5028363", + "0x282d30053630050280300282d80053630052ef0050310280283630050df", + "0x52d200507d0280e90053630052d80050920282d20053630052d300533f", + "0x52ef0050310280283630050280070280287a600502804d0282d0005363", + "0x280283630052cd00530a0282ca2cd0073630052e100519c0282ce005363", + "0x52ca0052f10280283630050ec00530a0280f00ec0073630050df00519c", + "0x282ce0053630052ce0050920282c60053630050f00052f10282c9005363", + "0x52ce0050310280283630050280070280287a70283630072c62c900714b", + "0x920282c30053630052c400533f0282c40053630050280300282c5005363", + "0x287a600502804d0282d00053630052c300507d0280e90053630052c5005", + "0x53630050280300282c20053630052ce005031028028363005028007028", + "0x507d0280e90053630052c20050920282be0053630052c10050810282c1", + "0x53630050f80057a90280f80053630052d00057a80282d00053630052be", + "0x50c00280e90053630050e900509202830500536300530500504f0280fa", + "0x280fa0da0e930500a0050fa0053630050fa0057aa0280da0053630050da", + "0xd20053630050d200509202802836300500a005268028028363005028007", + "0xdb2bb00702d0282bb0053630050280230282bd0053630050d2005031028", + "0x30500536300530500504f0280fc0053630052ba0057ab0282ba005363005", + "0xfc0057aa0282e80053630052e80050c00282bd0053630052bd005092028", + "0xa0052680280283630050280070280fc2e82bd30500a0050fc005363005", + "0x280fe0053630050d50050310280d50053630050d5005092028028363005", + "0x50fb0057ab0280fb0053630052f10fd00702d0280fd005363005028023", + "0x280fe0053630050fe00509202830500536300530500504f0282b9005363", + "0x3920fe30500a0052b90053630052b90057aa0283920053630053920050c0", + "0x36300538d00520602802836300500a0052680280283630050280070282b9", + "0x280230282b80053630052fa0050310282fa0053630052fa005092028028", + "0x53630051060057ab02810600536300530710400702d028104005363005", + "0x50c00282b80053630052b800509202830500536300530500504f028105", + "0x281053902b830500a0051050053630051050057aa028390005363005390", + "0x2802836300504f00520602802836300500a005268028028363005028007", + "0x3630050dc0050310280dc0053630050dc00509202802836300530e005268", + "0x7ab0282b60053630050c72b700702d0282b7005363005028023028103005", + "0x36300510300509202830500536300530500504f02810c0053630052b6005", + "0xa00510c00536300510c0057aa02838f00536300538f0050c0028103005", + "0x52680280283630052fb00504702802836300502800702810c38f103305", + "0x26802802836300530e00526802802836300504f00520602802836300500a", + "0x10b00536300502802002810d0053630052fd005031028028363005098005", + "0x10e10b00735c02810e00536300510e00501b02810e00536300502824b028", + "0x1140053630053010050c00282b400536300510d005092028025005363005", + "0x283630050280070280287ac00502804d02811600536300502500522d028", + "0x36300530e00526802802836300504f00520602802836300500a005268028", + "0x2ff0050310282ff0053630052ff005092028028363005098005268028028", + "0x1140053630052fe0050c00282b4005363005115005092028115005363005", + "0x11611300702d0281130053630050280230281160053630050bf00522d028", + "0x30500536300530500504f0281200053630052b30057ab0282b3005363005", + "0x1200057aa0281140053630051140050c00282b40053630052b4005092028", + "0xa0052680280283630050280070281201142b430500a005120005363005", + "0x57ad02802836300503100526802802836300504f005206028028363005", + "0x536300532d08e00728802811c00536300533b005031028028363005337", + "0x2824b0281220053630050280200282b200536300536f11b00728802811b", + "0x536300512412200735c02812400536300512400501b028124005363005", + "0x57ab0282ad0053630052b02ae00702d0282ae0053630050280230282b0", + "0x536300511c0050920282b20053630052b200504f0282ac0053630052ad", + "0x2b200a0052ac0053630052ac0057aa0280070053630050070050c002811c", + "0xa00526802802836300533c0050470280283630050280070282ac00711c", + "0x526802802836300500b00526802802836300504f005206028028363005", + "0x21d00536300505800504f028127005363005059005031028028363005031", + "0x512900533f028129005363005028030028227005363005127005092028", + "0x282ab0053630051260057a90281260053630051280057a8028128005363", + "0x722721d00a0052ab0053630052ab0057aa0280070053630050070050c0", + "0xb00a03100a3630050070057af0280070280073630050280057ae0282ab", + "0x504f0057b002802836300500b0057b002802836300500a0057b002804f", + "0x7ae02800f0053630050920057b20280920053630050310057b1028028363", + "0x7b002801401304e1c600a3630050100057af028010005007363005005005", + "0x280283630050140057b00280283630050130057b002802836300504e005", + "0x3000f00732602803000536300504d0057b202804d0053630051c60057b1", + "0x7b302836300701700534202801700536300501700501b028017005363005", + "0x57af0283610280073630050280057ae028028363005028007028018005", + "0x501c0057b00280283630053600057b002835f01c01b36000a363005361", + "0x57b202835e00536300501b0057b102802836300535f0057b0028028363", + "0x3630050200057af0280200050073630050050057ae02801f00536300535e", + "0x280283630050230057b002802836300535d0057b002802d02335c35d00a", + "0x36300535b0057b202835b00536300535c0057b102802836300502d0057b0", + "0x2808400536300508400501b0280840053630050c001f0073260280c0005", + "0x50280057ae0280283630050280070283590057b4028363007084005342", + "0x53570057b002836435603235700a3630051a80057af0281a8028007363", + "0x3560057b10280283630053640057b00280283630050320057b0028028363", + "0x50073630050050057ae02800c0053630050330057b2028033005363005", + "0x280283630050360057b002821d21904003600a36300503c0057af02803c", + "0x53630052190057b102802836300521d0057b00280283630050400057b0", + "0x1b02823100536300522d00c00732602822d0053630052270057b2028227", + "0x50280070280460057b5028363007231005342028231005363005231005", + "0x283630050480057b002824204504704800a3630050280057af028028363", + "0x3630052420057b10280283630050450057b00280283630050470057b0028", + "0x24c24b24a00a3630050050057af0282490053630052460057b2028246005", + "0x524c0057b002802836300524b0057b002802836300524a0057b002824f", + "0x3260282530053630052520057b202825200536300524f0057b1028028363", + "0x725600534202825600536300525600501b028256005363005253249007", + "0x810280500053630050280300280283630050280070282580057b6028363", + "0x2800702800900500500900536300500900507d028009005363005050005", + "0x533f02805b005363005028030028028363005258005340028028363005", + "0x502800702805800500505800536300505800507d02805800536300505b", + "0x280055cb0280283630050050055cb028028363005046005340028028363", + "0x53590053400280283630050280070280287b700502804d028028363005", + "0x502804d0280283630050280055cb0280283630050050055cb028028363", + "0x50050055cb0280283630050180053400280283630050280070280287b7", + "0x5900533f0280590053630050280300280283630050280055cb028028363", + "0x503100535602805c00500505c00536300505c00507d02805c005363005", + "0x2836300502800702800b0057b802836300700a00563e02800a031007363", + "0x536300502803002802836300503100523102802836300500700501f028", + "0x4f02800f0053630050920057ba02809200536300504f0050077b902804f", + "0x702800f02800700500f00536300500f0057bb028028005363005028005", + "0x1c60100313630050050057bc02802836300500b00563f028028363005028", + "0x2801403100736300503100535602801304e00736300504e00535602804e", + "0x283630050280070280180170077bd03004d007363007014013028031734", + "0x3610050330283600300073630050300053560283610053630050285d1028", + "0x2835e35f0077be01c01b00736300736136004d03156e028361005363005", + "0x2801f0053630050285d102802836300501c005231028028363005028007", + "0x2000714e02801b00536300501b00504f028020030007363005030005356", + "0x280283630050310052310280283630050280070280287bf02836300701f", + "0x35d03001b03156e02835d00536300535d00503302835d0053630050285d1", + "0x36300502871702802836300502800702835b02d0077c002335c007363007", + "0x2835c00536300535c00504f0280840230073630050230053560280c0005", + "0x3630050287170280283630050280070280287c10283630070c008400714e", + "0x283590053630053590050330281a8023007363005023005356028359005", + "0x283630050280070283643560077c20323570073630073591a835c03156e", + "0x3c0317c300c0330073630070073570070ac028028363005032005231028", + "0x503300504f02821900536300502827a028028363005028007028040036", + "0x2822d00536300521900530802822700536300500c00530802821d005363", + "0x2821d00536300503c00504f0280283630050280070280287c400502804d", + "0x36300502871702822d005363005036005308028227005363005040005308", + "0x28231005363005231005033028046023007363005023005356028231005", + "0x283630050280070282420450077c504704800736300723104621d03156e", + "0x480077c602804700536300504700503302804800536300504800504f028", + "0x2800702824b0057c824a0053630072490057c7028249246007363005047", + "0x3136300524c22d2460317ca02824c00536300524a0057c9028028363005", + "0x282580053630052270050b90282560053630052530050b902825325224f", + "0x36300504e0053560280090053630050285d10280500053630052520050b9", + "0x736300705b00924f03156e02800900536300500900503302805b04e007", + "0x2827500536300502821a02802836300502800702826c05c0077cb059058", + "0x2770072ee02827700536300527700501b028277005363005275256007221", + "0x5900736300505900535602806000536300502871702805e005363005258", + "0x3156e02805e00536300505e00501b02806000536300506000503302805f", + "0x2310280283630050280070280422bc0077cc2af05d00736300706005f058", + "0x670053630050670050330280670053630050287170280283630052af005", + "0x3630050280070280060680077cd06930600736300706705905d03156e028", + "0x77c602806900536300506900503302830600536300530600504f028028", + "0x70280740057ce3470053630070710057c702807106f007363005069306", + "0x770053630050750057cf0280750053630053470057c9028028363005028", + "0x34534600722102834500536300502821a0283460053630050770050b9028", + "0x7900536300504300501b02807a00536300506f00504f028043005363005", + "0x280283630050100057d10280283630050280070280287d000502804d028", + "0x2836300505e00501f02802836300504e005231028028363005023005231", + "0x3630050740050770280283630051c600501f02802836300505000501f028", + "0x22d02808100536300506f00504f02802836300507f00534602834207f007", + "0x2310280283630050280070280287d200502804d02807d005363005342005", + "0x280283630050230052310280283630050100057d1028028363005006005", + "0x283630051c600501f02802836300505e00501f02802836300504e005231", + "0x536300502860b02834000536300502802002802836300505000501f028", + "0x4f02833e00536300533f34000735c02833f00536300533f00501b02833f", + "0x287d200502804d02807d00536300533e00522d028081005363005068005", + "0x53630052bc00504f028028363005042005231028028363005028007028", + "0x2833c33d0073630050592bc0077c60280590053630050590050330282bc", + "0x33b0057c90280283630050280070283370057d333b00536300733c0057c7", + "0x3350053630053360050b902833600536300508c0057cf02808c005363005", + "0x1c600722102807900536300533500501b02807a00536300533d00504f028", + "0x36300508a0500072ee02808a00536300508a00501b02808a005363005079", + "0x8833300736300733407a0077d402833400536300533400501b028334005", + "0x5d20283310053630050880100077d60280283630050280070283320057d5", + "0x3300055d302808600536300533300504f02833000536300504e05e331031", + "0x100057d10280283630050280070280287d700502804d02808e005363005", + "0x501f02802836300504e005231028028363005023005231028028363005", + "0x1b02832d00536300502824b02836f00536300502802002802836300505e", + "0x533200504f02832c00536300532d36f00735c02832d00536300532d005", + "0x280070280287d800502804d02832a00536300532c00522d02832b005363", + "0x52310280283630050230052310280283630050100057d1028028363005", + "0x1f02802836300505000501f02802836300505e00501f02802836300504e", + "0x3630053290053460283283290073630053370050770280283630051c6005", + "0x539002807d00536300532800522d02808100536300533d00504f028028", + "0x280287d800502804d02832a00536300507d0057d902832b005363005081", + "0x280283630050100057d102802836300526c005231028028363005028007", + "0x2836300525600501f02802836300504e005231028028363005023005231", + "0x36300525800501f02802836300505000501f0280283630051c600501f028", + "0x532600501b02832600536300502860b028327005363005028020028028", + "0x32b00536300505c00504f02808b00536300532632700735c028326005363", + "0x283630050280070280287d800502804d02832a00536300508b00522d028", + "0x36300504e0052310280283630050230052310280283630050100057d1028", + "0x522d00530a0280283630051c600501f02802836300522700530a028028", + "0x4f02802836300532500534602832432500736300524b005077028028363", + "0x287d800502804d02832a00536300532400522d02832b005363005246005", + "0x283630050100057d1028028363005242005231028028363005028007028", + "0x36300522700530a02802836300504e005231028028363005023005231028", + "0x36300502802002802836300522d00530a0280283630051c600501f028028", + "0x735c02832000536300532000501b02832000536300502860b028323005", + "0x36300508500522d02832b00536300504500504f028085005363005320323", + "0x7da02809500536300532a09300702d02809300536300502802302832a005", + "0x36300531f0057bb02832b00536300532b00504f02831f005363005095005", + "0x2802836300536400523102802836300502800702831f32b00700531f005", + "0x2836300502800702831c31d0960317db31e0980073630070073560070ac", + "0x531e00530802831900536300509800504f02831a00536300502827a028", + "0x280070280287dc00502804d02831700536300531a005308028318005363", + "0x2831800536300531c00530802831900536300509600504f028028363005", + "0x502300535602831900536300531900504f02831700536300531d005308", + "0x73630053163190077c6028316005363005316005033028316023007363", + "0x280283630050280070283120057dd3130053630073140057c7028314315", + "0x2830c30e30f0313630053113183150317ca0283110053630053130057c9", + "0x36300502300535602830b0053630050287170280a90053630053170050b9", + "0x73630070b030b30f03156e02830b00536300530b0050330280b0023007", + "0xac0053630050ac00504f0280283630050280070280b43080077de30a0ac", + "0x7c70283050b600736300530a0ac0077c602830a00536300530a005033028", + "0x50b90057c90280283630050280070283030057df0b9005363007305005", + "0x283000053630053010050b90283010053630053020057cf028302005363", + "0x3630050285d10282fe00536300530c0050b90282ff00536300530e0050b9", + "0x280bf0053630050bf0050330282fd04e00736300504e0053560280bf005", + "0x2836300502800702838b0510077e02fb2fc0073630072fd0bf0b603156e", + "0x72ee02838c00536300538c00501b02838c0053630053000a9007221028", + "0x73630052fb0053560280dc00536300502871702838d0053630052ff38c", + "0x56e02838d00536300538d00501b0280dc0053630050dc00503302838f2fb", + "0x280283630050280070280cb0c90077e10c60c70073630070dc38f2fc031", + "0x53630050cf0050330280cf0053630050287170280283630050c6005231", + "0x50280070283913070077e23902fa0073630070cf2fb0c703156e0280cf", + "0x7c60283900053630053900050330282fa0053630052fa00504f028028363", + "0x280d50057e32f30053630070d40057c70280d42f40073630053902fa007", + "0x53630053920057cf0283920053630052f30057c9028028363005028007", + "0x2f00072210282ea00536300502821a0282f00053630052f10050b90282f1", + "0x53630050da00501b0282e70053630052f400504f0280da0053630052ea", + "0x283630050100057d10280283630050280070280287e400502804d0282e5", + "0x3630052fe00501f02802836300504e005231028028363005023005231028", + "0x50d50050770280283630051c600501f02802836300538d00501f028028", + "0x280db0053630052f400504f0280283630050d20053460282e80d2007363", + "0x280283630050280070280287e500502804d0282ef0053630052e800522d", + "0x283630050230052310280283630050100057d1028028363005391005231", + "0x3630051c600501f0280283630052fe00501f02802836300504e005231028", + "0x36300502860b0282e200536300502802002802836300538d00501f028028", + "0x282e00053630052e12e200735c0282e10053630052e100501b0282e1005", + "0x7e500502804d0282ef0053630052e000522d0280db00536300530700504f", + "0x3630050c900504f0280283630050cb005231028028363005028007028028", + "0x2ee0df0073630052fb0c90077c60282fb0053630052fb0050330280c9005", + "0x57c90280283630050280070282ec0057e60e10053630072ee0057c7028", + "0x53630050e30050b90280e30053630052eb0057cf0282eb0053630050e1", + "0x72210282e50053630052ed00501b0282e70053630050df00504f0282ed", + "0x52de38d0072ee0282de0053630052de00501b0282de0053630052e51c6", + "0x2d80073630072d62e70077d40282d60053630052d600501b0282d6005363", + "0x280e90053630052d30100077d60280283630050280070282d20057e72d3", + "0x55d30280860053630052d800504f0282d000536300504e2fe0e90315d2", + "0x536300508e0057e80282ce00536300508600539002808e0053630052d0", + "0x283630050100057d10280283630050280070280287e900502804d0282cd", + "0x3630052fe00501f02802836300504e005231028028363005023005231028", + "0x50ec00501b0280ec00536300502824b0282ca005363005028020028028", + "0x2c90053630052d200504f0280f00053630050ec2ca00735c0280ec005363", + "0x283630050280070280287ea00502804d0282c60053630050f000522d028", + "0x36300504e0052310280283630050230052310280283630050100057d1028", + "0x51c600501f02802836300538d00501f0280283630052fe00501f028028", + "0x4f0280283630052c50053460282c42c50073630052ec005077028028363", + "0x3630050db0053900282ef0053630052c400522d0280db0053630050df005", + "0x50280070280287ea00502804d0282c60053630052ef0057d90282c9005", + "0x230052310280283630050100057d102802836300538b005231028028363", + "0x501f0280283630052fe00501f02802836300504e005231028028363005", + "0x1f02802836300530000501f0280283630050a900501f0280283630051c6", + "0x282c200536300502860b0282c30053630050280200280283630052ff005", + "0x5100504f0282c10053630052c22c300735c0282c20053630052c200501b", + "0x70280287ea00502804d0282c60053630052c100522d0282c9005363005", + "0x2310280283630050230052310280283630050100057d1028028363005028", + "0x280283630050a900501f0280283630051c600501f02802836300504e005", + "0x736300530300507702802836300530c00530a02802836300530e00530a", + "0x522d0282c90053630050b600504f0280283630052be0053460280f82be", + "0x52310280283630050280070280287ea00502804d0282c60053630050f8", + "0x2310280283630050230052310280283630050100057d10280283630050b4", + "0x280283630051c600501f02802836300530c00530a02802836300504e005", + "0xfa00536300502802002802836300530e00530a0280283630050a900501f", + "0x2bd0fa00735c0282bd0053630052bd00501b0282bd00536300502860b028", + "0x2c60053630052bb00522d0282c900536300530800504f0282bb005363005", + "0x280283630050100057d10280283630050280070280287ea00502804d028", + "0x2836300531700530a02802836300504e005231028028363005023005231", + "0x36300531200507702802836300531800530a0280283630051c600501f028", + "0x22d0282c900536300531500504f0280283630052ba0053460280fc2ba007", + "0x3630052c60fe00702d0280fe0053630050280230282c60053630050fc005", + "0x7bb0282c90053630052c900504f0280fb0053630050fd0057da0280fd005", + "0x35c0070ac0280283630050280070280fb2c90070050fb0053630050fb005", + "0x2827a0280283630050280070281051061040317eb2b82b9007363007007", + "0x2b60053630052b80053080282b70053630052b900504f028103005363005", + "0x283630050280070280287ec00502804d02810c005363005103005308028", + "0x1060053080282b60053630051050053080282b700536300510400504f028", + "0x10b0053630052b60050b902810d00536300510c0050b902810c005363005", + "0x10e00503302802504e00736300504e00535602810e0053630050285d1028", + "0x281151160077ed1142b400736300702510e2b703156e02810e005363005", + "0x114007363005114005356028113005363005028717028028363005028007", + "0x11c1200073630071132b32b403156e0281130053630051130050330282b3", + "0x2871702802836300511c0052310280283630050280070282b211b0077ee", + "0x36300712211412003156e028122005363005122005033028122005363005", + "0x536300512400504f0280283630050280070282ad2ae0077ef2b0124007", + "0x281272ac0073630052b01240077c60282b00053630052b0005033028124", + "0x1290057c90280283630050280070281280057f01290053630071270057c7", + "0x2a90053630052ab0050b90282ab0053630051260057cf028126005363005", + "0x2ac00504f02812e00536300512f2a900722102812f00536300502821a028", + "0x70280287f100502804d02813400536300512e00501b0282a8005363005", + "0x2310280283630050230052310280283630050100057d1028028363005028", + "0x2802836300510d00501f02802836300510b00501f02802836300504e005", + "0x51330053460282a71330073630051280050770280283630051c600501f", + "0x4d0282a40053630052a700522d0282a50053630052ac00504f028028363", + "0x57d10280283630052ad0052310280283630050280070280287f2005028", + "0x1f02802836300504e005231028028363005023005231028028363005010", + "0x2802836300510d00501f0280283630051c600501f02802836300510b005", + "0x536300513b00501b02813b00536300502860b028139005363005028020", + "0x22d0282a50053630052ae00504f02813a00536300513b13900735c02813b", + "0x2310280283630050280070280287f200502804d0282a400536300513a005", + "0x536300511400503302811b00536300511b00504f0280283630052b2005", + "0x7f32a20053630072a30057c70282a313800736300511411b0077c6028114", + "0x1420057cf0281420053630052a20057c90280283630050280070282a1005", + "0x2a800536300513800504f02829f0053630051410050b9028141005363005", + "0x501b02829e0053630051341c600722102813400536300529f00501b028", + "0x36300529d00501b02829d00536300529e10d0072ee02829e00536300529e", + "0x36300502800702814b0057f414915200736300729d2a80077d402829d005", + "0x14e00536300504e10b14d0315d202814d0053630051490100077d6028028", + "0x2cd0057bc0282cd00536300514e0055d30282ce00536300515200504f028", + "0x502329a1500315d202802836300529800523102829829a150031363005", + "0x2815900536300515a29c0077b902815a00536300502803002829c005363", + "0x51580057bb0282ce0053630052ce00504f0281580053630051590057ba", + "0x283630050100057d10280283630050280070281582ce007005158005363", + "0x36300510b00501f02802836300504e005231028028363005023005231028", + "0x515600501b02815600536300502824b028157005363005028020028028", + "0x15400536300514b00504f02815500536300515615700735c028156005363", + "0x283630050280070280287f500502804d02815300536300515500522d028", + "0x36300504e0052310280283630050230052310280283630050100057d1028", + "0x51c600501f02802836300510d00501f02802836300510b00501f028028", + "0x4f0280283630051640053460282961640073630052a1005077028028363", + "0x3630052a50053900282a400536300529600522d0282a5005363005138005", + "0x50280070280287f500502804d0281530053630052a40057d9028154005", + "0x230052310280283630050100057d1028028363005115005231028028363", + "0x501f02802836300510b00501f02802836300504e005231028028363005", + "0x60b02829500536300502802002802836300510d00501f0280283630051c6", + "0x36300529429500735c02829400536300529400501b028294005363005028", + "0x2302815300536300529300522d02815400536300511600504f028293005", + "0x3630052910057da02829100536300515329200702d028292005363005028", + "0x70052900053630052900057bb02815400536300515400504f028290005", + "0x50100057d102802836300535b005231028028363005028007028290154", + "0x1c600501f02802836300504e00523102802836300500700501f028028363", + "0x501b02828e00536300502860b02828f005363005028020028028363005", + "0x536300502802302816d00536300528e28f00735c02828e00536300528e", + "0x4f02817100536300528c0057da02828c00536300516d16f00702d02816f", + "0x702817102d0070051710053630051710057bb02802d00536300502d005", + "0x71702802836300503000523102802836300504e005231028028363005028", + "0x36300528b00503302817203100736300503100535602828b005363005028", + "0x2800702828a1770077f617517400736300728b17201b03156e02828b005", + "0x5033028146005363005028717028028363005175005231028028363005", + "0x55e2860077f728728800736300714603117403156e028146005363005146", + "0x36300528700503302828800536300528800504f028028363005028007028", + "0x17c0053630070240057c70280242820073630052872880077c6028287005", + "0x57cf02827f00536300517c0057c90280283630050280070282890057f8", + "0x27b00536300502821a02827c00536300527d0050b902827d00536300527f", + "0x501b02827900536300528200504f02827a00536300527b27c007221028", + "0x57d10280283630050280070280287f900502804d02818200536300527a", + "0x770280283630051c600501f02802836300500700501f028028363005010", + "0x36300528200504f028028363005184005346028185184007363005289005", + "0x50280070280287fa00502804d02827800536300518500522d028187005", + "0x1c600501f0280283630050100057d102802836300555e005231028028363", + "0x2860b02818900536300502802002802836300500700501f028028363005", + "0x536300518a18900735c02818a00536300518a00501b02818a005363005", + "0x2804d02827800536300518c00522d02818700536300528600504f02818c", + "0x17700504f02802836300528a0052310280283630050280070280287fa005", + "0x73630050311770077c6028031005363005031005033028177005363005", + "0x280283630050280070281940057fb1920053630071930057c7028193276", + "0x52710050b90282710053630051950057cf0281950053630051920057c9", + "0x2818200536300518d00501b02827900536300527600504f02818d005363", + "0x70072ee02827200536300527200501b0282720053630051821c6007221", + "0x36300727e2790077d402827e00536300527e00501b02827e005363005272", + "0x536300519a0100077d602802836300502800702819c0057fc19a26e007", + "0x19e26d0315d20281a000536300502803202819e00536300502824902826d", + "0x536300526a26b0077b902826a00536300502803002826b0053630051a0", + "0x57bb02826e00536300526e00504f0282660053630052680057ba028268", + "0x50100057d102802836300502800702826626e007005266005363005266", + "0x26400501b02826400536300502824b028265005363005028020028028363", + "0x26100536300502802302826300536300526426500735c028264005363005", + "0x504f02825f0053630052600057da02826000536300526326100702d028", + "0x2800702825f19c00700525f00536300525f0057bb02819c00536300519c", + "0x501f02802836300500700501f0280283630050100057d1028028363005", + "0x2836300525c00534602825b25c0073630051940050770280283630051c6", + "0x502802302827800536300525b00522d02818700536300527600504f028", + "0x1ac0053630052590057da02825900536300527825a00702d02825a005363", + "0x1ac1870070051ac0053630051ac0057bb02818700536300518700504f028", + "0x2836300503000523102802836300535e005231028028363005028007028", + "0x563e02835f00536300535f00504f02825704e00736300504e005356028", + "0x283630051c600501f0280283630050280070282550057fd028363007257", + "0x280300282510053630050310070100315d202802836300504e005231028", + "0x53630051b20057ba0281b20053630051b02510077b90281b0005363005", + "0x35f0070052500053630052500057bb02835f00536300535f00504f028250", + "0x536300502871702802836300525500563f028028363005028007028250", + "0x56e02824e00536300524e00503302824d03100736300503100535602824e", + "0x2802836300502800702823f2410077fe24324700736300724e24d35f031", + "0x73630050310053560281bb005363005028717028028363005243005231", + "0x1bd0073630071bb23a24703156e0281bb0053630051bb00503302823a031", + "0x281bd0053630051bd00504f02802836300502800702818e2390077ff1bf", + "0x57c702823b2380073630051bf1bd0077c60281bf0053630051bf005033", + "0x3630052360057c90280283630050280070281c400580023600536300723b", + "0x21a02822e0053630052300050b90282300053630052320057cf028232005", + "0x36300523800504f0281c900536300522c22e00722102822c005363005028", + "0x502800702802880100502804d0282240053630051c900501b028228005", + "0x700501f0280283630050100057d10280283630051c600501f028028363", + "0x507702802836300504e005231028028363005031005231028028363005", + "0x536300523800504f0280283630052250053460282202250073630051c4", + "0x36300502800702802880200502804d02821e00536300522000522d02821f", + "0x504e0052310280283630051c600501f02802836300518e005231028028", + "0x3100523102802836300500700501f0280283630050100057d1028028363", + "0x501b02821a00536300502860b0281cf005363005028020028028363005", + "0x36300523900504f02822100536300521a1cf00735c02821a00536300521a", + "0x502800702802880200502804d02821e00536300522100522d02821f005", + "0x535602824100536300524100504f02802836300523f005231028028363", + "0x52182410077c6028218005363005218005033028218031007363005031", + "0x3630050280070281d40058032150053630072170057c70282171d1007363", + "0x50b90282130053630051d60057cf0281d60053630052150057c9028028", + "0x53630051d800501b0282280053630051d100504f0281d8005363005213", + "0x502800702820b20c00780421621100736300703104e228031734028224", + "0x2820a00536300520a00501b02820a0053630052241c6007221028028363", + "0x300282080053630052162090100315d202820900536300520a0070072ee", + "0x3630052060057ba0282060053630052072080077b9028207005363005028", + "0x70051df0053630051df0057bb02821100536300521100504f0281df005", + "0x51c600501f02802836300520b0052310280283630050280070281df211", + "0x700501f0280283630050100057d102802836300522400501f028028363", + "0x501b0281ff005363005028740028201005363005028020028028363005", + "0x53630050280230281fd0053630051ff20100735c0281ff0053630051ff", + "0x4f0281f10053630051f80057da0281f80053630051fd1fb00702d0281fb", + "0x70281f120c0070051f10053630051f10057bb02820c00536300520c005", + "0x1f0280283630050100057d10280283630051c600501f028028363005028", + "0x2802836300504e005231028028363005031005231028028363005007005", + "0x51d100504f0280283630051ec0053460280001ec0073630051d4005077", + "0x2d02856600536300502802302821e00536300500000522d02821f005363", + "0x521f00504f0285680053630055670057da02856700536300521e566007", + "0x36300502800702856821f0070055680053630055680057bb02821f005363", + "0x500700501f0280283630050100057d1028028363005018005231028028", + "0x310052310280283630051c600501f02802836300504e005231028028363", + "0x501b02856a005363005028740028569005363005028020028028363005", + "0x536300502802302856c00536300556a56900735c02856a00536300556a", + "0x4f02857000536300556e0057da02856e00536300556c56d00702d02856d", + "0x3610285700170070055700053630055700057bb028017005363005017005", + "0x702809204f00780500b00a007363007005028007005028028363005028", + "0x1000536300500700580602800f00536300500b005031028028363005028", + "0x1000580702800f00536300500f00509202800a00536300500a00504f028", + "0x36300500f00503102802836300502800702801300580804e1c6007363007", + "0x38602803000536300504d00580a02804d00536300504e005809028014005", + "0x501703100735c02801700536300501700501b028017005363005030005", + "0x2800a00536300500a00504f0283610053630051c60055e2028018005363", + "0x501800522d0283610053630053610055e4028014005363005014005092", + "0x1b36003100501c01b36003136300501836101400a00a365028018005363", + "0x36300500f0050310280283630050130055e502802836300502800702801c", + "0x2d802801f00536300535e0310072d602835e00536300502803002835f005", + "0x36300535f00509202800a00536300500a00504f02802000536300501f005", + "0x36300502800702802035f00a0310050200053630050200052d302835f005", + "0x509200503102802836300503100504002802836300500700580b028028", + "0x501b02802300536300502804602835c00536300502802002835d005363", + "0x536300502802302802d00536300502335c00735c028023005363005023", + "0x4f0280840053630050c00052d20280c000536300502d35b00702d02835b", + "0x3630050840052d302835d00536300535d00509202804f00536300504f005", + "0x700700500f02800700536300500500500a02808435d04f031005084005", + "0x536300500a00501002802836300502800702800b00580c00a031007363", + "0x501b02803100536300503100501302809200536300504f0051c602804f", + "0x280070281c600580d01000f00736300703100500f028092005363005092", + "0x2801300536300500f00501302804e005363005010005256028028363005", + "0x2802836300502800702802880e00502804d02801400536300504e005258", + "0x3630051c600501302803000536300504d00505002804d005363005028030", + "0x28017013007363005013005071028014005363005030005258028013005", + "0x702836000580f361005363007014005009028018005363005017005219", + "0x1c00536300501b0051c602801b005363005361005010028028363005028", + "0x581035e35f00736300701c02800708602801c00536300501c00501b028", + "0x36300535f00504f02802836300501800524202802836300502800702801f", + "0x2836300502800702835c00581135d02000736300701300500f02835f005", + "0x2300525802802d00536300502000501302802300536300535d005256028", + "0x502803002802836300502800702802881200502804d02835b005363005", + "0x2802d00536300535c0050130280840053630050c00050500280c0005363", + "0x735b00500902835900536300502d00521902835b005363005084005258", + "0x320053630051a80050100280283630050280070283570058131a8005363", + "0x35f0070ac02835600536300535600501b0283560053630050320051c6028", + "0x3181502802836300502800702803603c00c031814033364007363007356", + "0x536400504f02821900536300504000581602804000536300503335e092", + "0x521900536300521900581702835900536300535900505b028364005363", + "0x530a02802836300503c00530a028028363005028007028219359364031", + "0x4f02802836300535e00508e02802836300509200501f028028363005036", + "0x4702802836300502800702802881800502804d02821d00536300500c005", + "0x2802836300535e00508e02802836300509200501f028028363005357005", + "0x36300522700581902822700536300502803002821d00536300535f00504f", + "0x3100522d00536300522d00581702835900536300535900505b02822d005", + "0x1300501c02802836300509200501f02802836300502800702822d35921d", + "0x2800702802881a00502804d02823100536300501f00504f028028363005", + "0x501c02802836300509200501f028028363005360005047028028363005", + "0x2804600536300502803002823100536300502800504f028028363005013", + "0x504800581702801800536300501800505b028048005363005046005819", + "0x5363005028030028028363005028007028048018231031005048005363", + "0x504f02824200536300504700581902804500536300500b005219028047", + "0x536300524200581702804500536300504500505b028028005363005028", + "0x36300502881b02800a03100736300500700519c028242045028031005242", + "0x4f03136300500b0310280317ca02800b00536300500b00581c02800b005", + "0x36300502800702804e00581e1c601000736300709204f00781d02800f092", + "0x2836300502800702804d00581f01401300736300700f01000781d028028", + "0x81b0280170053630051c603000726b02803000536300501400500726b028", + "0x501800a0130317ca02801800536300501800581c028018005363005028", + "0x36300736036100781d02801700536300501700518c02801b360361031363", + "0x736300701b01c00781d02802836300502800702835e00582035f01c007", + "0x35c00536300502001700726b02802836300502800702835d00582102001f", + "0x2300771d02802d00536300502803002802300536300535f35c00726b028", + "0x536300501f00504f0280c000536300535b00571e02835b00536300502d", + "0x280283630050280070280c001f0070050c00053630050c000570502801f", + "0x8400536300502802002802836300535f00508e02802836300501700527e", + "0x35908400735c02835900536300535900501b02835900536300502824b028", + "0x320053630051a800522d02835700536300535d00504f0281a8005363005", + "0x2802836300501700527e02802836300502800702802882200502804d028", + "0x36400536300502824b02835600536300502802002802836300501b00530a", + "0x504f02803300536300536435600735c02836400536300536400501b028", + "0xc00536300502802302803200536300503300522d02835700536300535e", + "0x504f02803600536300503c00570402803c00536300503200c00702d028", + "0x28007028036357007005036005363005036005705028357005363005357", + "0x508e02802836300500500527e02802836300500a00530a028028363005", + "0x1b02821900536300502824b0280400053630050280200280283630051c6", + "0x504d00504f02821d00536300521904000735c028219005363005219005", + "0x2800702802882300502804d02822d00536300521d00522d028227005363", + "0x530a02802836300500500527e02802836300500a00530a028028363005", + "0x1b02804600536300502824b02823100536300502802002802836300500f", + "0x504e00504f02804800536300504623100735c028046005363005046005", + "0x2d02804700536300502802302822d00536300504800522d028227005363", + "0x522700504f02824200536300504500570402804500536300522d047007", + "0x363005028361028242227007005242005363005242005705028227005363", + "0x36300502800702809204f00782400b00a007363007005028007005028028", + "0x310053560280100053630050285a202800f00536300500b005031028028", + "0x536300500f00509202800a00536300500a00504f0281c6031007363005", + "0x50310280283630050280070280288250283630070101c600714e02800f", + "0x1300536300501300532c02801300536300502836f02804e00536300500f", + "0x4d00503302804d0053630050285a202801400536300501300700726b028", + "0x1400536300501400518c02804e00536300504e00509202804d005363005", + "0x36300502800702836101800782601703000736300704d03100a03156e028", + "0x509202803000536300503000504f02836000536300504e005031028028", + "0x536300501700503302801400536300501400518c028360005363005360", + "0x2835f01c01b03100535f01c01b03136300501701436003000a71a028017", + "0x2802836300501400527e028028363005361005231028028363005028007", + "0x536300502860b02801f00536300502802002835e00536300504e005031", + "0x2302835d00536300502001f00735c02802000536300502000501b028020", + "0x36300502300570402802300536300535d35c00702d02835c005363005028", + "0x70502835e00536300535e00509202801800536300501800504f02802d005", + "0x523102802836300502800702802d35e01803100502d00536300502d005", + "0x280c000536300502871b02835b00536300500f005031028028363005031", + "0x50280300280840053630050c000700726b0280c00053630050c000532c", + "0x3570053630051a800571e0281a800536300535908400771d028359005363", + "0x35700570502835b00536300535b00509202800a00536300500a00504f028", + "0x500700527e02802836300502800702835735b00a031005357005363005", + "0x28020028032005363005092005031028028363005031005231028028363", + "0x2836400536300536400501b028364005363005028046028356005363005", + "0x3300c00702d02800c00536300502802302803300536300536435600735c", + "0x4f00536300504f00504f02803600536300503c00570402803c005363005", + "0x3204f031005036005363005036005705028032005363005032005092028", + "0x3100582702836300700700534202800700500736300500500538d028036", + "0x536300502800525c02802836300500500501f028028363005028007028", + "0x28032028028363005031005340028028363005028007028028005005028", + "0x536300500a02800725f02800a00536300500a00503302800a005363005", + "0x732602809200500736300500500538d02804f00536300502824a02800b", + "0x36300500b00525c02800f00536300500f00501b02800f00536300504f092", + "0x1f02802836300502800702801000582802836300700f00534202800b005", + "0x502800702800b00500500b00536300500b00525c028028363005005005", + "0x1c60050330281c6005363005028032028028363005010005340028028363", + "0x1300536300502816f02804e0053630051c600b00725f0281c6005363005", + "0x1b02804d00536300501301400732602801400500736300500500538d028", + "0x36300704d00534202804e00536300504e00525c02804d00536300504d005", + "0x525c02802836300500500501f028028363005028007028030005829028", + "0x36300503000534002802836300502800702804e00500504e00536300504e", + "0x4e00725f028017005363005017005033028017005363005028032028028", + "0x500736300500500538d02836100536300502882a028018005363005017", + "0x25c02801b00536300501b00501b02801b005363005361360007326028360", + "0x502800702801c00582b02836300701b005342028018005363005018005", + "0x1800500501800536300501800525c02802836300500500501f028028363", + "0x35f00536300502803202802836300501c005340028028363005028007028", + "0x2882c02835e00536300535f01800725f02835f00536300535f005033028", + "0x36300501f02000732602802000500736300500500538d02801f005363005", + "0x34202835e00536300535e00525c02835d00536300535d00501b02835d005", + "0x36300500500501f02802836300502800702835c00582d02836300735d005", + "0x34002802836300502800702835e00500535e00536300535e00525c028028", + "0x2300536300502300503302802300536300502803202802836300535c005", + "0x500538d02835b00536300502882e02802d00536300502335e00725f028", + "0x36300508400501b02808400536300535b0c00073260280c0005007363005", + "0x35900582f02836300708400534202802d00536300502d00525c028084005", + "0x536300502d00525c02802836300500500501f028028363005028007028", + "0x2803202802836300535900534002802836300502800702802d00500502d", + "0x53630051a802d00725f0281a80053630051a80050330281a8005363005", + "0x732602835600500736300500500538d028032005363005028830028357", + "0x36300535700525c02836400536300536400501b028364005363005032356", + "0x1f028028363005028007028033005831028363007364005342028357005", + "0x502800702835700500535700536300535700525c028028363005005005", + "0xc00503302800c005363005028032028028363005033005340028028363", + "0x360053630050285f502803c00536300500c35700725f02800c005363005", + "0x1b02821900536300503604000732602804000500736300500500538d028", + "0x36300721900534202803c00536300503c00525c028219005363005219005", + "0x525c02802836300500500501f02802836300502800702821d005832028", + "0x36300521d00534002802836300502800702803c00500503c00536300503c", + "0x3c00725f028227005363005227005033028227005363005028032028028", + "0x500736300500500538d02823100536300502883302822d005363005227", + "0x25c02804800536300504800501b028048005363005231046007326028046", + "0x502800702804700583402836300704800534202822d00536300522d005", + "0x22d00500522d00536300522d00525c02802836300500500501f028028363", + "0x45005363005028032028028363005047005340028028363005028007028", + "0x2883502824200536300504522d00725f028045005363005045005033028", + "0x36300524624900732602824900500736300500500538d028246005363005", + "0x34202824200536300524200525c02824a00536300524a00501b02824a005", + "0x36300500500501f02802836300502800702824b00583602836300724a005", + "0x34002802836300502800702824200500524200536300524200525c028028", + "0x24c00536300524c00503302824c00536300502803202802836300524b005", + "0x500538d02825200536300502833302824f00536300524c24200725f028", + "0x36300525600501b028256005363005252253007326028253005007363005", + "0x25800583702836300725600534202824f00536300524f00525c028256005", + "0x536300524f00525c02802836300500500501f028028363005028007028", + "0x2803202802836300525800534002802836300502800702824f00500524f", + "0x536300505024f00725f028050005363005050005033028050005363005", + "0x732602805800500736300500500538d02805b005363005028838028009", + "0x36300500900525c02805900536300505900501b02805900536300505b058", + "0x1f02802836300502800702805c005839028363007059005342028009005", + "0x502800702800900500500900536300500900525c028028363005005005", + "0x26c00503302826c00536300502803202802836300505c005340028028363", + "0x2770053630050282e502827500536300526c00900725f02826c005363005", + "0x1b02806000536300527705e00732602805e00500736300500500538d028", + "0x36300706000534202827500536300527500525c028060005363005060005", + "0x525c02802836300500500501f02802836300502800702805f00583a028", + "0x36300505f005340028028363005028007028275005005275005363005275", + "0x27500725f02805d00536300505d00503302805d005363005028032028028", + "0x500736300500500538d0282bc00536300502883b0282af00536300505d", + "0x25c02806700536300506700501b0280670053630052bc042007326028042", + "0x502800702830600583c0283630070670053420282af0053630052af005", + "0x2af0050052af0053630052af00525c02802836300500500501f028028363", + "0x69005363005028032028028363005306005340028028363005028007028", + "0x2883d0280680053630050692af00725f028069005363005069005033028", + "0x36300500606f00732602806f00500736300500500538d028006005363005", + "0x34202806800536300506800525c02807100536300507100501b028071005", + "0x36300500500501f02802836300502800702834700583e028363007071005", + "0x34002802836300502800702806800500506800536300506800525c028028", + "0x74005363005074005033028074005363005028032028028363005347005", + "0x500732602807700536300502824602807500536300507406800725f028", + "0x536300507500525c02834600536300534600501b028346005363005077", + "0x525c02802836300502800702834500583f028363007346005342028075", + "0x363005345005340028028363005028007028075005005075005363005075", + "0x7500725f028043005363005043005033028043005363005028032028028", + "0xa00575702807a00500507a00536300507a00525c02807a005363005043", + "0x700500a84002800f00b00736300500b00522402809204f00b031363005", + "0x2802836300502800702804d01401303184104e1c601003136300709200f", + "0x504e005236028030005363005010005031028010005363005010005092", + "0x280300053630050300050920281c60053630051c60050c002804e005363", + "0x3000503102802836300502800702801800584201700536300704e0051c4", + "0x9202801b005363005028844028360005363005028843028361005363005", + "0x36300501b005182028360005363005360005182028361005363005361005", + "0x35d02001f03184535e35f01c03136300701b3601c636100a18e02801b005", + "0x36300501c00503102801c00536300501c005092028028363005028007028", + "0x9202835f00536300535f0050c002835e00536300535e00523602835c005", + "0x2800702802d00584602300536300735e0051c402835c00536300535c005", + "0x7930280c000536300502884702835b00536300535c005031028028363005", + "0x535b0050920280840053630050840057940280840c00073630050c0005", + "0xc0333643560323571a83591c636300708400b02803179502835b005363", + "0x536300535b00503102802836300502800702821d21904003184803603c", + "0x2823100536300503c22d00728802822d005363005036359007288028227", + "0x728802804800536300503304600728802804600536300500c231007288", + "0x32045007288028045005363005356047007288028047005363005364048", + "0x53630051a8005797028246005363005357242007288028242005363005", + "0x522402803100536300503100518202824600536300524600504f028249", + "0x24a03124603179802824a00536300524a00518202824a249007363005249", + "0x36300524f00579402824f0c00073630050c000579302824c24b007363005", + "0x2805805b00905025825625325200f36300524f24c24b03179902824f005", + "0x5b05900728802805900536300505825200728802802836300525300579a", + "0x36300505026c00728802826c00536300500905c00728802805c005363005", + "0x19c02805e005363005028760028277005363005258275007288028275005", + "0x5f0053080282af05d00736300525600519c02805f06000736300505e005", + "0x3630072af05f27703117502822700536300522700509202805f005363005", + "0x53630052270050310280283630050280070283060670078490422bc007", + "0x2bc00504f02800600536300506800533f028068005363005028030028069", + "0x34700536300504200530802807100536300506900509202806f005363005", + "0x2836300502800702802884a00502804d02807400536300500600507d028", + "0x5077005081028077005363005028030028075005363005227005031028", + "0x2807100536300507500509202806f00536300506700504f028346005363", + "0x506000530802807400536300534600507d028347005363005306005308", + "0x702807907a00784b04334500736300705d06006f031175028060005363", + "0x34200536300534500504f02807f005363005071005031028028363005028", + "0x34700530802807d00536300504300530802808100536300507f005092028", + "0x7100503102802836300502800702802884c00502804d028340005363005", + "0x2833e00536300533e00530802833e00536300502817202833f005363005", + "0x784d33c33d00736300733e34707a03117502833f00536300533f005092", + "0x33d00504f02808c00536300533f00503102802836300502800702833733b", + "0x7d00536300507900530802808100536300508c005092028342005363005", + "0x2833500584e3360053630070740052cd02834000536300533c005308028", + "0x8a005363005081005031028028363005336005047028028363005028007", + "0x24900518202804f00536300504f00518202834200536300534200504f028", + "0x50c000579402833333400736300524904f342031798028249005363005", + "0x32d36f08e08633033133208800f3630050c03333340317990280c0005363", + "0x32c00728802832c00536300532d08800728802802836300533200579a028", + "0x508632a00728802832a00536300508e32b00728802832b00536300536f", + "0x536300534007d007279028328005363005330329007288028329005363", + "0x504f02832700536300532700518202808a00536300508a005092028327", + "0x3185032508b32603136300732702335f08a00a84f028328005363005328", + "0x5031028326005363005326005092028028363005028007028320323324", + "0x5363005325005776028085005363005085005092028085005363005326", + "0x2809631e09803185131f09509303136300733101708b08500a84f028325", + "0x5363005093005031028093005363005093005092028028363005028007", + "0xa85202831f00536300531f00577602831d00536300531d00509202831d", + "0x36300502800702831631731803185331931a31c03136300731f32509531d", + "0x585402831500536300531c00503102831c00536300531c005092028028", + "0x5363005313005856028313005363005314005855028314005363005319", + "0x50c002831500536300531500509202832800536300532800504f028312", + "0x2831231a31532800a00531200536300531200585702831a00536300531a", + "0x5363005318005031028318005363005318005092028028363005028007", + "0x585802830e00536300531630f00702d02830f005363005028023028311", + "0x536300531100509202832800536300532800504f02830c00536300530e", + "0x32800a00530c00536300530c0058570283170053630053170050c0028311", + "0x9800509202802836300532500523202802836300502800702830c317311", + "0x2830b0053630050280230280a9005363005098005031028098005363005", + "0x32800504f0280ac0053630050b00058580280b000536300509630b00702d", + "0x31e00536300531e0050c00280a90053630050a9005092028328005363005", + "0x283630050280070280ac31e0a932800a0050ac0053630050ac005857028", + "0x363005324005092028028363005331005268028028363005017005232028", + "0x702d02830800536300502802302830a005363005324005031028324005", + "0x36300532800504f0280b60053630050b40058580280b4005363005320308", + "0x8570283230053630053230050c002830a00536300530a005092028328005", + "0x470280283630050280070280b632330a32800a0050b60053630050b6005", + "0x2802836300501700523202802836300507d00530a028028363005335005", + "0x283630050c00057ad02802836300502300523202802836300534000530a", + "0x36300508100503102802836300504f005268028028363005249005268028", + "0x4d0283030053630053050050920280b900536300534200504f028305005", + "0x530a02802836300533700530a028028363005028007028028859005028", + "0x23202802836300507400533e028028363005017005232028028363005079", + "0x280283630052490052680280283630050c00057ad028028363005023005", + "0x36300533b00504f02830200536300533f00503102802836300504f005268", + "0x2885a0283010053630050280200283030053630053020050920280b9005", + "0x536300530030100735c02830000536300530000501b028300005363005", + "0x58580280bf0053630052ff2fe00702d0282fe0053630050280230282ff", + "0x53630053030050920280b90053630050b900504f0282fd0053630050bf", + "0xb900a0052fd0053630052fd00585702835f00536300535f0050c0028303", + "0x310052680280283630050170052320280283630050280070282fd35f303", + "0x57ad02802836300502300523202802836300504f005268028028363005", + "0x536300521d0400072880282fc00536300535b0050310280283630050c0", + "0x2824b02838b0053630050280200280510053630052192fb0072880282fb", + "0x536300538c38b00735c02838c00536300538c00501b02838c005363005", + "0x585802838f00536300538d0dc00702d0280dc00536300502802302838d", + "0x53630052fc00509202805100536300505100504f0280c700536300538f", + "0x5100a0050c70053630050c700585702835f00536300535f0050c00282fc", + "0xb00526802802836300502d0050470280283630050280070280c735f2fc", + "0x5268028028363005031005268028028363005017005232028028363005", + "0x280c90053630050280200280c600536300535c00503102802836300504f", + "0x50cb0c900735c0280cb0053630050cb00501b0280cb00536300502824b", + "0x2839000536300535f0050c00282fa0053630050c60050920280cf005363", + "0x2802836300502800702802885b00502804d0283070053630050cf00522d", + "0x2836300503100526802802836300501700523202802836300500b005268", + "0x501f00503102801f00536300501f00509202802836300504f005268028", + "0x283900053630050200050c00282fa005363005391005092028391005363", + "0x53072f400702d0282f400536300502802302830700536300535d00522d", + "0x2802800536300502800504f0282f30053630050d40058580280d4005363", + "0x52f30058570283900053630053900050c00282fa0053630052fa005092", + "0x500b0052680280283630050280070282f33902fa02800a0052f3005363", + "0x3000503102802836300504f005268028028363005031005268028028363", + "0x2f100536300539200585502839200536300501800585c0280d5005363005", + "0xd500509202802800536300502800504f0282f00053630052f1005856028", + "0x2f00053630052f00058570281c60053630051c60050c00280d5005363005", + "0x2802836300500b0052680280283630050280070282f01c60d502800a005", + "0x536300501300509202802836300504f005268028028363005031005268", + "0xda00702d0280da0053630050280230282ea005363005013005031028013", + "0x536300502800504f0282e50053630052e70058580282e700536300504d", + "0x58570280140053630050140050c00282ea0053630052ea005092028028", + "0x5f02804f00536300502885d0282e50142ea02800a0052e50053630052e5", + "0x3122502802836300502836102802836300502824f02800f005363005028", + "0x36300502800702804d01401303185e04e1c609201000a36300700a031005", + "0x785f028030005363005010005031028010005363005010005092028028", + "0x501800586102836101800736300501700586002801700536300504e1c6", + "0x864028360005363005361005863028361005363005361005862028028363", + "0x536300501b00518902801c00536300502818502801b005363005360005", + "0x530102803000536300503000509202802800536300502800504f02835f", + "0x536300501c00518c02835f00536300535f00518a028007005363005007", + "0x36300501c35f00703002800b86502809200536300509200f00730602801c", + "0x36300702000519302800b00536300500b04f00786602802000b01f35e00a", + "0x2802300536300501f00503102802836300502800702835c00586735d005", + "0xc000504702802836300502d0051940280c035b02d03136300535d005192", + "0x504f02835900536300502803202808400536300502836f028028363005", + "0x536300535b00518c02802300536300502300509202835e00536300535e", + "0xb19502835900536300535900503302808400536300508400532c02835b", + "0x8683560053630070320052710280323571a803136300535908435b02335e", + "0x35600518d028033005363005357005031028028363005028007028364005", + "0x3600736300500c00527202802836300503c00504702803c00c007363005", + "0x3300509202821900536300504000526e02802836300503600527e028040", + "0x4623103186922d22721d03136300721909203303119a028033005363005", + "0x521d00503102821d00536300521d005092028028363005028007028048", + "0x24200536300524200530802824204500736300522d00519c028047005363", + "0x86a02804500536300504500530802824924600736300524200b00786a028", + "0x524b00530802824c00536300502886b02824b24a007363005045246007", + "0x3136300524c24b1a80317ca02824c00536300524c00581c02824b005363", + "0xb90282560053630052530050b902802836300525200530a02825325224f", + "0x36300505025600722102805000536300502821a028258005363005249005", + "0x2ee02825800536300525800501b02800900536300500900501b028009005", + "0x505800586c02805800536300505b0051d402805b005363005258009007", + "0x2824f00536300524f00504f02805c00536300505900586d028059005363", + "0x52270050c002824a00536300524a005301028047005363005047005092", + "0x702805c22724a04724f00b00505c00536300505c00586e028227005363", + "0x26c005363005231005031028231005363005231005092028028363005028", + "0x460050c002827700536300526c0050920282750053630051a800504f028", + "0x702802886f00502804d02806000536300504800522d02805e005363005", + "0x5d00736300536400507702805f005363005357005031028028363005028", + "0x5f0050920282750053630051a800504f02802836300505d0053460282af", + "0x600053630052af00522d02805e0053630050920050c0028277005363005", + "0x2bc00536300501f00503102802836300502800702802886f00502804d028", + "0x35e00504f02802836300504200534602806704200736300535c005077028", + "0x5e0053630050920050c00282770053630052bc005092028275005363005", + "0x6030600702d02830600536300502802302806000536300506700522d028", + "0x27500536300527500504f028068005363005069005870028069005363005", + "0x5e0050c002800b00536300500b005301028277005363005277005092028", + "0x2806805e00b27727500b00506800536300506800586e02805e005363005", + "0x2802836300500f00504202802836300504f005871028028363005028007", + "0x363005028023028006005363005013005031028013005363005013005092", + "0x2834700536300507100587002807100536300504d06f00702d02806f005", + "0x500700530102800600536300500600509202802800536300502800504f", + "0x534700536300534700586e0280140053630050140050c0028007005363", + "0x500700519c02800a03100736300500500519c02834701400700602800b", + "0x736300500b00517402809203100736300503100517402804f00b007363", + "0x36300504e02800728802804e1c601003136300500f09200714602800f00b", + "0x4d03136300501403100714602801404f00736300504f005174028013005", + "0x7363007030010018031287028018005363005017013007288028017030", + "0x2835f00536300502887302802836300502800702801c01b007872360361", + "0x535f00587402801f00536300536000530802835e00536300536100504f", + "0x36300502887602802836300502800702802887500502804d028020005363", + "0x87402801f00536300501c00530802835e00536300501b00504f02835d005", + "0xb35c00714602835c00a00736300500a00517402802000536300535d005", + "0x1f0c00312870280c000536300535b35e00728802835b02d023031363005", + "0x50288730280283630050280070283571a800787735908400736300702d", + "0x2836400536300535900530802835600536300508400504f028032005363", + "0x2802836300502800702802887800502804d028033005363005032005874", + "0x3630053570053080283560053630051a800504f02800c005363005028876", + "0x3c00736300702304d35603128702803300536300500c005874028364005", + "0x4f02821d005363005028873028028363005028007028219040007879036", + "0x36300521d00587402822d00536300503600530802822700536300503c005", + "0x536300502887602802836300502800702802887a00502804d028231005", + "0x587402822d00536300521900530802822700536300504000504f028046", + "0x22700728802804504704803136300504f00a007146028231005363005046", + "0x24b24a00787b24924600736300704722d242031287028242005363005045", + "0x536300524600504f02824c005363005028873028028363005028007028", + "0x2804d02825300536300524c00587402825200536300524900530802824f", + "0x24a00504f02825600536300502887602802836300502800702802887c005", + "0x25300536300525600587402825200536300524b00530802824f005363005", + "0x530802805000536300525800587e02825800536300503302000787d028", + "0x5905800787f05b00900736300705025224f031287028050005363005050", + "0x536300500900504f02805c005363005028873028028363005028007028", + "0x2804d02827700536300505c00587402827500536300505b00530802826c", + "0x5800504f02805e005363005028876028028363005028007028028880005", + "0x27700536300505e00587402827500536300505900530802826c005363005", + "0x788202806000536300506000588102806000536300525323100787d028", + "0x36300505d00530802805d00536300505f00588302805f005363005277060", + "0x280070280670420078842bc2af00736300705d04826c03128702805d005", + "0x280690053630052bc0053080283060053630052af00504f028028363005", + "0x2830600536300504200504f02802836300502800702802888500502804d", + "0x4f0280680053630050692753641c600a886028069005363005067005308", + "0x888028068306007005068005363005068005887028306005363005306005", + "0x588a02802836300502800702800a005889031007007363007005028007", + "0x536300500700504f02800b00536300500b00588b02800b005363005031", + "0x589001000588f00f00588e09200588d04f00536301700b00588c028007", + "0x89701700589603000589504d00589401400589301300589204e0058911c6", + "0x2836300502800702801c00589b01b00589a360005899361005898018005", + "0x36300535f00581c02835f00536300502889c02802836300504f005047028", + "0x36300509200504702802836300502800702802889d00502804d02835e005", + "0x502804d02835e00536300501f00581c02801f00536300502889e028028", + "0x36300502889f02802836300500f00504702802836300502800702802889d", + "0x502800702802889d00502804d02835e00536300502000581c028020005", + "0x35d00581c02835d0053630050288a0028028363005010005047028028363", + "0x1c600504702802836300502800702802889d00502804d02835e005363005", + "0x4d02835e00536300535c00581c02835c00536300502886b028028363005", + "0x288a102802836300504e00504702802836300502800702802889d005028", + "0x702802889d00502804d02835e00536300502300581c028023005363005", + "0x81c02802d0053630050288a2028028363005013005047028028363005028", + "0x4702802836300502800702802889d00502804d02835e00536300502d005", + "0x35e00536300535b00581c02835b0053630050288a3028028363005014005", + "0x2802836300504d00504702802836300502800702802889d00502804d028", + "0x2889d00502804d02835e0053630050c000581c0280c000536300502881b", + "0x840053630050288a4028028363005030005047028028363005028007028", + "0x2836300502800702802889d00502804d02835e00536300508400581c028", + "0x36300535900581c0283590053630050288a5028028363005017005047028", + "0x36300501800504702802836300502800702802889d00502804d02835e005", + "0x502804d02835e0053630051a800581c0281a80053630050288a6028028", + "0x3630050288a702802836300536100504702802836300502800702802889d", + "0x502800702802889d00502804d02835e00536300535700581c028357005", + "0x3200581c0280320053630050288a8028028363005360005047028028363", + "0x1b00504702802836300502800702802889d00502804d02835e005363005", + "0x4d02835e00536300535600581c0283560053630050288a9028028363005", + "0x288aa02802836300501c00504702802836300502800702802889d005028", + "0x3300536300535e0058ab02835e00536300536400581c028364005363005", + "0xc0058ad02800700536300500700504f02800c0053630050330058ac028", + "0x536300502802002802836300502800702800c00700700500c005363005", + "0x3c00735c02803600536300503600501b0280360053630050288ae02803c", + "0x536300504021900702d028219005363005028023028040005363005036", + "0x58ad02800a00536300500a00504f02822700536300521d00539302821d", + "0x502800700502802836300502836102822700a007005227005363005227", + "0x504f00503102802836300502800702800f0920078af04f00b007363007", + "0x504f02802836300502800b0281c600536300503100562b028010005363", + "0x73630071c600562c02801000536300501000509202800b00536300500b", + "0x2804d0053630050100050310280283630050280070280140058b001304e", + "0x504e00562f02801700536300504d00509202803000536300501300562e", + "0x280070280288b100502804d028361005363005030005630028018005363", + "0x63102801b005363005028030028360005363005010005031028028363005", + "0x36300501400562f02801700536300536000509202801c00536300501b005", + "0x63302835f00536300501800518902836100536300501c005630028018005", + "0x36300502836102802836300502800702801f0058b235e005363007361005", + "0x563502835d00536300535e005634028020005363005017005031028028", + "0x536300500700530102800b00536300500b00504f02835c00536300535d", + "0xa8b302835c00536300535c00518202800a00536300500a00518c028007", + "0x27102802000536300502000509202835b02d02303136300535c00a00700b", + "0x50200050310280283630050280070280840058b40c000536300735b005", + "0x280283630053570050470283571a80073630050c000518d028359005363", + "0x502d00530102835900536300535900509202802300536300502300504f", + "0x281a80053630051a800518c02835f00536300535f00518a02802d005363", + "0x3336435603200a00503336435603200a3630051a835f02d35902300b865", + "0x536300502000503102802836300535f005194028028363005028007028", + "0x509202802300536300502300504f02803c00536300508400563702800c", + "0x536300503c00563802802d00536300502d00530102800c00536300500c", + "0x2802836300502836102802836300502800702803c02d00c02300a00503c", + "0x536300502803002803600536300501700503102802836300501f005047", + "0x2821d00536300521900563a02821900536300504000a35f031639028040", + "0x500700530102803600536300503600509202800b00536300500b00504f", + "0x2800702821d00703600b00a00521d00536300521d005638028007005363", + "0x503102802836300500a00527e028028363005031005194028028363005", + "0x2823100536300502804602822d00536300502802002822700536300500f", + "0x502802302804600536300523122d00735c02823100536300523100501b", + "0x4500536300504700563702804700536300504604800702d028048005363", + "0x700530102822700536300522700509202809200536300509200504f028", + "0x19c02804500722709200a005045005363005045005638028007005363005", + "0x2881b02809204f00736300500b00500786a02800b00a007363005031005", + "0xf00536300500f00581c02809200536300509200530802800f005363005", + "0x4f00536300504f00530102804e1c601003136300500f0920280317ca028", + "0x2802836300502800702804d0058b50140130073630071c601000781d028", + "0x26b0280283630050280070280180058b601703000736300704e01300781d", + "0x4f00786a02836000536300501436100726b028361005363005017007007", + "0x536300501c00530802835f00536300502881b02801c01b00736300500a", + "0x1f35e03136300535f01c0300317ca02835f00536300535f00581c02801c", + "0x781d02801b00536300501b00530102836000536300536000518c028020", + "0x35d00781d0280283630050280070280230058b735c35d00736300701f35e", + "0x35b36000726b0280283630050280070280c00058b835b02d007363007020", + "0x1a800536300502803002835900536300535c08400726b028084005363005", + "0x504f02803200536300535700571e0283570053630051a835900771d028", + "0x536300503200570502801b00536300501b00530102802d00536300502d", + "0x2802836300536000527e02802836300502800702803201b02d031005032", + "0x36400536300502824b02835600536300502802002802836300535c00508e", + "0x504f02803300536300536435600735c02836400536300536400501b028", + "0x280288b900502804d02803c00536300503300522d02800c0053630050c0", + "0x2802836300502000530a02802836300536000527e028028363005028007", + "0x536300504000501b02804000536300502824b028036005363005028020", + "0x22d02800c00536300502300504f02821900536300504003600735c028040", + "0x36300503c21d00702d02821d00536300502802302803c005363005219005", + "0x30102800c00536300500c00504f02822d005363005227005704028227005", + "0x2822d01b00c03100522d00536300522d00570502801b00536300501b005", + "0x2802836300500a00530a02802836300500700527e028028363005028007", + "0x4600536300502824b02823100536300502802002802836300501400508e", + "0x504f02804800536300504623100735c02804600536300504600501b028", + "0x280288ba00502804d02804500536300504800522d028047005363005018", + "0x2802836300500a00530a02802836300500700527e028028363005028007", + "0x24600536300502824b02824200536300502802002802836300504e00530a", + "0x504f02824900536300524624200735c02824600536300524600501b028", + "0x24a00536300502802302804500536300524900522d02804700536300504d", + "0x504f02824c00536300524b00570402824b00536300504524a00702d028", + "0x536300524c00570502804f00536300504f005301028047005363005047", + "0x70050281fd1d11ec02800a18a1d11ec02800a34524c04f04703100524c", + "0x1ec02800a0da0310070050281fd1d11ec02800a18a1d11ec02800a028031", + "0x1ec02800a18a1d11ec02800a1750310070050281fd1d11ec02800a18a1d1", + "0x70050281fd1d11ec02800a18a1d11ec02800a5f80310070050281fd1d1", + "0x1ec02800a8bc0310070050281fd1d11ec02800a18a1d11ec02800a8bb031", + "0x1ec02800a18a1d11ec02800a8bd0310070050281fd1d11ec02800a18a1d1", + "0x70050281fd1d11ec02800a18a1d11ec02800a8be0310070050281fd1d1", + "0x1ec02800a8c00310070050281fd1d11ec02800a18a1d11ec02800a8bf031", + "0x1ec02800a18a1d11ec02800a8c10310070050281fd1d11ec02800a18a1d1", + "0x70050281fd1d11ec02800a18a1d11ec02800a8c20310070050281fd1d1", + "0x1ec02800a8c40310070050281fd1d11ec02800a18a1d11ec02800a8c3031", + "0x1ec02800a18a1d11ec02800a8c50310070050281fd1d11ec02800a18a1d1", + "0x281fd1d11ec23f02800b18a1d11ec23f02800b8c60310070050281fd1d1", + "0x8c80310070050281fd1d11ec02800a18a1d11ec02800a8c700a031007005", + "0x18a1d11ec02800a8c90310070050281fd1d11ec02800a18a1d11ec02800a", + "0x1fd1d11ec02800a18a1d11ec02800a8ca0310070050281fd1d11ec02800a", + "0x70050281fd1d11ec04002800b18a1d11ec04002800b8cb031007005028", + "0x2800a8cd0310070050281fd1d11ec02800a18a1d11ec02800a8cc00a031", + "0x2800a18a1d11ec02800a8ce0310070050281fd1d11ec02800a18a1d11ec", + "0x50281fd1d11ec02800a18a1d11ec02800a8cf0310070050281fd1d11ec", + "0x2800a8d10310070050281fd1d11ec02800a18a1d11ec02800a8d0031007", + "0x2800a18a1d11ec02800a8d20310070050281fd1d11ec02800a18a1d11ec", + "0x1fd1d11ec02825500b18a1d11ec02825500b8d30310070050281fd1d11ec", + "0x1fd1d11ec04002825504f18a1d11ec04002825504f8d400a031007005028", + "0x70050281fd1d11ec02800a18a1d11ec02800a8d500b00a031007005028", + "0x8d700a0310070050281fd1d11ec25a02800b18a1d11ec25a02800b8d6031", + "0x2800a8d800a0310070050281fd1d11ec02825500b18a1d11ec02825500b", + "0x1d11ec0df0e30e10280928d90310070050281fd1d11ec02800a18a1d11ec", + "0xe102800b8da04f00b00a0310070050281fd1d11ec0df0e30e102809218a", + "0x18a1d11ec02800a8db00a0310070050281fd1d11ec0e102800b18a1d11ec", + "0x1fd1d11ec02800a18a1d11ec02800a8dc0310070050281fd1d11ec02800a", + "0x8de0310070050281fd1d11ec02800a18a1d11ec02800a8dd031007005028", + "0x18a1d11ec02800a8df0310070050281fd1d11ec02800a18a1d11ec02800a", + "0x1fd1d11ec02800a18a1d11ec02800a8e00310070050281fd1d11ec02800a", + "0xa0310070050282131ec02803100605918a1ec02800b8e1031007005028", + "0x5918a1ec02800a8e303100700502821a1ec02803118a0591ec02800a8e2", + "0x282281d11ec0310f82251b01d11ec00b8e403100700502821a1ec028031", + "0xa0310070050282281d11ec0312251941b01d11ec00b8e500a031007005", + "0xb00a0310070050282321d11ec02800a18908e18908e1d11ec0280928e6", + "0x2391ec02803118a1ec0280318e800502823818a02803118a0280078e704f", + "0x2823a1d11ec02800a00600600618d18e1b01d11ec0280108e9007005028", + "0x1ec0310060060060062251b01d11ec00f8ea00f09204f00b00a031007005", + "0x1ec23f02800a2411ec23f02800a8eb09204f00b00a0310070050281fd1d1", + "0x2800a8ed0070050282471ec02803100c1ec0280318ec031007005028243", + "0x2800a1b01d11ec02800a8ee0310070050282281d11ec02800a1b01d11ec", + "0x2281d10401ec02800b1b01d10401ec02800b8ef0310070050282281d11ec", + "0x310070050282281d11ec02800a1b01d11ec02800a8f000a031007005028", + "0x2800a8f200a0310070050282501d11ec02800a0591b01d11ec02800b8f1", + "0x1ec0280310061b01ec02800a8f30310070050282281ec0280310061b01ec", + "0x1d12551ec02800b0060060061b01d12551ec02800f8f4031007005028228", + "0x2804f2571b01d12550401ec0280928f509204f00b00a031007005028228", + "0x25a00a1b01d11ec25a00a8f604f00b00a0310070050282281d12550401ec", + "0x1d12551ec02800b0061b01d12551ec02804f8f70310070050282281d11ec", + "0xe10df0e302804f1b01ec0e10df0e302804f8f800b00a031007005028228", + "0x1b01d11ec04f8fa02823a0e10070e10058f900b00a0310070050282281ec", + "0x26b02800718a0280078fb00b00a0310070050282281d11ec031059006194", + "0xa8fd00a03100700502826d1ec02803100618218a1ec02800b8fc005028", + "0x280311851851ec02800a8fe0310070050282761ec02803118a18a1ec028", + "0x3100700502828a1ec02803116d1751ec02800a8ff0310070050282781ec", + "0x14902800a90100a03100700502828b1ec02803108108e16d1ec02800b900", + "0x1d11ec02800a14e14d1d11ec02800b902031007005028296028007081081", + "0x1d10401ec02800b06f2ae03c1d10401ec02809290300a03100700502829a", + "0x1ec02800a12003c03c03c1d11ec02809290404f00b00a0310070050282b0", + "0x2800a9060050280f80052fa2fa00790504f00b00a0310070050282bd1d1", + "0x21a1ec0280310593051ec02800a9070310070050282fd0280070810060b9", + "0x703c16d02803190900502831d18a02803118a028007908031007005028", + "0x90b03100700502828b1ec02803108116d1ec02800a90a00700502828b028", + "0x283461d11ec02800a2ae03c1d11ec02800b90c005028149005006149007", + "0x70050283471d10401ec02800b0741d10401ec02800b90d00a031007005", + "0x26c02800708102800790f0070050282af02800703c03c02803190e00a031", + "0x91100a03100700502828a0401ec02800a16d1750401ec02800b910005028", + "0x91203100700502828b04002803103c16d04002800a" ], "sierra_program_debug_info": { "type_names": [], @@ -8297,35 +9558,35 @@ "EXTERNAL": [ { "selector": "0x1143aa89c8e3ebf8ed14df2a3606c1cd2dd513fac8040b0f8ab441f5c52fe4", - "function_idx": 24 + "function_idx": 27 }, { "selector": "0x3541591104188daef4379e06e92ecce09094a3b381da2e654eb041d00566d8", - "function_idx": 33 + "function_idx": 36 }, { "selector": "0x3c118a68e16e12e97ed25cb4901c12f4d3162818669cc44c391d8049924c14", - "function_idx": 8 + "function_idx": 11 }, { "selector": "0x5562b3e932b4d139366854d5a2e578382e6a3b6572ac9943d55e7efbe43d00", - "function_idx": 20 + "function_idx": 23 }, { "selector": "0x600c98a299d72ef1e09a2e1503206fbc76081233172c65f7e2438ef0069d8d", - "function_idx": 25 + "function_idx": 28 }, { "selector": "0x62c83572d28cb834a3de3c1e94977a4191469a4a8c26d1d7bc55305e640ed5", - "function_idx": 21 + "function_idx": 24 }, { "selector": "0x679c22735055a10db4f275395763a3752a1e3a3043c192299ab6b574fba8d6", - "function_idx": 29 + "function_idx": 32 }, { "selector": "0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb", - "function_idx": 27 + "function_idx": 30 }, { "selector": "0xd47144c49bce05b6de6bce9d5ff0cc8da9420f8945453e20ef779cbea13ad4", @@ -8333,47 +9594,55 @@ }, { "selector": "0xe7510edcf6e9f1b70f7bd1f488767b50f0363422f3c563160ab77adf62467b", - "function_idx": 11 + "function_idx": 14 }, { "selector": "0xf818e4530ec36b83dfe702489b4df537308c3b798b0cc120e32c2056d68b7d", - "function_idx": 16 + "function_idx": 19 }, { "selector": "0x10d2fede95e3ec06a875a67219425c27c5bd734d57f1b221d729a2337b6b556", - "function_idx": 13 + "function_idx": 16 }, { "selector": "0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6", - "function_idx": 31 + "function_idx": 34 }, { "selector": "0x1469798554697a4c50c64f933147bd163500204d4ae206eee1a9b9bf6c228de", - "function_idx": 15 + "function_idx": 18 }, { "selector": "0x14dae1999ae9ab799bc72def6dc6e90890cf8ac0d64525021b7e71d05cb13e8", - "function_idx": 5 + "function_idx": 8 }, { "selector": "0x169f135eddda5ab51886052d777a57f2ea9c162d713691b5e04a6d4ed71d47f", - "function_idx": 14 + "function_idx": 17 }, { "selector": "0x1995689b6aedab51ad67bc2ae0b0ee3fe1ffc433f96179953e6a6b7210b9e13", - "function_idx": 6 + "function_idx": 9 }, { "selector": "0x1ae1a515cf2d214b29bdf63a79ee2d490efd4dd1acc99d383a8e549c3cecb5d", - "function_idx": 30 + "function_idx": 33 }, { "selector": "0x1e4089d1f1349077b1970f9937c904e27c4582b49a60b6078946dba95bc3c08", "function_idx": 4 }, + { + "selector": "0x227ac0f3ce8083231605cb10be915be2004456b618e44b56067e27fc6f8c84f", + "function_idx": 39 + }, { "selector": "0x23039bef544cff56442d9f61ae9b13cf9e36fcce009102c5b678aac93f37b36", - "function_idx": 7 + "function_idx": 10 + }, + { + "selector": "0x25ff849c52d40a7f29c9849fbe0064575d61c84ddc0ef562bf05bc599abe0ae", + "function_idx": 5 }, { "selector": "0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c", @@ -8385,43 +9654,51 @@ }, { "selector": "0x2d7cf5d5a324a320f9f37804b1615a533fde487400b41af80f13f7ac5581325", - "function_idx": 12 + "function_idx": 15 + }, + { + "selector": "0x2f8b66957adc4564548f3832947bf264a065874e087c21b9e7cf969e2874c0c", + "function_idx": 6 }, { "selector": "0x30f842021fbf02caf80d09a113997c1e00a32870eee0c6136bed27acb348bea", - "function_idx": 28 + "function_idx": 31 + }, + { + "selector": "0x311fb2a7f01403971aca6ae0a12b8ad0602e7a5ec48ad48951969942e99d788", + "function_idx": 7 }, { "selector": "0x31401f504973a5e8e1bb41e9c592519e3aa0b8cf6bbfb9c91b532aab8db54b0", - "function_idx": 34 + "function_idx": 37 }, { "selector": "0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f", - "function_idx": 26 + "function_idx": 29 }, { "selector": "0x32564d7e0fe091d49b4c20f4632191e4ed6986bf993849879abfef9465def25", - "function_idx": 22 + "function_idx": 25 }, { "selector": "0x3604cea1cdb094a73a31144f14a3e5861613c008e1e879939ebc4827d10cd50", - "function_idx": 9 + "function_idx": 12 }, { "selector": "0x382be990ca34815134e64a9ac28f41a907c62e5ad10547f97174362ab94dc89", - "function_idx": 17 + "function_idx": 20 }, { "selector": "0x38be5d5f7bf135b52888ba3e440a457d11107aca3f6542e574b016bf3f074d8", - "function_idx": 18 + "function_idx": 21 }, { "selector": "0x39a1491f76903a16feed0a6433bec78de4c73194944e1118e226820ad479701", - "function_idx": 35 + "function_idx": 38 }, { "selector": "0x3a6a8bae4c51d5959683ae246347ffdd96aa5b2bfa68cc8c3a6a7c2ed0be331", - "function_idx": 10 + "function_idx": 13 }, { "selector": "0x3b097c62d3e4b85742aadd0dfb823f96134b886ec13bda57b68faf86f294d97", @@ -8429,31 +9706,31 @@ }, { "selector": "0x3d3da80997f8be5d16e9ae7ee6a4b5f7191d60765a1a6c219ab74269c85cf97", - "function_idx": 32 + "function_idx": 35 }, { "selector": "0x3d95049b565ec2d4197a55108ef03996381d31c84acf392a0a42b28163d69d1", - "function_idx": 19 + "function_idx": 22 }, { "selector": "0x3eb640b15f75fcc06d43182cdb94ed38c8e71755d5fb57c16dd673b466db1d4", - "function_idx": 23 + "function_idx": 26 } ], "L1_HANDLER": [ { "selector": "0x205500a208d0d49d79197fea83cc3f5fde99ac2e1909ae0a5d9f394c0c52ed0", - "function_idx": 37 + "function_idx": 41 }, { "selector": "0x39edbbb129ad752107a94d40c3873cae369a46fd2fc578d075679aa67e85d12", - "function_idx": 36 + "function_idx": 40 } ], "CONSTRUCTOR": [ { "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", - "function_idx": 38 + "function_idx": 42 } ] }, @@ -8569,18 +9846,79 @@ ], "state_mutability": "view" }, + { + "type": "enum", + "name": "core::bool", + "variants": [ + { + "name": "False", + "type": "()" + }, + { + "name": "True", + "type": "()" + } + ] + }, { "type": "function", "name": "test_revert_helper", "inputs": [ { - "name": "class_hash", + "name": "replacement_class_hash", + "type": "core::starknet::class_hash::ClassHash" + }, + { + "name": "to_panic", + "type": "core::bool" + } + ], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "write_10_to_my_storage_var", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, + { + "type": "function", + "name": "test_revert_with_inner_call_and_reverted_storage", + "inputs": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "replacement_class_hash", "type": "core::starknet::class_hash::ClassHash" } ], "outputs": [], "state_mutability": "external" }, + { + "type": "function", + "name": "middle_revert_contract", + "inputs": [ + { + "name": "contract_address", + "type": "core::starknet::contract_address::ContractAddress" + }, + { + "name": "entry_point_selector", + "type": "core::felt252" + }, + { + "name": "calldata", + "type": "core::array::Array::" + } + ], + "outputs": [], + "state_mutability": "external" + }, { "type": "function", "name": "test_emit_events", @@ -8900,20 +10238,6 @@ ], "state_mutability": "view" }, - { - "type": "enum", - "name": "core::bool", - "variants": [ - { - "name": "False", - "type": "()" - }, - { - "name": "True", - "type": "()" - } - ] - }, { "type": "function", "name": "test_deploy", @@ -9212,6 +10536,13 @@ ], "state_mutability": "external" }, + { + "type": "function", + "name": "empty_function", + "inputs": [], + "outputs": [], + "state_mutability": "external" + }, { "type": "event", "name": "test_contract::test_contract::TestContract::Event", diff --git a/crates/blockifier/feature_contracts/cairo1/sierra/test_contract_execution_info_v1.sierra.json b/crates/blockifier/feature_contracts/cairo1/sierra/test_contract_execution_info_v1.sierra.json index 1aafc066df9..e18d5bf66cc 100644 --- a/crates/blockifier/feature_contracts/cairo1/sierra/test_contract_execution_info_v1.sierra.json +++ b/crates/blockifier/feature_contracts/cairo1/sierra/test_contract_execution_info_v1.sierra.json @@ -1,13 +1,13 @@ { "sierra_program": [ "0x1", - "0x6", + "0x7", "0x0", "0x2", - "0x9", - "0x2", - "0x166", - "0x9a", + "0xa", + "0x0", + "0x188", + "0x78", "0x44", "0x52616e6765436865636b", "0x800000000000000100000000000000000000000000000000", @@ -111,19 +111,22 @@ "0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7", "0x41", "0x4761734275696c74696e", - "0x9f", + "0xa0", "0x7265766f6b655f61705f747261636b696e67", "0x77697468647261775f676173", "0x6272616e63685f616c69676e", + "0x72656465706f7369745f676173", "0x7374727563745f6465636f6e737472756374", "0x656e61626c655f61705f747261636b696e67", "0x73746f72655f74656d70", + "0x43", "0x61727261795f736e617073686f745f706f705f66726f6e74", "0x656e756d5f696e6974", "0x42", "0x6a756d70", "0x7374727563745f636f6e737472756374", "0x656e756d5f6d61746368", + "0x64697361626c655f61705f747261636b696e67", "0x756e626f78", "0x72656e616d65", "0x7536345f7472795f66726f6d5f66656c74323532", @@ -132,14 +135,12 @@ "0x66756e6374696f6e5f63616c6c", "0x3", "0x3f", - "0x64697361626c655f61705f747261636b696e67", "0x64726f70", "0x61727261795f6e6577", "0x636f6e73745f61735f696d6d656469617465", "0x3b", "0x61727261795f617070656e64", "0x3a", - "0x43", "0x6765745f6275696c74696e5f636f737473", "0x39", "0x77697468647261775f6761735f616c6c", @@ -191,55 +192,53 @@ "0x7533325f7472795f66726f6d5f66656c74323532", "0x61727261795f736c696365", "0x7533325f6f766572666c6f77696e675f737562", - "0x4c9", + "0x548", "0xffffffffffffffff", - "0x14f", - "0x13e", - "0x13a", - "0x128", - "0x123", - "0x110", - "0x10a", - "0xff", - "0xec", - "0xd9", + "0x18f", + "0x17c", + "0x176", + "0x162", + "0x15a", + "0x4a", + "0x51", + "0x145", + "0x13c", "0x45", - "0xc5", "0x46", "0x47", "0x48", "0x49", - "0xb0", - "0x4a", + "0x130", "0x4b", "0x4c", "0x4d", - "0x6e", "0x4e", + "0x11c", "0x4f", "0x50", - "0x51", "0x52", "0x53", + "0x108", "0x54", "0x55", "0x56", "0x57", - "0x9b", "0x58", + "0xf3", "0x59", "0x5a", "0x5b", "0x5c", "0x5d", + "0xdd", "0x5e", "0x5f", "0x60", "0x61", "0x62", + "0x95", "0x63", "0x64", - "0x94", "0x65", "0x66", "0x67", @@ -249,6 +248,8 @@ "0x6b", "0x6c", "0x6d", + "0x6e", + "0xc7", "0x6f", "0x70", "0x71", @@ -263,6 +264,7 @@ "0x7a", "0x7b", "0x7c", + "0xbf", "0x7d", "0x7e", "0x7f", @@ -279,7 +281,6 @@ "0x8a", "0x8b", "0x8c", - "0x116", "0x8d", "0x8e", "0x8f", @@ -287,59 +288,23 @@ "0x91", "0x92", "0x93", - "0x12d", - "0x95", + "0x94", "0x96", "0x97", "0x98", "0x99", "0x9a", - "0x142", + "0x9b", "0x9c", "0x9d", "0x9e", - "0xa0", + "0x9f", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", - "0x214", - "0x16c", - "0x171", - "0x209", - "0x204", - "0x17f", - "0x184", - "0x1f9", - "0x1f2", - "0x1ea", - "0x1e0", - "0x1d3", - "0x1c5", - "0x1a9", - "0x1ae", - "0x1b8", - "0x1fe", - "0x20e", - "0x3ec", - "0x255", - "0x271", - "0x3d3", - "0x3b3", - "0x395", - "0x2a8", - "0x2c4", - "0x2e0", - "0x382", - "0x2ec", - "0x36a", - "0x354", - "0x340", - "0x32e", - "0x31e", - "0x310", "0xa7", "0xa8", "0xa9", @@ -348,25 +313,94 @@ "0xac", "0xad", "0xae", + "0x14e", "0xaf", - "0x40a", - "0x40f", - "0x461", - "0x458", - "0x44b", - "0x43c", - "0x430", + "0xb0", + "0xb1", + "0xb2", + "0xb3", + "0xb4", + "0xb5", + "0xb6", + "0xb7", + "0xb8", + "0x16a", + "0xb9", + "0xba", + "0xbb", + "0xbc", + "0xbd", + "0xbe", + "0xc0", + "0xc1", + "0xc2", + "0x183", + "0xc3", + "0xc4", + "0xc5", + "0xc6", + "0xc8", + "0xc9", + "0xca", + "0xcb", + "0xcc", + "0xcd", + "0xce", + "0xcf", + "0xd0", + "0x255", + "0x1ad", + "0x1b2", + "0x24a", + "0x245", + "0x1c0", + "0x1c5", + "0x23a", + "0x233", + "0x22b", + "0x221", + "0x214", + "0x206", + "0x1ea", + "0x1ef", + "0x1f9", + "0x23f", + "0x24f", + "0x45a", + "0x299", + "0x2b8", + "0x440", + "0x41f", + "0x400", + "0x2f8", + "0x317", + "0x337", + "0x3ec", + "0x343", + "0x3d3", + "0x3bc", + "0x3a7", + "0x394", + "0x383", + "0x374", + "0x47a", + "0x47f", + "0x4d1", + "0x4c8", "0x4bb", - "0x477", - "0x47c", - "0x4b0", + "0x4ac", "0x4a0", - "0x495", - "0x15d", - "0x21d", - "0x403", - "0x46b", - "0x28c7", + "0x539", + "0x4eb", + "0x4f2", + "0x52d", + "0x51c", + "0x510", + "0x19e", + "0x25e", + "0x473", + "0x4db", + "0x2cb9", "0x300e0b02810060a038180a04018240e06028100608038180a04018080200", "0x1408030801c0c050200c1e070301408030701c0c050200c1a07030140803", "0x540e06028100614038180a040184c0e06028100612038180a04018440e06", @@ -382,378 +416,416 @@ "0x180a27029780a3a028180a5d061702e5b038180a04018b80a5a02964182a", "0x14c40530830541a300144e050c83036170e81478052f830361a030140c05", "0x1a4186833808cc1d029940a640606c340602884761d028180a630606c342e", - "0x940a05368300e700281cde0602814dc0c02814da0c3609c0a0535830d40c", - "0x140a75030140a74380140a730281ce005039bc3a05029c81871380140a6d", - "0x1dc0a05398140e770281cde7702814da0c039dc0a0737830ec0602814da06", - "0x1f0c005029ccc405029acf605029cc0a7a029e44e05029b44e05029c81878", - "0x14fc3902814fa3a02814fa3c02814fa0602814fa6502814fa2502814fa0c", - "0x140a6d0281d0405039bc5c05029c85605029c80c0502a050005029fc0c05", - "0x14fa8702815108702814e40c432140a0536831088202814da4602814da83", - "0x220ac05029f51205029cc0e7a029e47805029b47405029b47205029b50e05", - "0x14fe8b02814fe8a02814fe0c03a080a07379680a05390880a053e8880a05", - "0x1fd2005029fd1e05029fd1c05029fc4e05029f43a05029f51a05029fd1805", - "0x14e44802814e64a02814d69402814e67a3d014f20c498940a05492440a05", - "0x1bcbc05029f4f605029b418073d8140e6f310140a720601cc005039bc7805", - "0x312e0c4b0e80a054a9180a054a8180a054a8140e7b0281cde05039800a07", - "0x140a991e8140a6b1e8140a74200140a6d210140a6b210140a744c0140a6d", - "0x2700a053f9040a053ea6c0a053e831340602815323a02815324102814da46", - "0x140a6b1e0140a7406280189f062793a05029fd1205029b40a07448140e6f", - "0x14f20c5202c0a05368180a055189c0a05492880a053f831425e02814da3c", - "0x1d1205039bcac05029c94e05029fc5005029cc5a05029ad4c05029cd4a7a", - "0x14fead02814feac02814feab02814feaa02814fea902814fea802814fa0c", - "0x140a7f062d16605029f56405029f56205029fd6005029fd5e05029fd5c05", - "0x300e940281cde4a02814e40c039200a07378316c06028156a0b0281524a5", - "0x1c9005039bc0e05029fc1605029f40a074a0140e6f3d0140a7f4a0140a6d", - "0x1cde0502814fea602814da0c03a980a07378b40a05390300e280281cde05", - "0x2c54a075c01c0a0c03814180c5c014180c062dc0a07140140e6f0281d4c05", - "0x15620c062e00a0c528315c055c014f4053d03018b8028300e0c57ac00eb9", - "0x2b00aaf0603170050601c18ab02aa958ad03ae00eae02ac018a502ae00aa5", - "0x30182202831580c538157005550155a0c548157005568155c0c550157005", - "0x157005558155c0c1401570050e815540c0e8157005062ac180c5c0141807", - "0x3018b8028300e0c12815742202ae00ea702aa418a702ae00a2802ab418a9", - "0x2940e22060b40ab8028b40a28060b40ab80289c0a1d0609c0ab8028880aa7", - "0x2a40ab0060ac0ab8028ac0ab10603170050601c18a602aec5c2b03ae00e2d", - "0x1416055703150055c01544055783018b8028300e0c0301474a20581d7007", - "0x1418ab0603170050601c180c4c01418ac062700ab802aa00aad062740ab8", - "0x2700ab8028e80aad062740ab8028180aae060e80ab8028e40aaa060e40ab8", - "0x74184002ae00a3d02a9c180c5c0141807061040abc1e81570074e015520c", - "0x1180abd592600eb80390856071103084055c01484051403084055c0148005", - "0x3090054526d66075c01d3a055803130055c01530055883018b8028300e0c", - "0x2e00a9402894189402ae00a4a02874184a02ae00a9b02a9c180c5c0141807", - "0x300e0c062140a0c5603120055c014bc051383122055c015660557030bc05", - "0x3122055c0149005570311c055c0151e05168311e055c01418ab060317005", - "0x1c5c0c062e00a0c0383118055f2340ab803a400a2b062400ab802a380a27", - "0x15620c2b0157005488154c0c062e00a0c03830b4055fa2916075c01d1a98", - "0x21c0a060621d12075c014ac8b03a88185602ae00a560282c188b02ae00a8b", - "0x1c78054e830788003ae00a8502aa0180c5c0141807062080ac0428157007", - "0x1d70073d815600c3d815700540014f40c062e00a0c03830c405609800ab8", - "0x1dc0ab8029dc0aae0620c0ab8029940aa70603170050601c187002b08ca77", - "0x3018b8028300e0c6281588c30001d70073b815600c41815700541814500c", - "0xab0063180ab802b180a28060000ab8028000aae063180ab802b0c0aa7", - "0x158e055703196055c01590055383018b8028300e0c6501592c86381d7007", - "0x1418070633c0ace66b300eb803b1c0ab00632c0ab802b2c0a280631c0ab8", - "0x1596051e83018b802b340a3a06031700566014720c062e00a0c4e03018b8", - "0x2c80a4206031700545014800c062e00a6002904180c5c0158c051e83018b8", - "0x31640c68015700506260180c5c01506051e83018b8028b80a42060317005", - "0x157005062cc18d202ae00ad16801c8c0c68815700568814500c688157005", - "0x3112055c015120558831aa055c015a80524031a8055c015a4d303a6c18d3", - "0x2c512a502b540ab802b540a5e0601c0ab80281c0a94062c40ab802ac40a4a", - "0x15ac0548031ac055c014189106031700567814720c062e00a0c03831aa07", - "0x31380c062e00a0c03831b6da03b65b0d703ae00ed658a24f48f063580ab8", - "0x3780ab802b2c0a1d063740ab802b180a1d063700ab802a0c0a1d060317005", - "0x35c0ab106031700570015180c70b800eb802b7c0a8d0637c0ab8028311c0c", - "0x15700517015160c03815700503815280c6c01570056c014940c6b8157005", - "0xa0186002ae00a6002968188a02ae00a8a02a2818b202ae00ab202a2c182e", - "0x361aeab2b031bc055c015bc0514031ba055c015ba0514031b8055c015b805", - "0x3a00ae773015700772815120c72b91c6e252ae00ade6eb70c08a590b9c207", - "0x1d7005748150a0c74815700506260180c5c015cc054383018b8028300e0c", - "0xf018ed02ae00aec02a0018ec02ae00aeb02a98180c5c015d40541031d6ea", - "0x15c8054a031c6055c015c60525031c4055c015c40558831dc055c015da05", - "0x3a00a480603170050601c18ee7238dc4a502bb80ab802bb80a5e063900ab8", - "0x15700572015280c71815700571814940c71015700571015620c778157005", - "0x31700506270180c5c0141807063bdc8e3712940aef02ae00aef0297818e4", - "0x2e00a8a02900180c5c014c0052083018b802b180a3d060317005658147a0c", - "0x2e00a0c4c03018b802a0c0a3d06031700517014840c062e00ab202908180c", - "0x31e2055c0159cf00391818ce02ae00ace028a018ce02ae00a0c30031e005", - "0x3680ab1063d00ab802bcc0a48063cc0ab802bc5e4074d831e4055c01418b3", - "0x1570057a014bc0c03815700503815280c6d81570056d814940c6d0157005", - "0x3018b802b280a3906031700506270180c5c0141807063d00edb6d2940af4", - "0x31700545014800c062e00a6002904180c5c0158c051e83018b802a0c0a3d", - "0x1570050618818f502ae00a0c4c03018b8028b80a4206031700559014840c", - "0x26c18f802ae00a0c59831ee055c015ecf50391818f602ae00af6028a018f6", - "0x2c40a4a062240ab802a240ab1063e80ab802be40a48063e40ab802bddf007", - "0x31f40758a254a057d01570057d014bc0c03815700503815280c588157005", - "0x108180c5c01506051e83018b802b140a3906031700506270180c5c0141807", - "0x3018b802ac80a4206031700545014800c062e00a6002904180c5c0145c05", - "0x15f8fb0391818fc02ae00afc028a018fc02ae00a0c3d831f6055c0141898", - "0x4000ab802bfc0a48063fc0ab802bf5fc074d831fc055c01418b3063f40ab8", - "0x14bc0c03815700503815280c58815700558814940c44815700544815620c", - "0x1c00a3906031700506270180c5c0141807064000eb144a940b0002ae00b00", - "0x14800c062e00a6002904180c5c0145c052103018b802ac80a42060317005", - "0x3204055c01604051403204055c0141877064040ab802831300c062e00a8a", - "0x14900c82815700581c100e9b064100ab802831660c818157005814040e46", - "0x2e00a0702a5018b102ae00ab102928188902ae00a8902ac4190602ae00b05", - "0x2e00a0c4e03018b8028300e0c8301d6289528160c055c0160c052f0300e05", - "0x1500053803018b8028b80a4206031700559014840c062e00a6202994180c", - "0x4200a28064200ab802831060c83815700506260180c5c01514052003018b8", - "0x2e00b098501d360c850157005062cc190902ae00b088381c8c0c840157005", - "0x3162055c01562052503112055c01512055883218055c0161605240321605", - "0x3170050601c190c03ac512a502c300ab802c300a5e0601c0ab80281c0a94", - "0x31700545014800c062e00a2e02908180c5c01564052103018b802831380c", - "0x15280c58815700558814940c44815700544815620c86815700541014900c", - "0xe4180c5c0141807064340eb144a940b0d02ae00b0d02978180702ae00a07", - "0x4380ab8029680ab106031700517014840c062e00ab202908180c5c0152205", - "0x3018b802a440a3906031700546014ca0c062e00a0c03830190f02831580c", - "0x31700506270190e02ae00a9802ac4180c5c0145c052103018b802ac80a42", - "0x44620072303222055c01622051403222055c0141800064400ab802831300c", - "0x1570058a014900c8a01570058944c0e9b0644c0ab802831660c890157005", - "0x178180702ae00a0702a5018b102ae00ab102928190e02ae00b0e02ac41915", - "0x108180c5c0153a051c83018b8028300e0c8a81d630e528162a055c0162a05", - "0x194180c5c0141807060322e05062b0191602ae00a4602ac4180c5c0145c05", - "0x4580ab8028ac0ab106031700517014840c062e00a9d028e4180c5c0148205", - "0x1570058c014500c8c01570050630c18e702ae00a0c4c03018b802831380c", - "0x3236055c016331a03a6c191a02ae00a0c5983232055c01630e7039181918", - "0x1c0a94062c40ab802ac40a4a064580ab802c580ab1064700ab802c6c0a48", - "0x14720c062e00a0c03832380758c594a058e01570058e014bc0c038157005", - "0x14ca0c062e00a0c03830191e02831580c8e815700553015620c062e00aa9", - "0x260180c5c014189c064740ab802a940ab106031700554814720c062e00a25", - "0x2e00b1f6c81c8c0c8f81570058f814500c8f81570050631418d902ae00a0c", - "0x3244055c014ce0524030ce055c016412103a6c192102ae00a0c598324005", - "0x4880a5e0601c0ab80281c0a94062c40ab802ac40a4a064740ab802c740ab1", - "0x1418980603170053d014e00c062e00a0c03832440758c754a05910157005", - "0x4940ab802c9246072303248055c01648051403248055c01418600648c0ab8", - "0x15620c94015700593814900c93815700592c980e9b064980ab802831660c", - "0x2e00b2802978180702ae00a0702a5018af02ae00aaf0292818b002ae00ab0", - "0x1652a53d01d700703815600c03815700502814f40c9401d5eb0528165005", - "0x1e80aae062bc0ab802ac00a1d062c00ab802a940aa70603170050601c18b1", - "0x300e0c5601654ad5701d70073d015600c57815700557814500c3d0157005", - "0x2a40ab802aa80a25062a80ab802aac0a1d062ac0ab802ab40aa7060317005", - "0x2e00a0c03830192b02831580c0e8157005548144e0c538157005570155c0c", - "0x144e0c538157005560155c0c110157005140145a0c140157005062ac180c", - "0x1c3a05158304e055c0144a05530304aa703ae00aa702b18181d02ae00a22", - "0x1c180b02cb54c2e03ae00e2d0601c5c0c062e00a0c038305605960b40ab8", - "0x2880eb803a9c0ab0060b80ab8028b80ab106031700513814e00c062e00a0c", - "0x3138055c0154405570313a055c0140c055783018b8028300e0c540165c06", - "0x3074055c01418ab0603170050601c180c9781418ac060e40ab802a740aad", - "0x2700aa6060e40ab8028f40aad062700ab802aa00aae060f40ab8028e80aaa", - "0x2e00a4002a9c180c5c0141807061080b302001570071c815520c208157005", - "0x1180eb803ac85c076383164055c01564051403164055c01530050e8313005", - "0x15700520814160c23015700523015620c062e00a0c0383094484d9ea62b3", - "0x2e00a0c038312005992440ab8039780aca0617928075c014824603b201841", - "0x3170050601c188c02ccd1a055c01d1c05660311c8f03ae00a9102b2c180c", - "0x3018b8028300e0c2b016685a4501d700745815600c45815700547814f40c", - "0x2280ab0062240ab802a240a28062280ab802a280aae062240ab8029680aa7", - "0x1512050e83100055c0150a055383018b8028300e0c410166a854381d7007", - "0x1800ab8029800a280621c0ab802a1c0aae061800ab802a000a1d060f00ab8", - "0x30ca055c014f6055383018b8028300e0c3b8166c7b3101d700743815600c", - "0x20c0a27060000ab8029880aae0620c0ab8029c00a25061c00ab8029940a1d", - "0x3140a2d063140ab802831560c062e00a0c03830193702831580c618157005", - "0x157005000154c0c618157005630144e0c0001570053b8155c0c630157005", - "0x180788d59a995eaf6683018b8028300e0c6501670c802ae00ec3028ac18c7", - "0x159a05688319a055c01598c703b4018cc02ae00acb02b3c18cb02ae00ac8", - "0x1418070633d280702b3c0ab802b3c0ad2062500ab802a500ab10633c0ab8", - "0x2340a700603170051e0147a0c062e00a60028f4180c5c0155e051e83018b8", - "0x34018d002ae00aca02b50180c5c0154c052003018b802acc0ad3060317005", - "0x3480ad2062500ab802a500ab1063480ab802b440ad1063440ab802b418e07", - "0x2e00aaf028f4180c5c0154c052003018b8028300e0c692500e05690157005", - "0x2e00a0c5583018b802a340a70060317005448147a0c062e00ab302b4c180c", - "0x3580ab802b55a80768031aa055c015a6056a031a8055c015040553031a605", - "0x2500e056b81570056b815a40c4a01570054a015620c6b81570056b015a20c", - "0x2e00ab302b4c180c5c0155e051e83018b802a980a400603170050601c18d7", - "0x3600ad4063680ab8029580aa6063600ab802831560c062e00a8d029c0180c", - "0x2e00a9402ac418dd02ae00adc02b4418dc02ae00adb6d01da00c6d8157005", - "0x31700553014800c062e00a0c03831ba9403815ba055c015ba05690312805", - "0x3791e0768031bc055c01518056a03018b802acc0ad3060317005578147a0c", - "0x15700570015a40c4a01570054a015620c7001570056f815a20c6f8157005", - "0x34c180c5c0155e051e83018b802a980a400603170050601c18e04a01c0ae0", - "0x2e00ae102b48189402ae00a9402ac418e102ae00a9002b54180c5c0156605", - "0x3018b8029280ad306031700524015a60c062e00a0c03831c29403815c205", - "0x327205062b018e202ae00a9b02ac4180c5c0155e051e83018b802a980a40", - "0x317005578147a0c062e00aa602900180c5c01484053283018b8028300e0c", - "0x1040ed0063900ab802b8c0ad40638c0ab802831560c71015700517015620c", - "0x1c18e67101c0ae602ae00ae602b4818e602ae00ae502b4418e502ae00ae4", - "0x31d0055c01416055883018b802abc0a3d06031700553814720c062e00a0c", - "0xf4180c5c0154e051c83018b8028ac0a650603170050601c180c9d01418ac", - "0x15700574815a80c748157005062ac18e802ae00a0c02ac4180c5c0155e05", - "0x15d8055c015d80569031d8055c015d60568831d6055c015d42703b4018ea", - "0x15a80c770157005588154c0c768157005062ac180c5c0141807063b1d007", - "0x141805588319c055c015e00568831e0055c015deee03b4018ef02ae00aed", - "0x2e00a0c6b83154055c01418d606338180702b380ab802b380ad2060300ab8", - "0x1418d6060b40ab802831b00c12815700506360182802ae00a0c6b0314e05", - "0x14f4054603018b802831380c062e00a0c6d03016055c01418d6060b80ab8", - "0x15b80c062e00a0c03831389d541ea760654a88f4b80381c0a076d83018b8", - "0x37c181d1109c7a3a58ae00a3902b78183902ae00a0602b74180602ae00a06", - "0x15160c4c108807a5c01482057083082055c01474057003074055c0147405", - "0x147a057183152055c01552a703b8818a202ae00aa202928184002ae00a40", - "0x143a2803b94182202ae00a221281dc80c138157005138b40ee4060f40ab8", - "0x317007529000ee6062600ab802a600a8a061080ab8029080a8b060740ab8", - "0x1558051e83018b802abc0a4106031700513814800c062e00a0c03830193c", - "0x2b80a3d06031700511014800c062e00aad028f4180c5c0143a051e83018b8", - "0x15d20c062e00a2e02ba0180c5c01416057403018b802aa80ae8060317005", - "0x108180c5c01562052103018b802a600a4006031700558014800c062e00a3d", - "0x1180ab8029180a28061180ab802831d40c59015700506260180c5c0148405", - "0x3ac184802ae00ab34d81d360c4d8157005062cc18b302ae00a465901c8c0c", - "0x1552054a03144055c01544052503018055c01418055883094055c0149005", - "0x1080ee60603170050601c184a54a8818a5029280ab8029280aec062a40ab8", - "0x3018b802abc0a4106031700513814800c062e00a0c03830193d062e00eb1", - "0x31700511014800c062e00aad028f4180c5c0143a051e83018b802ab00a3d", - "0x2e00a2e02ba0180c5c01416057403018b802aa80ae8060317005570147a0c", - "0x2e00a0c4c03018b802a600a4006031700558014800c062e00a3d02ba4180c", - "0x3122055c014bc9403918185e02ae00a5e028a0185e02ae00a0c768312805", - "0x300ab1062380ab802a3c0aeb0623c0ab802a4520074d83120055c01418b3", - "0x15700547015d80c54815700554815280c51015700551014940c060157005", - "0x2e00ab002bb8188d02ae00a9802bb8180c5c01418070623952a2062940a8e", - "0x4f818b803a2c0af00622c0ab802a2c0a280622c0ab802a311a07778311805", - "0x2150e892b2bd70052d015e20c2d01570051e8159c0c062e00a0c038311405", - "0x3bc185602ae00a56028a018773d988c03c402095eb802abc0af1060ad4cab", - "0x21c0af2062240ab802a240a8a061940ab8029940a28061940ab802a08ac07", - "0x154c0b03b9418ab02ae00aab5501dca0c42815700542814160c438157005", - "0x2e00a0c03830e0059f831700732815e00c158157005158b80ee5062980ab8", - "0x3186055c014008303bbc180002ae00a8002bb8188302ae00a8902bb8180c", - "0x21c0ef30603170050601c18c502d0018b803b0c0af00630c0ab802b0c0a28", - "0x3018b8029880a3d060317005558147a0c062e00a0c038301941062e00e3c", - "0x31700511014800c062e00aad028f4180c5c0143a051e83018b802ab00a3d", - "0x2e00a2b028f4180c5c014ee051e83018b80289c0a40060317005570147a0c", - "0x150a053803018b8029800a70060317005530147a0c062e00a7b028f4180c", - "0x1c8c0c63815700563814500c638157005063d018c602ae00a0c4c03018b8", - "0x1596057583196055c01590ca03a6c18ca02ae00a0c5983190055c0158ec6", - "0x2a40ab802aa40a94062880ab802a880a4a060300ab8028300ab1063300ab8", - "0x1d700542815ea0c062e00a0c0383198a9510314a0566015700566015d80c", - "0x344c0075c014c0057a831a0055c0159e057b0319e055c0159a053d0319a85", - "0x15ee0c68015700568015ee0c69815700569015ec0c69015700568814f40c", - "0x2e00aab028f4180c5c014180706032840c5c01da6d003be018d302ae00ad3", - "0x155a051e83018b8028740a3d060317005560147a0c062e00a62028f4180c", - "0x1dc0a3d06031700513814800c062e00aae028f4180c5c01444052003018b8", - "0x14e00c062e00aa6028f4180c5c014f6051e83018b8028ac0a3d060317005", - "0x3540ab802a880a4a063500ab8028300ab106031700542814e00c062e00a60", - "0x15700551014940c06015700506015620c062e00a0c03830194302831580c", - "0x1e9700530215440c52be4186002ae00a600282c188502ae00a850282c18a2", - "0x1e970056d015f60c062e00a0c03831b605a23680ab803b600afa06361aed6", - "0x168adf02ae00ede02bf0180c5c015ba053803018b802b700a7006379badc", - "0x2e00a1d028f4180c5c01558051e83018b802b7c0a650603170050601c18e0", - "0x144e052003018b802ab80a3d06031700511014800c062e00aad028f4180c", - "0x2980a3d0603170053d8147a0c062e00a2b028f4180c5c014ee051e83018b8", - "0x12818d402ae00ad602ac4180c5c01556051e83018b8029880a3d060317005", - "0x15700571014500c710157005063f418e102ae00a0c4c031aa055c015ae05", - "0x31ca055c015c6e403a6c18e402ae00a0c59831c6055c015c4e10391818e2", - "0x2a40a94063540ab802b540a4a063500ab802b500ab1063980ab802b940aeb", - "0x14ca0c062e00a0c03831cca96ab514a0573015700573015d80c548157005", - "0x2e00ee802bc018e802ae00ae8028a018e802ae00a625581dde0c062e00ae0", - "0x3a80ab802ba80a28063a80ab8029ed4c077783018b8028300e0c748168c0c", - "0xa018ec02ae00a771581dde0c062e00a0c03831d605a3831700775015e00c", - "0x144e057703018b8028300e0c76816900c5c01dd80578031d8055c015d805", - "0x31700777815e00c77815700577814500c778157005573b80eef063b80ab8", - "0x31e2055c0155ace03bbc18ce02ae00a2202bb8180c5c0141807063c00b49", - "0x740eef0603170050601c18f202d2818b803bc40af0063c40ab802bc40a28", - "0x141807063d00b4b062e00ef302bc018f302ae00af3028a018f302ae00aac", - "0x2c418f702ae00af602bfc18f602ae00af502bf818f502ae00a0c5583018b8", - "0x15ee057603152055c01552054a031ae055c015ae0525031ac055c015ac05", - "0x2e00a0c4c03018b802bd00b000603170050601c18f754b5daca502bdc0ab8", - "0x31f4055c015f2f80391818f902ae00af9028a018f902ae00a0c80831f005", - "0x3580ab1063f40ab802bf00aeb063f00ab802be9f6074d831f6055c01418b3", - "0x1570057e815d80c54815700554815280c6b81570056b814940c6b0157005", - "0x317005560147a0c062e00af202c00180c5c0141807063f552d76b2940afd", - "0x2e00aff028a018ff02ae00a0c81031fc055c01418980603170050e8147a0c", - "0x4080ab802c0202074d83202055c01418b3064000ab802bfdfc0723031fe05", - "0x15280c6b81570056b814940c6b01570056b015620c81815700581015d60c", - "0x400180c5c01418070640d52d76b2940b0302ae00b0302bb018a902ae00aa9", - "0x3018b802ab40a3d0603170050e8147a0c062e00aac028f4180c5c015e005", - "0x15700582814500c8281570050640c190402ae00a0c4c03018b8028880a40", - "0x3210055c0160d0703a6c190702ae00a0c598320c055c0160b04039181905", - "0x2a40a940635c0ab802b5c0a4a063580ab802b580ab1064240ab802c200aeb", - "0x16000c062e00a0c0383212a96bb594a0584815700584815d80c548157005", - "0x100180c5c0155a051e83018b8028740a3d060317005560147a0c062e00aed", - "0x3214055c014189806031700513814800c062e00aae028f4180c5c0144405", - "0x1418b3064300ab802c2e14072303216055c01616051403216055c0141904", - "0x1570056b015620c88015700587015d60c870157005864340e9b064340ab8", - "0x2940b1002ae00b1002bb018a902ae00aa902a5018d702ae00ad70292818d6", - "0x147a0c062e00aac028f4180c5c015d6058003018b8028300e0c882a5aed6", - "0x100180c5c0155c051e83018b8028880a40060317005568147a0c062e00a1d", - "0x3222055c0141898060317005158147a0c062e00a77028f4180c5c0144e05", - "0x1418b30644c0ab802c4a22072303224055c01624051403224055c0141905", - "0x1570056b015620c8b01570058a815d60c8a815700589c500e9b064500ab8", - "0x2940b1602ae00b1602bb018a902ae00aa902a5018d702ae00ad70292818d6", - "0x147a0c062e00aac028f4180c5c015d2058003018b8028300e0c8b2a5aed6", - "0x100180c5c0155c051e83018b8028880a40060317005568147a0c062e00a1d", - "0x3018b8029ec0a3d060317005158147a0c062e00a77028f4180c5c0144e05", - "0x1570058c014500c8c01570050641818e702ae00a0c4c03018b802a980a3d", - "0x3236055c016331a03a6c191a02ae00a0c5983232055c01630e7039181918", - "0x2a40a940635c0ab802b5c0a4a063580ab802b580ab1064700ab802c6c0aeb", - "0x147a0c062e00a0c0383238a96bb594a058e01570058e015d80c548157005", - "0xf4180c5c01444052003018b802ab40a3d0603170050e8147a0c062e00aac", - "0x3018b8028ac0a3d0603170053b8147a0c062e00a2702900180c5c0155c05", - "0x317005558147a0c062e00a62028f4180c5c0154c051e83018b8029ec0a3d", - "0x15280c6b81570056b814940c6b01570056b015620c8e81570056d815d60c", - "0x400180c5c01418070647552d76b2940b1d02ae00b1d02bb018a902ae00aa9", - "0x3018b802ab00a3d060317005310147a0c062e00aab028f4180c5c0158a05", - "0x317005570147a0c062e00a2202900180c5c0155a051e83018b8028740a3d", - "0x2e00a7b028f4180c5c01456051e83018b8029dc0a3d06031700513814800c", - "0x1478056983018b802a140a7006031700530014e00c062e00aa6028f4180c", - "0x47c0a280647c0ab8028320e0c6c815700506260180c5c0150e056983018b8", - "0x2e00b209081d360c908157005062cc192002ae00b1f6c81c8c0c8f8157005", - "0x3144055c01544052503018055c01418055883244055c014ce0575830ce05", - "0x3170050601c192254a8818a502c880ab802c880aec062a40ab802aa40a94", - "0x2e00aac028f4180c5c014c4051e83018b802aac0a3d06031700538016000c", - "0x155c051e83018b8028880a40060317005568147a0c062e00a1d028f4180c", - "0x1ec0a3d060317005158147a0c062e00a77028f4180c5c0144e052003018b8", - "0x15a60c062e00a85029c0180c5c014c0053803018b802a980a3d060317005", - "0x260180c5c01512052003018b802a000a4006031700543815a60c062e00a3c", - "0x2e00b249181c8c0c92015700592014500c92015700506420192302ae00a0c", - "0x3250055c0164e05758324e055c0164b2603a6c192602ae00a0c598324a05", - "0x4a00aec062a40ab802aa40a94062880ab802a880a4a060300ab8028300ab1", - "0x9c0a4006031700545016000c062e00a0c0383250a9510314a05940157005", - "0x147a0c062e00a1d028f4180c5c01558051e83018b802abc0a41060317005", - "0x3a0180c5c01554057403018b802ab80a3d06031700511014800c062e00aad", - "0x3298055c01418980603170051e815d20c062e00a2e02ba0180c5c0141605", - "0x1418b3065380ab802d369807230329a055c0169a05140329a055c0141909", - "0x15700506015620ca88157005a8015d60ca80157005a753c0e9b0653c0ab8", - "0x2940b5102ae00b5102bb018a902ae00aa902a5018a202ae00aa202928180c", - "0x14840c062e00a2502c28180c5c01450057403018b8028300e0ca8aa5440c", - "0xf4180c5c01562052103018b802ab00a3d06031700557814820c062e00aa5", - "0x3018b802aa80ae8060317005570147a0c062e00ab002900180c5c0155a05", - "0x31700553816160c062e00a2d02c28180c5c0145c057403018b80282c0ae8", - "0x15620caa0157005a9815d60ca981570054e5480e9b065480ab802831660c", - "0x2e00b5402bb0189d02ae00a9d02a5018a802ae00aa802928180c02ae00a0c", - "0x16aaa53d01d700703815600c03815700502814f40caa275500c52816a805", - "0x2c00aad062bc0ab8029e80aae062c00ab802a940aaf0603170050601c18b1", - "0x2b40aaa062b40ab802831560c062e00a0c03830195602831580c570157005", - "0x1d7005578158c0c570157005560155a0c578157005588155c0c560157005", - "0x3170050601c18a702d5d52055c01d5c055483154055c01556055303156af", - "0x1e180c14015700514014500c1401570050e8143a0c0e8157005548154e0c", - "0x14190d06031700555014e00c062e00a0c038304e05ac09444075c01c500c", - "0x2e00a2d02bdc182e1281d7005128161c0c15abc0eb802abc0ac6060b40ab8", - "0x2bc0ac60603170050601c18a202d6416a603ae00e2e168ac44a5880305a05", - "0x1550057b8313a2503ae00a2502c3818a802ae00a0602bd818065781d7005", - "0x307a3a03d68729c03ae00e9d54298f5110602c0ab80282c0aae062a00ab8", - "0x3018b8028300e0c21016b6402081d70071c8955e9c52c40180c5c0141807", - "0x1180f13061180ab8029000aa6062c80ab802a600b12062600ab80282c0aa6", - "0x2e00a9b02c54184102ae00a4102ac4189b02ae00ab302c5018b302ae00ab2", - "0x3090055c014189806031700505814720c062e00a0c038313641038153605", - "0x1418b3062500ab80292890072303094055c01494051403094055c0141916", - "0x15700521015620c48015700548815ce0c4881570054a1780e9b061780ab8", - "0x3018b8028f40b180603170050601c18902101c0a9002ae00a9002c541842", - "0x23c0ab802831300c062e00a2502c60180c5c0155e051c83018b80282c0a39", - "0x31660c4681570054723c0e46062380ab802a380a28062380ab802832320c", - "0x2e00a3a02ac4188a02ae00a8b02b9c188b02ae00a8d4601d360c460157005", - "0x31700512816300c062e00a0c03831143a0381514055c01514058a8307405", - "0x2e00a56028a0185602ae00a0c8b030b4055c014189806031700557814720c", - "0x2140ab802a250e074d8310e055c01418b3062240ab802958b40723030ac05", - "0x2880e05410157005410162a0c51015700551015620c41015700542815ce0c", - "0x2e00a8002c68188002ae00a0c5583018b802abc0a390603170050601c1882", - "0x9c0ab80289c0ab1061880ab8029800b14061800ab8028f15407898307805", - "0xe4180c5c0154e053283018b8028300e0c3109c0e05310157005310162a0c", - "0x2e00a775501e260c3b81570053d816340c3d8157005062ac180c5c0155e05", - "0x14e0055c014e0058a83018055c014180558830e0055c014ca058a030ca05", - "0x141807062bd6007ae2c54a075c01c0a0c03814180c5c014189c061c01807", - "0x15600c52815700552815620c062e00a0c528315c055c0140e053d03018b8", - "0x2b40aae062a80ab802ab00aaf0603170050601c18ab02d7558ad03ae00eae", - "0x31560c062e00a0c03830195e02831580c538157005550155a0c548157005", - "0x157005140155a0c548157005558155c0c1401570050e815540c0e8157005", - "0x3018b8028300e0c13816be2502ae00ea702aa4182202ae00aa902a9818a7", - "0xac0ab0060b40ab8028b40a28060ac0ab8029e80a7a060b40ab8028940aa7", - "0x145c055303144055c0154c055383018b8028300e0c05816c0a61701d7007", - "0x2740ab802a740a28062740ab802a880a1d062a00ab8028b40a1d060180ab8", - "0x3c0180602ae00a060282c189c02ae00a9c028a0189c02ae00a9d5401dde0c", - "0x15700552815620c062e00a0c4e03018b8028300e0c1c816c20c5c01d3805", - "0x3e4180602ae00a060282c182202ae00a220282c18b102ae00ab10292818a5", - "0x2e00a0c4e03018b8028300e0c208f4747a029047a3a3d2e00a06112c54aa5", - "0x88f51c061080ab8029000b1b061000ab802831560c062e00a3902c00180c", - "0x156205250314a055c0154a055883164055c01530058e83130055c0148406", - "0x2e00a0c4e03018b8028300e0c592c54a7a02ac80ab802ac80ad9062c40ab8", - "0x2e00a0c4c03018b8028880a70060317005168147a0c062e00a0b028e4180c", - "0x3136055c01566460391818b302ae00ab3028a018b302ae00a0c8f8308c05", - "0x2940ab1062500ab8029280b20061280ab802a6c90074d83090055c01418b3", - "0x1c189458a94f4054a01570054a015b20c58815700558814940c528157005", - "0x16420c2f0157005062ac180c5c0144e053283018b802831380c062e00a0c", - "0x2940ab10623c0ab802a400b1d062400ab802a44f4223d470189102ae00a5e", - "0x1c188f58a94f40547815700547815b20c58815700558814940c528157005", - "0x180188e02ae00a0c4c03018b80281c0a700603170053d014e00c062e00a0c", - "0x2e00a0c5983118055c0151a8e03918188d02ae00a8d028a0188d02ae00a0c", - "0x2c00ab802ac00ab1061680ab802a280b20062280ab802a3116074d8311605", - "0x9c8c8306295625a57ac0f4052d01570052d015b20c57815700557814940c", - "0xe8723943919060c55d880a0c3d8300e270601c187a0381418822320c18a5", - "0x2501807138300f63562b55caf582c54a7a0381418892320c18a5030180c3c", - "0x1653d01c0a0c5320c187a1389d060c52d900a0c" + "0x1c80a07388180a05381bc0a05370300a0537030da2702814d80c35830d40c", + "0x1d8e405029d40a07390140e710e8140a74061cce405029b84a05029b81807", + "0x1ce27a02814dc0c039e80a0738830f20602814dc0602814f00602814ee0c", + "0x1b0fc05029d40a7d029f04e05029b84e05029d0187b3d0140a750281cf405", + "0xe80a053f8f00a053f8180a053f9940a053f8940a053f9800a053a9880a05", + "0x140e71170140a74158140a74030140a83410140a81030140a801c8140a7f", + "0x2200a0544a200a053a0310e8602814dc0c42a100a05371180a05370140e84", + "0x140a7f450140a75039f40a7c1e0140a6e1d0140a6e1c8140a6e440140a7f", + "0x2300a0540a2c0a05408300e840281ce25a02814e82202814fe22028151256", + "0x140a81480140a81478140a81138140a7f0e8140a7f470140a81468140a81", + "0x1200a053a9280a05362540a053a9f4fa053e0312825028152692028150291", + "0x140a7f3f0140a6e0601cfc05039c4c405029d01807300140e711e0140a74", + "0x312e3a028152c46028152c06028152c05039f80a07388140e600281ce25e", + "0x2687a05029b07a05029dc8005029b88405029b08405029dd3205029b81898", + "0x15029c02814fe4102814fe0c4d8180a054d0e80a054d1040a05371180a05", + "0x1b07805029dc18a106280189f4f0140a81450140a6e0281d1405039c53a05", + "0x314a0b02814dc060281548270281526a302815020c511780a05370f00a05", + "0x140e712b0140a74540140a81140140a75168140a6c538140a75531f40a7c", + "0x2b80a0540ab40a0540ab00a0540aac0a0540aa80a0540aa40a053f8300e8a", + "0x20418b55a0140a7f598140a7f590140a81588140a81580140a81578140a81", + "0x2540a07389280a053a0300e480281ce20c5b8180a055b02c0a0549a980a05", + "0x140e71038140a81058140a7f0281d2a05039c4fa0502a052a05029b81807", + "0x140a0540a9c0a05370300ea70281ce22d02814e80c038a00a07388140e48", + "0x1d7207028300e050603172050603018b80281c5005039c40a07538140e71", + "0x1572053e8154c0c57815720559014fa0c062e40a0c0383160b103ae964a6", + "0x2b80aaf062bc0ab902abc0ab0062980ab902a980ab1060317205062c818ae", + "0x1558055703154055c8155e053e83018b9028300e0c5581450ac5681d7207", + "0x880ab902aa00aac060a00ab902ab40aad060740ab902aa80ab0062a00ab9", + "0x9c0ab902831540c12815720557814fa0c062e40a0c0383018a702831560c", + "0x15580c140157205558155a0c0e815720512815600c16815720513815500c", + "0x2e40a0c1403018b9028300e0c17015762b02ae40e2202874182202ae40a2d", + "0x9c18a302ae40a0b02894180b02ae40a2b0288818a702ae40a1d029f4180c", + "0x2780abc548180eb903a8d4c07168314e055c8154e055803146055c8154605", + "0x15720503015620c062e40a0c590313a055c8154e053e83018b9028300e0c", + "0x3172050601c183d02a48743903ae40e2802abc189d02ae40a9d02ac01806", + "0x155a0c21015720520815600c2001572051d0155c0c2081572054e814fa0c", + "0x1f4180c5c8141807060311605062ac18b302ae40a4002ab0189902ae40a39", + "0x2e40a4602ac0189c02ae40ab402aa018b402ae40a0c550308c055c8153a05", + "0x2f490055c81d66050e83166055c81538055603132055c8147a05568308405", + "0x144a0c2f015720524014440c4a815720521014fa0c062e40a0c038309405", + "0x1d2406038b4189502ae40a9502ac0189202ae40a920289c189202ae40a5e", + "0x2e40a9102ac4188e02ae40a95029f4180c5c81418070623c0abe482440eb9", + "0x2e40a0c0383116055fa311a075c81d3205578311c055c8151c05580312205", + "0xac188a02ae40a5602894185602ae40a8c02888185a02ae40a8e029f4180c", + "0x1510051703108055c8151a05568310c055c814b4055803110055c8151405", + "0x1418aa060f00ab902a380a7d0603172050601c180c6001418ab062080ab9", + "0x2100ab902a2c0aad062180ab9028f00ab0061880ab9029800aa7061800ab9", + "0x1f4180c5c8141807061e80ac13f015720741014160c410157205310145c0c", + "0xac2379c80eb9039f9220751830ca055c814ca0558030ca055c8150c05", + "0x14e4055883188055c81508050303186055c814ca053e83018b9028300e0c", + "0x2e40ac302ac018c66281d7205621c80e9e063100ab902b100aa9061c80ab9", + "0x3240ab902b0c0a7d0603172050601c18bf02b218e055c81d8c054e8318605", + "0x159acc02ae40ecb028e818c902ae40ac902ac018cb6501d720563814720c", + "0x33c0ab0063000ab902b280aa60633c0ab902b240a7d0603172050601c18ce", + "0x159e053e83018b9028300e0c69815a4d16801d7207600155e0c678157205", + "0x3500ab902b500ab0063400ab902b400aad063540ab902b440a22063500ab9", + "0x3018b9028300e0c6c815b0d76b01d7207680155e0c6a81572056a8144e0c", + "0x3680ab0063580ab902b580aad0636c0ab902b5c0a22063680ab902b500a7d", + "0x300e0c6f815bcdd6e01d72076b0155e0c6d81572056d8144e0c6d0157205", + "0x3700ab902b700aad063840ab902b740a22063800ab902b680a7d060317205", + "0x15c8e37101d72076e0155e0c708157205708144e0c70015720570015600c", + "0x31720571814820c062e40ae2028f4180c5c81418280603172050601c18e5", + "0x2e40acc02908180c5c815b6052003018b902b840a400603172056a814800c", + "0x15c0053e83018b902aa40ab306031720548015660c062e40a6f02a64180c", + "0x27018e802ae40ae80289c18e802ae40a0c5a031ce055c8141846063980ab9", + "0x3ac0a95063ac0ab902ba5d40725031d4055c8141848063a40ab902ba1ce07", + "0x15720503814bc0c73015720573015600c62815720562815620c760157205", + "0x2e40ae5028f4180c5c8141807063b00ee662a980aec02ae40aec02a481807", + "0x15200c76815720576815600c7701572050624418ed02ae40ae0029f4180c", + "0x3018b9028300e0c79bc80ef1783bc0eb903bb9dac53ea3c18ee02ae40aee", + "0x2e40adb0289418f502ae40ad50289418f402ae40af0029f4180c5c8141828", + "0x31f4f903ae40af802a3418f802ae40a0c47031ee055c815c20512831ec05", + "0x140e052f031e8055c815e80558031de055c815de055883018b902be40a8c", + "0x1bc0ab9029bc0a5a062400ab902a400a8b062a40ab902aa40a8b0601c0ab9", + "0x144e0c7b01572057b0144e0c7a81572057a8144e0c66015720566014ac0c", + "0x31fcfd7e3ed4cb902bddecf5661bd20a97d01de8ef5622818f702ae40af7", + "0x3f00a7d0603172057f8150c0c062e40a0c038320205803fc0ab903bf80a88", + "0x31720582015040c82c100eb902c0c0a840640c0ab9028308c0c810157205", + "0x15620c84015720583814c00c83815720583014780c830157205828140c0c", + "0x2e40b0802a4818fd02ae40afd02978190202ae40b0202ac018fb02ae40afb", + "0x1602054a83212055c815f8053e83018b9028300e0c843f604fb530161005", + "0x3f40ab902bf40a5e064240ab902c240ab0063ec0ab902bec0ab1064280ab9", + "0x3018b902830500c062e40a0c0383214fd84bed4c0585015720585015240c", + "0x31720566014840c062e40adb02900180c5c815c2052003018b902b540a40", + "0x2e40af3029f4180c5c81552055983018b902a400ab306031720537815320c", + "0x1d380c868157205868144e0c86815720506188190c02ae40a0c230321605", + "0x1620054a83220055c8161d0f03928190f02ae40a0c240321c055c8161b0c", + "0x1c0ab90281c0a5e0642c0ab902c2c0ab0063c80ab902bc80ab1064440ab9", + "0x3018b902830500c062e40a0c03832220785bc94c0588815720588815240c", + "0x3172056d814800c062e40ad502900180c5c81552055983018b902b7c0a3d", + "0x2e40ada029f4180c5c81520055983018b9029bc0a9906031720566014840c", + "0x1d380c8a01572058a0144e0c8a0157205061f8191302ae40a0c230322405", + "0x162e054a8322e055c8162b1603928191602ae40a0c240322a055c8162913", + "0x1c0ab90281c0a5e064480ab902c480ab0063140ab902b140ab1064600ab9", + "0x3018b902830500c062e40a0c038323007893154c058c01572058c015240c", + "0x31720548015660c062e40ad502900180c5c81552055983018b902b640a3d", + "0x2e40a0c23031c8055c815a8053e83018b9029bc0a9906031720566014840c", + "0x3236055c816351903a70191a02ae40b1a0289c191a02ae40a0c3d0323205", + "0x3140ab1064780ab902c740a95064740ab902c6e38072503238055c8141848", + "0x1572058f015240c03815720503814bc0c72015720572015600c628157205", + "0x3018b902b4c0a3d060317205060a0180c5c8141807064780ee462a980b1e", + "0x31720566014840c062e40a6f02a64180c5c81520055983018b902aa40ab3", + "0x1642051383242055c8141865064800ab9028308c0c8f815720567814fa0c", + "0x1572059119c0e4a0619c0ab902830900c91015720590c800e9c064840ab9", + "0x178191f02ae40b1f02ac018c502ae40ac502ac4192402ae40b2302a541923", + "0x3018b9028300e0c9201e3ec55301648055c8164805490300e055c8140e05", + "0x3018b902b280a6f06031720554815660c062e40ace029c8180c5c8141828", + "0x15720506118192502ae40ac9029f4180c5c814de054c83018b902a400ab3", + "0x120192802ae40b279301d380c938157205938144e0c938157205060001926", + "0x158a055883256055c81654054a83254055c816512903928192902ae40a0c", + "0x4ac0ab902cac0a920601c0ab90281c0a5e064940ab902c940ab0063140ab9", + "0x2cc180c5c81552055983018b902830500c062e40a0c03832560792b154c05", + "0x1572055f8152a0c96015720561814fa0c062e40a6f02a64180c5c8152005", + "0x248180702ae40a0702978192c02ae40b2c02ac018c502ae40ac502ac4192d", + "0x15660c062e40a0c1403018b9028300e0c9681e58c5530165a055c8165a05", + "0x325c055c814ca053e83018b902a400ab3060317205420147a0c062e40aa9", + "0x3172050601c180c9881418ab064c00ab902cb80ab0064bc0ab9028000ab1", + "0x317205420147a0c062e40aa902acc180c5c814f4053903018b902830500c", + "0x4c80ab0064bc0ab902a440ab1064c80ab902a180a7d06031720548015660c", + "0x3268055c81668051383268055c81418c3064cc0ab9028308c0c980157205", + "0x152a0c9b81572059acd80e4a064d80ab902830900c9a81572059a4cc0e9c", + "0x2e40a0702978193002ae40b3002ac0192f02ae40b2f02ac4193802ae40b37", + "0x2e40a0c1403018b9028300e0c9c01e612f5301670055c8167005490300e05", + "0x23c0ab1064e40ab902a540a7d0603172054c8147a0c062e40aa902acc180c", + "0x30500c062e40a0c03830193c02831560c9d81572059c815600c9d0157205", + "0x14fa0c062e40a99028f4180c5c81552055983018b9029280a72060317205", + "0x15720506118193b02ae40b3d02ac0193a02ae40a0602ac4193d02ae40a42", + "0x120194002ae40b3f9f01d380c9f81572059f8144e0c9f815720506310193e", + "0x1674055883200055c81684054a83284055c816814103928194102ae40a0c", + "0x4000ab902c000a920601c0ab90281c0a5e064ec0ab902cec0ab0064e80ab9", + "0x50c0ab902a9c0a7d060317205140147a0c062e40a0c0383200079dce94c05", + "0x2e40a0c03830194602831560ca28157205a1815600ca201572054f015620c", + "0x2e40a1d029f4180c5c81450051e83018b9028b80a72060317205060a0180c", + "0x314194802ae40a0c230328a055c8168e055803288055c8154c05588328e05", + "0x2e40a0c2403294055c816934803a70194902ae40b490289c194902ae40a0c", + "0x5100ab902d100ab1065300ab902d2c0a950652c0ab902d29e20725031e205", + "0x5114c05a60157205a6015240c03815720503814bc0ca28157205a2815600c", + "0x308c0ca6815720558014fa0c062e40a7d029bc180c5c8141807065300f45", + "0x157205a7d380e9c0653c0ab902d3c0a270653c0ab902830c40ca70157205", + "0x2c4195302ae40b5202a54195202ae40b50a881c940ca88157205061201950", + "0x16a605490300e055c8140e052f0329a055c8169a055803162055c8156205", + "0x5514c7d03ae40e0702abc180702ae40a0502a98195303d3562a602d4c0ab9", + "0x155a0c580157205588144a0c58815720553014440c062e40a0c038316405", + "0x1c18ad02d555caf03ae40e7d02abc18b002ae40ab00289c187d02ae40a7d", + "0x15720555814560c558157205560144a0c56015720557014440c062e40a0c", + "0x14180706032ac05062ac181d02ae40aaa028b818a802ae40aaf02ab418aa", + "0xb818a802ae40aad02ab4182202ae40a2802a9c182802ae40a0c5503018b9", + "0x740a0b0609c0ab9028940a060609550075c8155005630303a055c8144405", + "0x301605ac29c5c075c81c5a0c03a8c180c5c8141807060ac0b57168157207", + "0x1d7207540155e0c17015720517015620c062e40a27029bc180c5c8141807", + "0x2740ab902a8c0aad062780ab9028180aae0603172050601c18a902d640ca3", + "0xe80ab902831540c062e40a0c03830195a02831560c1c81572054f015580c", + "0x140c0c1c81572051e815580c4e8157205548155a0c1e81572051d015500c", + "0x1480051103018b9028300e0c21016b64002ae40e3902874184102ae40a9d", + "0x1d7207598b80ec7062cc0ab902acc0a27062cc0ab902a640a25062640ab9", + "0x2e40a4102aa4184602ae40a4602ac4180c5c814180706128909c3ed716846", + "0x141807062440b5d4901572072f015920c2f2540eb9029048c075f8308205", + "0x2e40a0c038311a05af2380ab903a3c0acb0623d20075c81524056503018b9", + "0x3172050601c185602d7cb48b03ae40e8c02abc188c02ae40a9002a98180c", + "0x155e0c450157205450144e0c458157205458155a0c4501572052d014440c", + "0x2280a25062080ab902a180a220603172050601c188402d810c8803ae40e8b", + "0x157205300144e0c440157205440155a0c300157205410144a0c1e0157205", + "0x1940ab9029f80a220603172050601c187a02d84fc6203ae40e8802abc1860", + "0x145c0c000157205310155a0c37815720539014560c390157205328144a0c", + "0x154e0c620157205062a8180c5c814180706032c405062ac18c302ae40a6f", + "0x2e40a000281818c302ae40ac5028b8180002ae40a7a02ab418c502ae40ac4", + "0xf11cb453ac160cc0603172050601c18bf02d8d8e055c81d8605058318c05", + "0x32c0ac00632c0ab902b298c076783194055c81592056703192055c8158e60", + "0x300e0c662540e0566015720566015a00c4a81572054a815620c660157205", + "0x14de0c062e40a3c02900180c5c814c0052003018b902ac00a40060317205", + "0x319c055c8157e056983018b902a9c0a990603172055a015a20c062e40a8e", + "0x15a00c4a81572054a815620c60015720567815800c678157205673180ecf", + "0x1560052003018b902a9c0a990603172050601c18c04a81c0ac002ae40ac0", + "0x1418aa06031720547014de0c062e40a8a02900180c5c81568056883018b9", + "0x15720569b440ecf0634c0ab902b400ad3063440ab902a100a06063400ab9", + "0x1c0ad502ae40ad502b40189502ae40a9502ac418d502ae40ad402b0018d4", + "0x1568056883018b902ac00a4006031720553815320c062e40a0c03831aa95", + "0x15a60c6b81572052b0140c0c6b0157205062a8180c5c8151c053783018b9", + "0x152a0558831b6055c815b40560031b4055c815b2d703b3c18d902ae40ad6", + "0x2e40aa702a64180c5c81418070636d2a0702b6c0ab902b6c0ad0062540ab9", + "0x2400ecf063700ab902a340ad30603172055a015a20c062e40ab002900180c", + "0x2e40adf02b40189502ae40a9502ac418df02ae40add02b0018dd02ae40adc", + "0x3018b902ac00a4006031720553815320c062e40a0c03831be9503815be05", + "0x15c005680312a055c8152a0558831c0055c81522056a03018b902ad00ad1", + "0x31720525015a20c062e40a4802b44180c5c8141807063812a0702b800ab9", + "0x5900a0c55831c2055c81538055883018b902ac00a4006031720553815320c", + "0x2e40ab002900180c5c8154e054c83018b9029080a720603172050601c180c", + "0x1d9e0c71815720571015a60c710157205062a818e102ae40a2e02ac4180c", + "0x31cce103815cc055c815cc0568031cc055c815ca0560031ca055c815c641", + "0x39c0ab90282c0ab106031720558014800c062e40aa8028f4180c5c8141807", + "0x3018b902aa00a3d06031720515814e40c062e40a0c03830196502831560c", + "0x2e40ae802b4c18e802ae40a0c55031ce055c81418055883018b902ac00a40", + "0x3ac0ab902bac0ad0063ac0ab902ba80ac0063a80ab902ba44e0767831d205", + "0x34c18ed02ae40ab20281818ec02ae40a0c5503018b9028300e0c75b9c0e05", + "0x300ab1063c00ab902bbc0ac0063bc0ab902bb9da0767831dc055c815d805", + "0x1418d6062ac0ab902831aa0c780300e0578015720578015a00c060157205", + "0x31aa0c1681572050635c182502ae40a0c6b83050055c81418d5062a00ab9", + "0x1f40a8c060317205060a0180c5c81418d90602c0ab902831aa0c170157205", + "0x2c0180c5c8141807062753ca93ed980caa519f57207038140eda060317205", + "0x140c056e0300c055c8140c056d83072055c81546053e83146055c8154605", + "0xf40ae0060f40ab9028f40adf060744427208f564b9028e80add060e80ab9", + "0x2a950077103084055c8148405458316699211f5720520015c20c200157205", + "0x2e40a271681dca0c20815720520815c60c1c81572051c815600c550157205", + "0x1572054c815160c0e81572050e8a00ee6060880ab9028884a07728304e05", + "0x2cc180c5c814180706032ce0c5c81d4c4203b9c18b302ae40ab3029681899", + "0x3018b90289c0a9906031720558014840c062e40aaf02900180c5c8153205", + "0x31720511015320c062e40aad02900180c5c8143a052003018b9029040ae8", + "0x2e40a2e02ba4180c5c81416057483018b902aac0ae906031720557014800c", + "0x1472053e83018b902ac80ab306031720558815320c062e40ab302a64180c", + "0x270189c02ae40a9c0289c189c02ae40a0c7503168055c8141846061180ab9", + "0x2540aeb062540ab90292094072503094055c8141848061200ab902a716807", + "0x15720555014bc0c23015720523015600c06015720506015620c2f0157205", + "0x2e40a39029f4180c5c8141807061795446062980a5e02ae40a5e02bb018aa", + "0x3018b9028300e0c065a018b903ac932077383124055c8152405580312405", + "0x31720520815d00c062e40a2702a64180c5c81560052103018b902abc0a40", + "0x2e40aae02900180c5c81444054c83018b902ab40a400603172050e814800c", + "0x1566054c83018b9028b80ae906031720505815d20c062e40aab02ba4180c", + "0x31da0c48015720506118189102ae40a92029f4180c5c81562054c83018b9", + "0x15720506120188e02ae40a8f4801d380c478157205478144e0c478157205", + "0x3018055c81418055883116055c81518057583118055c8151c8d03928188d", + "0x24418a602a2c0ab902a2c0aec062a80ab902aa80a5e062440ab902a440ab0", + "0x15dc0c2b015720559815dc0c2d015720549014fa0c062e40a0c0383116aa", + "0x14b4055803110055c81510051383110055c815145603bbc188a02ae40ab1", + "0x2100ab9029680a7d0603172050601c188602da418b903a200af0061680ab9", + "0x1560057983056a7561f8c4601e2c1720541015e60c41015720520815e40c", + "0x318a055c814f43c03bbc183c02ae40a3c0289c18c461800de72329e960b9", + "0x1880af4061800ab9029800a5a062100ab902a100ab0063140ab902b140a27", + "0x154e0b03b9818ac02ae40aac5581dcc0c3f01572053f015520c310157205", + "0x2e40a0c038318c05b5031720762815e00c158157205158b80ee60629c0ab9", + "0x3bc18c902ae40a6502bb818bf02ae40a6002bb818c702ae40a84029f4180c", + "0x3280af00631c0ab902b1c0ab0063280ab902b280a27063280ab902b257e07", + "0x15720566015600c66015720563814fa0c062e40a0c038319605b58317207", + "0x14800c062e40a7e029bc180c5c814180706032d80c5c81ce46203bd418cc", + "0x264180c5c8155a052003018b9028740a4006031720500014800c062e40aac", + "0x3018b902abc0a4006031720513815320c062e40aae02900180c5c8144405", + "0x31720561814800c062e40aa702900180c5c81588052003018b9028ac0a40", + "0x2e40a0c7b0319e055c8141846063380ab902b300a7d06031720537814de0c", + "0x31a2055c8141848063400ab902b019e074e03180055c8158005138318005", + "0x15600c06015720506015620c6a015720569815d60c698157205683440e4a", + "0x35154ce062980ad402ae40ad402bb018aa02ae40aaa0297818ce02ae40ace", + "0x3580aa606358fc075c814fc057b831aa055c81598053e83018b9028300e0c", + "0x2e40ada02a9818da3781d720537815ee0c6c81572056b815f00c6b8157205", + "0x31b8055c815b8057c831b2055c815b2057c831b8055c815b6057c031b605", + "0x2b00a400603172050601c180cb683172076e3640efa063540ab902b540ab0", + "0x15320c062e40aad02900180c5c8143a052003018b9028000a40060317205", + "0x100180c5c8155e052003018b90289c0a9906031720557014800c062e40a22", + "0x3018b902b0c0a4006031720553814800c062e40ac402900180c5c8145605", + "0x2e40a0c02ac418dd02ae40ad5029f4180c5c814fc053783018b9029bc0a6f", + "0x15aa053e83018b9028300e0c065b80a0c55831c0055c815ba0558031be05", + "0x1f80ab9029f80aa9063840ab902b840ab0060300ab9028300ab1063840ab9", + "0x2e40ee502bf018e571b88fab9029bcfce106299f60c37815720537815520c", + "0x3a4fab902b980afd063a00ab902b8c0a7d0603172050601c18e702dbdcc05", + "0x15fc0c74015720574015600c062e40aea029bc180c5c815d20537831d6ea", + "0x2e40a1d02900180c5c815d8053903018b9028300e0c76816e0ec02ae40eeb", + "0x144e054c83018b902ab80a4006031720511015320c062e40aad02900180c", + "0x29c0a4006031720562014800c062e40a2b02900180c5c8155e052003018b9", + "0x14fa0c062e40a0002900180c5c81558052003018b902b0c0a40060317205", + "0x1572050611818e002ae40aee02ac018df02ae40ae202ac418ee02ae40ae8", + "0x12018f202ae40af07781d380c780157205780144e0c780157205063fc18ef", + "0x15be0558831ea055c815e80575831e8055c815e4f30392818f302ae40a0c", + "0x3d40ab902bd40aec062a80ab902aa80a5e063800ab902b800ab00637c0ab9", + "0x3d80ab902ba00a7d06031720576814e40c062e40a0c03831eaaa7037d4c05", + "0x3c018f602ae40af602ac018f702ae40af70289c18f702ae40a005601dde0c", + "0x30d4e0777831f2055c815ec053e83018b9028300e0c7c016e20c5c81dee05", + "0x3172077d015e00c7c81572057c815600c7d01572057d0144e0c7d0157205", + "0x31fa055c815882b03bbc18fc02ae40af9029f4180c5c8141807063ec0b72", + "0x1c18fe02dcc18b903bf40af0063f00ab902bf00ab0063f40ab902bf40a27", + "0x2e40aaf8081dde0c80815720513815dc0c7f81572057e014fa0c062e40a0c", + "0x16e80c5c81e040578031fe055c815fe055803204055c8160405138320405", + "0x4140eef064140ab9028880aee064100ab902bfc0a7d0603172050601c1903", + "0x2e40f0602bc0190402ae40b0402ac0190602ae40b060289c190602ae40aae", + "0x4240ab902ab43a077783210055c81608053e83018b9028300e0c83816ea0c", + "0x321405bb031720784815e00c84015720584015600c848157205848144e0c", + "0x15720586016020c860157205062a8190b02ae40b08029f4180c5c8141807", + "0x178190b02ae40b0b02ac018e202ae40ae202ac4190e02ae40b0d02c08190d", + "0x3018b9028300e0c872aa16e2530161c055c8161c057603154055c8155405", + "0x15720506410191002ae40a0c230321e055c81610053e83018b902c280b03", + "0x128191302ae40a0c2403224055c816231003a70191102ae40b110289c1911", + "0x43c0ab0063880ab902b880ab1064540ab902c500aeb064500ab902c4a2607", + "0x322aaa87b894c058a81572058a815d80c55015720555014bc0c878157205", + "0x3018b902ab40a400603172050e814800c062e40b0702c0c180c5c8141807", + "0x2e40b180289c191802ae40a0c828322e055c8141846064580ab902c100a7d", + "0x4680ab902b9232072503232055c8141848063900ab902c622e074e0323005", + "0x14bc0c8b01572058b015600c71015720571015620c8d81572058d015d60c", + "0x40c180c5c81418070646d5516712980b1b02ae40b1b02bb018aa02ae40aaa", + "0x3018b9028880a9906031720556814800c062e40a1d02900180c5c8160605", + "0x15720506418191d02ae40a0c2303238055c815fe053e83018b902ab80a40", + "0x128192002ae40a0c240323e055c8163d1d03a70191e02ae40b1e0289c191e", + "0x4700ab0063880ab902b880ab1064880ab902c840aeb064840ab902c7e4007", + "0x3244aa8e3894c0591015720591015d80c55015720555014bc0c8e0157205", + "0x3018b902ab40a400603172050e814800c062e40afe02c0c180c5c8141807", + "0x31720557814800c062e40a2702a64180c5c8155c052003018b9028880a99", + "0x1648051383248055c81419070648c0ab9028308c0c3381572057e014fa0c", + "0x15720592c980e4a064980ab902830900c9281572059248c0e9c064900ab9", + "0x178186702ae40a6702ac018e202ae40ae202ac4192802ae40b2702bac1927", + "0x3018b9028300e0c942a8cee25301650055c81650057603154055c8155405", + "0x31720511015320c062e40aad02900180c5c8143a052003018b902bec0b03", + "0x2e40a2b02900180c5c8155e052003018b90289c0a9906031720557014800c", + "0x141908064a80ab9028308c0c9481572057c814fa0c062e40ac402900180c", + "0x4b40ab902830900c96015720595ca80e9c064ac0ab902cac0a27064ac0ab9", + "0x2c018e202ae40ae202ac4192f02ae40b2e02bac192e02ae40b2c9681c940c", + "0x2aa52e2530165e055c8165e057603154055c81554052f03252055c8165205", + "0x2e40aad02900180c5c8143a052003018b902be00b030603172050601c192f", + "0x155e052003018b90289c0a9906031720557014800c062e40a2202a64180c", + "0x30c0a4006031720553814800c062e40ac402900180c5c81456052003018b9", + "0x9c193302ae40a0c8483264055c8141846064c00ab902bd80a7d060317205", + "0x4d26a07250326a055c8141848064d00ab902cce64074e03266055c8166605", + "0x15720598015600c71015720571015620c9b81572059b015d60c9b0157205", + "0x141807064dd5530712980b3702ae40b3702bb018aa02ae40aaa029781930", + "0x2b80a4006031720511015320c062e40aad02900180c5c8143a052003018b9", + "0x14800c062e40a2b02900180c5c8155e052003018b90289c0a99060317205", + "0x100180c5c81558052003018b902b0c0a4006031720553814800c062e40ac4", + "0x2e40ae202ac4193902ae40ae702bac193802ae40ae3029f4180c5c8140005", + "0x1672055c81672057603154055c81554052f03270055c816700558031c405", + "0x1bc180c5c814c4056883018b902b2c0b030603172050601c1939554e1c4a6", + "0x3018b9028740a4006031720500014800c062e40aac02900180c5c814fc05", + "0x31720513815320c062e40aae02900180c5c81444054c83018b902ab40a40", + "0x2e40aa702900180c5c81588052003018b9028ac0a4006031720557814800c", + "0x158e053e83018b9029c80ad106031720537814de0c062e40ac302900180c", + "0x270193d02ae40b3d0289c193d02ae40a0c8503276055c8141846064e80ab9", + "0x5000aeb065000ab902cfa7e07250327e055c8141848064f80ab902cf67607", + "0x15720555014bc0c9d01572059d015600c06015720506015620ca08157205", + "0x2e40ac602c0c180c5c814180706505553a062980b4102ae40b4102bb018aa", + "0x1400052003018b902ab00a400603172053f014de0c062e40a6202b44180c", + "0x2b80a4006031720511015320c062e40aad02900180c5c8143a052003018b9", + "0x14800c062e40a2b02900180c5c8155e052003018b90289c0a99060317205", + "0x344180c5c814de053783018b902b0c0a4006031720553814800c062e40ac4", + "0x5080ab902a100a7d06031720532815320c062e40a6002a64180c5c814e405", + "0x50e00074e03286055c81686051383286055c814190b064000ab9028308c0c", + "0x157205a3815d60ca38157205a25140e4a065140ab902830900ca20157205", + "0x3b018aa02ae40aaa02978194202ae40b4202ac0180c02ae40a0c02ac41948", + "0x100180c5c8150c058183018b9028300e0ca42aa840c5301690055c8169005", + "0x3018b9029040ae806031720513815320c062e40ab002908180c5c8155e05", + "0x31720557014800c062e40a2202a64180c5c8155a052003018b9028740a40", + "0x2e40a5a029f4180c5c8145c057483018b90282c0ae906031720555815d20c", + "0x1d380c788157205788144e0c78815720506430194a02ae40a0c230329205", + "0x169a05758329a055c816974c03928194c02ae40a0c2403296055c815e34a", + "0x2a80ab902aa80a5e065240ab902d240ab0060300ab9028300ab1065380ab9", + "0x31720514015d20c062e40a0c038329caaa48314c05a70157205a7015d80c", + "0x2e40ab002908180c5c8155e052003018b902a980ab3060317205128161a0c", + "0x155a052003018b90282c0ae906031720558815320c062e40ab202acc180c", + "0xb40b0d06031720555815d20c062e40aae02900180c5c8145c057483018b9", + "0x329e055c81552053e83152055c81552055803018b902aa00b0e060317205", + "0x300ab1065480ab902d440aeb065440ab902a76a00725032a0055c8141848", + "0x157205a9015d80c4f01572054f014bc0ca78157205a7815600c060157205", + "0x2c80b77531f40eb90381c0aaf0601c0ab9028140aa6065493d4f062980b52", + "0x1562055603160055c814fa055683162055c8154c055703018b9028300e0c", + "0x155c05540315c055c81418aa0603172050601c180cbc01418ab062bc0ab9", + "0x2c00eb902ac00ac6062bc0ab902ab40aac062c00ab902ac80aad062b40ab9", + "0x3018b9028300e0c54016f2aa02ae40eaf0287418ab02ae40aac0281818ac", + "0x300f0f060a00ab9028a00a27060a00ab9028740a25060740ab902aa80a22", + "0x2e40a0c8803018b902aac0a6f0603172050601c182702de84a2203ae40e28", + "0x15720516815f20c170940eb9028940b11060ad60075c8156005630305a05", + "0x1560056303018b9028300e0c51816f60b5381d7207170b4562253448182d", + "0x2e40aa902be4189e1281d720512816220c54815720503015f00c032c00eb9", + "0x1c183d1d01ef8394e81d72074f2a54e7d8983016055c8141605568315205", + "0x18180c5c8141807061080b7d201040eb9038e44ab04ea9a240c062e40a0c", + "0x2cc8c078a8308c055c81480050303166055c81532058a03132055c8141605", + "0x1572054e0162e0c20815720520815620c4e01572055a0162c0c5a0157205", + "0x460184802ae40a0c2303018b90282c0a3d0603172050601c189c2081c0a9c", + "0x2e40a0c240312a055c814944803a70184a02ae40a4a0289c184a02ae40a0c", + "0x1080ab9029080ab1062440ab902a480ae4062480ab902a54bc0725030bc05", + "0xf4180c5c8147a058c83018b9028300e0c489080e05488157205488162e0c", + "0x3120055c814184606031720512816320c062e40ab0028f4180c5c8141605", + "0x141848062380ab902a3d20074e0311e055c8151e05138311e055c814191a", + "0x1572051d015620c45815720546015c80c460157205472340e4a062340ab9", + "0x3018b9028940b190603172050601c188b1d01c0a8b02ae40a8b02c5c183a", + "0x1572052b0144e0c2b015720506460185a02ae40a0c2303018b902ac00a3d", + "0x310c055c815148803928188802ae40a0c2403114055c814ac5a03a701856", + "0x211460702a100ab902a100b170628c0ab902a8c0ab1062100ab902a180ae4", + "0x15720541016360c410157205062a8180c5c81560051e83018b9028300e0c", + "0x304e055c8144e0558830c4055c814c0058b030c0055c81478ab03c54183c", + "0x147a0c062e40aa8029c8180c5c8141807061884e07029880ab9029880b17", + "0x1572053d2ac0f15061e80ab9029f80b1b061f80ab902831540c062e40ab0", + "0x1c0a7202ae40a7202c5c180c02ae40a0c02ac4187202ae40a6502c581865", + "0x2e40a0c0383160b103df964a603ae40e050601c0a0c062e40a0c14030e40c", + "0x2980ab1060317205062c818ae02ae40a0702a9818af02ae40ab2029f4180c", + "0x300e0c55816feac5681d7207570155e0c57815720557815600c530157205", + "0x740ab902aa80ab0062a00ab902ab00aae062a80ab902abc0a7d060317205", + "0x2e40a0c03830198002831560c11015720554015580c140157205568155a0c", + "0x15600c16815720513815500c138157205062a8182502ae40aaf029f4180c", + "0x2e40a2802818182202ae40a2d02ab0182802ae40aab02ab4181d02ae40a25", + "0x2c0ab9028740a7d0603172050601c18a702e045c055c81c44050e8305605", + "0x144e0c05815720505815600c0301572053e8154c0c51815720517014440c", + "0x2c0a7d0603172050601c189d02e093ca903ae40e0602abc18a302ae40aa3", + "0x157205518144a0c1e8157205548140c0c1d01572054f014440c1c8157205", + "0x3084055c814804103bbc184002ae40a400289c184002ae40a3a028941841", + "0x1080af0060f40ab9028f40aa9060e40ab9028e40ab0061080ab9029080a27", + "0x3166055c81472053e83018b902830500c062e40a0c038313205c18317207", + "0xf40aa9060ac0ab9028ac0aa9062cc0ab902acc0ab0062980ab902a980ab1", + "0x2e40a0c0383138b4231f40a9c5a118fab9028f456b353299f60c1e8157205", + "0x2e40a0c5503090055c81472053e83018b902a640b03060317205060a0180c", + "0x1572052f0163c0c2f01572054a8f4567d8e8312a055c81494058e0309405", + "0x1f40a9202ae40a9202c7c184802ae40a4802ac018a602ae40aa602ac41892", + "0x1546052003018b902a740a3d060317205060a0180c5c81418070624890a6", + "0x32400c48015720506118189102ae40a0b029f4180c5c81456053783018b9", + "0x15720506120188e02ae40a8f4801d380c478157205478144e0c478157205", + "0x314c055c8154c055883116055c81518059083118055c8151c8d03928188d", + "0x3018b9028300e0c45a454c7d02a2c0ab902a2c0b1f062440ab902a440ab0", + "0x1580ab902831540c2d01572050e814fa0c062e40aa7029c8180c5c8141828", + "0x310c055c81510058f03110055c815147d159f63a0c4501572052b016440c", + "0x1694c7d02a180ab902a180b1f061680ab9029680ab0062980ab902a980ab1", + "0x2e40ab0029f4180c5c8140e053783018b9029f40a6f0603172050601c1886", + "0x1d380c1e01572051e0144e0c1e015720506188188202ae40a0c230310805", + "0x14fc0590830fc055c814c06203928186202ae40a0c24030c0055c8147882", + "0x1e80ab9029e80b1f062100ab902a100ab0062c40ab902ac40ab1061e80ab9", + "0x1f81807138300e0c3e81c0a0c42118de0c5309c8c6f06299647a422c4fa05", + "0x2c564a63e81c0a0c45118de0c530180c061e0e8723944118de0c566100a0c", + "0x1f40e050629cde0c3e89c4e6f0629b0c05062541807138300f8556ab95eb0", + "0x187" ], "sierra_program_debug_info": { "type_names": [], diff --git a/crates/blockifier/feature_contracts/cairo1/test_contract.cairo b/crates/blockifier/feature_contracts/cairo1/test_contract.cairo index 25b5c064c13..05d7bce0229 100644 --- a/crates/blockifier/feature_contracts/cairo1/test_contract.cairo +++ b/crates/blockifier/feature_contracts/cairo1/test_contract.cairo @@ -30,6 +30,7 @@ mod TestContract { #[storage] struct Storage { my_storage_var: felt252, + revert_test_storage_var: felt252, two_counters: starknet::storage::Map, ec_point: (felt252, felt252), } @@ -96,15 +97,78 @@ mod TestContract { } #[external(v0)] - fn test_revert_helper(ref self: ContractState, class_hash: ClassHash) { + fn test_revert_helper(ref self: ContractState, replacement_class_hash: ClassHash, to_panic: bool) { let dummy_span = array![0].span(); syscalls::emit_event_syscall(dummy_span, dummy_span).unwrap_syscall(); - syscalls::replace_class_syscall(class_hash).unwrap_syscall(); + syscalls::replace_class_syscall(replacement_class_hash).unwrap_syscall(); syscalls::send_message_to_l1_syscall(17.try_into().unwrap(), dummy_span).unwrap_syscall(); self.my_storage_var.write(17); - panic(array!['test_revert_helper']); + if to_panic { + panic(array!['test_revert_helper']); + } + } + + #[external(v0)] + fn write_10_to_my_storage_var(ref self: ContractState) { + self.my_storage_var.write(10); } + /// Tests the behavior of a revert scenario with an inner contract call. + /// The function performs the following: + /// 1. Calls `write_10_to_my_storage_var` to set the storage variable to 10. + /// 2. Calls `test_revert_helper` with `to_panic=true`. + /// - `test_revert_helper` is expected to change the storage variable to 17 and then panic. + /// 3. Verifies that the `test_revert_helper` changes are reverted, + /// ensuring the storage variable remains 10. + #[external(v0)] + fn test_revert_with_inner_call_and_reverted_storage( + ref self: ContractState, + contract_address: ContractAddress, + replacement_class_hash: ClassHash, + ) { + // Step 1: Call the contract to set the storage variable to 10. + syscalls::call_contract_syscall( + contract_address, + selector!("write_10_to_my_storage_var"), + array![].span(), + ) + .unwrap_syscall(); + + // Step 2: Prepare the call to `test_revert_helper` with `to_panic = true`. + let to_panic = true; + let call_data = array![replacement_class_hash.into(), to_panic.into()]; + + // Step 3: Call `test_revert_helper` and handle the expected panic. + match syscalls::call_contract_syscall( + contract_address, + selector!("test_revert_helper"), + call_data.span(), + ) { + Result::Ok(_) => panic(array!['should_panic']), + Result::Err(_revert_reason) => { + // Verify that the changes made by the second call are reverted. + assert( + self.my_storage_var.read() == 10, + 'Wrong_storage_value.', + ); + } + } + } + + #[external(v0)] + fn middle_revert_contract( + ref self: ContractState, + contract_address: ContractAddress, + entry_point_selector: felt252, + calldata: Array::, + ) { + syscalls::call_contract_syscall( + contract_address, entry_point_selector, calldata.span() + ).unwrap_syscall(); + panic(array!['execute_and_revert']); + } + + #[external(v0)] fn test_emit_events( self: @ContractState, events_number: u64, keys: Array::, data: Array:: @@ -635,6 +699,7 @@ mod TestContract { ) { let class_hash_before_call = syscalls::get_class_hash_at_syscall(contract_address) .unwrap_syscall(); + self.revert_test_storage_var.write(7); match syscalls::call_contract_syscall( contract_address, entry_point_selector, calldata.span() ) { @@ -645,15 +710,20 @@ mod TestContract { let inner_error = *error_span.pop_back().unwrap(); if entry_point_selector == selector!("bad_selector") { assert(inner_error == 'ENTRYPOINT_NOT_FOUND', 'Unexpected error'); - } else { + } else if entry_point_selector == selector!("test_revert_helper") { assert(inner_error == 'test_revert_helper', 'Unexpected error'); } + else { + assert(entry_point_selector == selector!("middle_revert_contract"), 'Wrong Entry Point'); + assert(inner_error == 'execute_and_revert', 'Wrong_error'); + } }, }; let class_hash_after_call = syscalls::get_class_hash_at_syscall(contract_address) .unwrap_syscall(); assert(self.my_storage_var.read() == 0, 'values should not change.'); assert(class_hash_before_call == class_hash_after_call, 'class hash should not change.'); + assert(self.revert_test_storage_var.read() == 7, 'test_storage_var_changed.'); } #[external(v0)] @@ -661,4 +731,8 @@ mod TestContract { let result = num; result } + + #[external(v0)] + fn empty_function(ref self: ContractState) { + } } diff --git a/crates/blockifier/resources/versioned_constants_0_13_0.json b/crates/blockifier/resources/versioned_constants_0_13_0.json index b5a7203236f..4ca11cb656f 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_0.json +++ b/crates/blockifier/resources/versioned_constants_0_13_0.json @@ -4,7 +4,6 @@ "max_contract_bytecode_size": 61440 }, "invoke_tx_max_n_steps": 3000000, - "execute_max_sierra_gas": 10000000000, "max_recursion_depth": 50, "segment_arena_cells": true, "disable_cairo0_redeclaration": false, @@ -71,17 +70,21 @@ "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "default_entry_point_selector": 0, + "validate_max_sierra_gas": 10000000000, + "execute_max_sierra_gas": 10000000000, "stored_block_hash_buffer": 10, "step_gas_cost": 100, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 0, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 0, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "memory_hole_gas_cost": 10, "os_contract_addresses": { "block_hash_contract_address": 1, @@ -97,15 +100,6 @@ "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "error_block_number_out_of_range": "Block number out of range", "error_out_of_gas": "Out of gas", "error_entry_point_failed": "ENTRYPOINT_FAILED", @@ -120,13 +114,11 @@ "syscall_gas_costs": { "call_contract": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "deploy": { "syscall_base_gas_cost": 1, - "step_gas_cost": 700, - "entry_point_initial_budget": 1 + "step_gas_cost": 700 }, "get_block_hash": { "syscall_base_gas_cost": 1, @@ -138,8 +130,7 @@ }, "library_call": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "replace_class": { "syscall_base_gas_cost": 1, @@ -167,48 +158,48 @@ }, "secp256k1_add": { "step_gas_cost": 406, - "range_check_gas_cost": 29 + "range_check": 29 }, "secp256k1_get_point_from_x": { "step_gas_cost": 391, - "range_check_gas_cost": 30, + "range_check": 30, "memory_hole_gas_cost": 20 }, "secp256k1_get_xy": { "step_gas_cost": 239, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256k1_mul": { "step_gas_cost": 76401, - "range_check_gas_cost": 7045 + "range_check": 7045 }, "secp256k1_new": { "step_gas_cost": 475, - "range_check_gas_cost": 35, + "range_check": 35, "memory_hole_gas_cost": 40 }, "secp256r1_add": { "step_gas_cost": 589, - "range_check_gas_cost": 57 + "range_check": 57 }, "secp256r1_get_point_from_x": { "step_gas_cost": 510, - "range_check_gas_cost": 44, + "range_check": 44, "memory_hole_gas_cost": 20 }, "secp256r1_get_xy": { "step_gas_cost": 241, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256r1_mul": { "step_gas_cost": 125240, - "range_check_gas_cost": 13961 + "range_check": 13961 }, "secp256r1_new": { "step_gas_cost": 594, - "range_check_gas_cost": 49, + "range_check": 49, "memory_hole_gas_cost": 40 }, "keccak": { @@ -217,7 +208,7 @@ "keccak_round_cost": 180000, "sha256_process_block": { "step_gas_cost": 0, - "range_check_gas_cost": 0, + "range_check": 0, "syscall_base_gas_cost": 0 } } @@ -305,7 +296,7 @@ "n_memory_holes": 0, "n_steps": 44 }, - "Keccak": { + "KeccakRound": { "builtin_instance_counter": { "bitwise_builtin": 6, "keccak_builtin": 1, @@ -314,6 +305,11 @@ "n_memory_holes": 0, "n_steps": 381 }, + "Keccak": { + "builtin_instance_counter": {}, + "n_memory_holes": 0, + "n_steps": 0 + }, "LibraryCall": { "builtin_instance_counter": { "range_check_builtin": 19 @@ -566,8 +562,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ diff --git a/crates/blockifier/resources/versioned_constants_0_13_1.json b/crates/blockifier/resources/versioned_constants_0_13_1.json index cb05b58cb7b..f026a9b5e5e 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_1.json +++ b/crates/blockifier/resources/versioned_constants_0_13_1.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 4000000, - "execute_max_sierra_gas": 10000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -71,17 +70,21 @@ "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "default_entry_point_selector": 0, + "validate_max_sierra_gas": 10000000000, + "execute_max_sierra_gas": 10000000000, "stored_block_hash_buffer": 10, "step_gas_cost": 100, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 0, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 0, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "os_contract_addresses": { "block_hash_contract_address": 1, "alias_contract_address": 2, @@ -97,15 +100,6 @@ "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "error_block_number_out_of_range": "Block number out of range", "error_out_of_gas": "Out of gas", "error_entry_point_failed": "ENTRYPOINT_FAILED", @@ -124,13 +118,11 @@ "syscall_gas_costs": { "call_contract": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "deploy": { "syscall_base_gas_cost": 1, - "step_gas_cost": 700, - "entry_point_initial_budget": 1 + "step_gas_cost": 700 }, "get_block_hash": { "syscall_base_gas_cost": 1, @@ -142,8 +134,7 @@ }, "library_call": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "replace_class": { "syscall_base_gas_cost": 1, @@ -171,50 +162,50 @@ }, "secp256k1_add": { "step_gas_cost": 406, - "range_check_gas_cost": 29 + "range_check": 29 }, "secp256k1_get_point_from_x": { "step_gas_cost": 391, - "range_check_gas_cost": 30, + "range_check": 30, "memory_hole_gas_cost": 20 }, "secp256k1_get_xy": { "step_gas_cost": 239, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256k1_mul": { "step_gas_cost": 76501, - "range_check_gas_cost": 7045, + "range_check": 7045, "memory_hole_gas_cost": 2 }, "secp256k1_new": { "step_gas_cost": 475, - "range_check_gas_cost": 35, + "range_check": 35, "memory_hole_gas_cost": 40 }, "secp256r1_add": { "step_gas_cost": 589, - "range_check_gas_cost": 57 + "range_check": 57 }, "secp256r1_get_point_from_x": { "step_gas_cost": 510, - "range_check_gas_cost": 44, + "range_check": 44, "memory_hole_gas_cost": 20 }, "secp256r1_get_xy": { "step_gas_cost": 241, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256r1_mul": { "step_gas_cost": 125340, - "range_check_gas_cost": 13961, + "range_check": 13961, "memory_hole_gas_cost": 2 }, "secp256r1_new": { "step_gas_cost": 594, - "range_check_gas_cost": 49, + "range_check": 49, "memory_hole_gas_cost": 40 }, "keccak": { @@ -223,7 +214,7 @@ "keccak_round_cost": 180000, "sha256_process_block": { "step_gas_cost": 0, - "range_check_gas_cost": 0, + "range_check": 0, "syscall_base_gas_cost": 0 } } @@ -321,7 +312,7 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { + "KeccakRound": { "n_steps": 381, "builtin_instance_counter": { "bitwise_builtin": 6, @@ -330,6 +321,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 751, "builtin_instance_counter": { @@ -602,8 +598,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ diff --git a/crates/blockifier/resources/versioned_constants_0_13_1_1.json b/crates/blockifier/resources/versioned_constants_0_13_1_1.json index 4f9f5885cf4..c13cc311775 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_1_1.json +++ b/crates/blockifier/resources/versioned_constants_0_13_1_1.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 4000000, - "execute_max_sierra_gas": 10000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -71,17 +70,21 @@ "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "default_entry_point_selector": 0, + "validate_max_sierra_gas": 10000000000, + "execute_max_sierra_gas": 10000000000, "stored_block_hash_buffer": 10, "step_gas_cost": 100, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 0, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 0, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "memory_hole_gas_cost": 10, "os_contract_addresses": { "block_hash_contract_address": 1, @@ -97,15 +100,6 @@ "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "error_block_number_out_of_range": "Block number out of range", "error_out_of_gas": "Out of gas", "error_entry_point_failed": "ENTRYPOINT_FAILED", @@ -124,13 +118,11 @@ "syscall_gas_costs": { "call_contract": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "deploy": { "syscall_base_gas_cost": 1, - "step_gas_cost": 700, - "entry_point_initial_budget": 1 + "step_gas_cost": 700 }, "get_block_hash": { "syscall_base_gas_cost": 1, @@ -142,8 +134,7 @@ }, "library_call": { "syscall_base_gas_cost": 1, - "step_gas_cost": 510, - "entry_point_initial_budget": 1 + "step_gas_cost": 510 }, "replace_class": { "syscall_base_gas_cost": 1, @@ -171,50 +162,50 @@ }, "secp256k1_add": { "step_gas_cost": 406, - "range_check_gas_cost": 29 + "range_check": 29 }, "secp256k1_get_point_from_x": { "step_gas_cost": 391, - "range_check_gas_cost": 30, + "range_check": 30, "memory_hole_gas_cost": 20 }, "secp256k1_get_xy": { "step_gas_cost": 239, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256k1_mul": { "step_gas_cost": 76501, - "range_check_gas_cost": 7045, + "range_check": 7045, "memory_hole_gas_cost": 2 }, "secp256k1_new": { "step_gas_cost": 475, - "range_check_gas_cost": 35, + "range_check": 35, "memory_hole_gas_cost": 40 }, "secp256r1_add": { "step_gas_cost": 589, - "range_check_gas_cost": 57 + "range_check": 57 }, "secp256r1_get_point_from_x": { "step_gas_cost": 510, - "range_check_gas_cost": 44, + "range_check": 44, "memory_hole_gas_cost": 20 }, "secp256r1_get_xy": { "step_gas_cost": 241, - "range_check_gas_cost": 11, + "range_check": 11, "memory_hole_gas_cost": 40 }, "secp256r1_mul": { "step_gas_cost": 125340, - "range_check_gas_cost": 13961, + "range_check": 13961, "memory_hole_gas_cost": 2 }, "secp256r1_new": { "step_gas_cost": 594, - "range_check_gas_cost": 49, + "range_check": 49, "memory_hole_gas_cost": 40 }, "keccak": { @@ -223,7 +214,7 @@ "keccak_round_cost": 180000, "sha256_process_block": { "step_gas_cost": 0, - "range_check_gas_cost": 0, + "range_check": 0, "syscall_base_gas_cost": 0 } } @@ -321,7 +312,7 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { + "KeccakRound": { "n_steps": 381, "builtin_instance_counter": { "bitwise_builtin": 6, @@ -330,6 +321,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 751, "builtin_instance_counter": { @@ -602,8 +598,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ diff --git a/crates/blockifier/resources/versioned_constants_0_13_2.json b/crates/blockifier/resources/versioned_constants_0_13_2.json index 571cce2ee0b..55eb3185e05 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_2.json +++ b/crates/blockifier/resources/versioned_constants_0_13_2.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 10000000, - "execute_max_sierra_gas": 10000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -58,7 +57,6 @@ "max_recursion_depth": 50, "segment_arena_cells": false, "os_constants": { - "block_hash_contract_address": 1, "constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "default_entry_point_selector": 0, "entry_point_initial_budget": { @@ -74,10 +72,7 @@ "error_entry_point_failed": "ENTRYPOINT_FAILED", "error_entry_point_not_found": "ENTRYPOINT_NOT_FOUND", "execute_entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, + "execute_max_sierra_gas": 10000000000, "default_initial_gas_cost": { "step_gas_cost": 100000000 }, @@ -93,30 +88,28 @@ "alias_contract_address": 2, "reserved_contract_address": 3 }, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 594, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 594, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "sierra_array_len_bound": 4294967296, "step_gas_cost": 100, "stored_block_hash_buffer": 10, "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "validate_declare_entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "validate_entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "validate_max_sierra_gas": 10000000000, "validate_rounding_consts": { "validate_block_number_rounding": 100, "validate_timestamp_rounding": 3600 @@ -124,12 +117,10 @@ "validated": "VALID", "syscall_gas_costs": { "call_contract": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "deploy": { - "entry_point_initial_budget": 1, "step_gas_cost": 700, "syscall_base_gas_cost": 1 }, @@ -150,14 +141,13 @@ }, "keccak_round_cost": 180000, "library_call": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "sha256_process_block": { "step_gas_cost": 1852, - "range_check_gas_cost": 65, - "bitwise_builtin_gas_cost": 1115, + "range_check": 65, + "bitwise": 1115, "syscall_base_gas_cost": 1 }, "replace_class": { @@ -165,51 +155,51 @@ "syscall_base_gas_cost": 1 }, "secp256k1_add": { - "range_check_gas_cost": 29, + "range_check": 29, "step_gas_cost": 406 }, "secp256k1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 30, + "range_check": 30, "step_gas_cost": 391 }, "secp256k1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 239 }, "secp256k1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 7045, + "range_check": 7045, "step_gas_cost": 76501 }, "secp256k1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 35, + "range_check": 35, "step_gas_cost": 475 }, "secp256r1_add": { - "range_check_gas_cost": 57, + "range_check": 57, "step_gas_cost": 589 }, "secp256r1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 44, + "range_check": 44, "step_gas_cost": 510 }, "secp256r1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 241 }, "secp256r1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 13961, + "range_check": 13961, "step_gas_cost": 125340 }, "secp256r1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 49, + "range_check": 49, "step_gas_cost": 594 }, "send_message_to_l1": { @@ -323,7 +313,7 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { + "KeccakRound": { "n_steps": 381, "builtin_instance_counter": { "bitwise_builtin": 6, @@ -332,6 +322,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 818, "builtin_instance_counter": { @@ -609,8 +604,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ diff --git a/crates/blockifier/resources/versioned_constants_0_13_2_1.json b/crates/blockifier/resources/versioned_constants_0_13_2_1.json index ea79b39e532..4364ffc0c68 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_2_1.json +++ b/crates/blockifier/resources/versioned_constants_0_13_2_1.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 10000000, - "execute_max_sierra_gas": 10000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -58,7 +57,6 @@ "enable_reverts": false, "segment_arena_cells": false, "os_constants": { - "block_hash_contract_address": 1, "constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "default_entry_point_selector": 0, "entry_point_initial_budget": { @@ -74,10 +72,7 @@ "error_entry_point_failed": "ENTRYPOINT_FAILED", "error_entry_point_not_found": "ENTRYPOINT_NOT_FOUND", "execute_entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, + "execute_max_sierra_gas": 10000000000, "default_initial_gas_cost": { "step_gas_cost": 100000000 }, @@ -93,30 +88,28 @@ "alias_contract_address": 2, "reserved_contract_address": 3 }, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 594, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 594, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "sierra_array_len_bound": 4294967296, "step_gas_cost": 100, "stored_block_hash_buffer": 10, "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "validate_declare_entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "validate_entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "validate_max_sierra_gas": 10000000000, "validate_rounding_consts": { "validate_block_number_rounding": 100, "validate_timestamp_rounding": 3600 @@ -124,12 +117,10 @@ "validated": "VALID", "syscall_gas_costs": { "call_contract": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "deploy": { - "entry_point_initial_budget": 1, "step_gas_cost": 700, "syscall_base_gas_cost": 1 }, @@ -150,14 +141,13 @@ }, "keccak_round_cost": 180000, "library_call": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "sha256_process_block": { "step_gas_cost": 1852, - "range_check_gas_cost": 65, - "bitwise_builtin_gas_cost": 1115, + "range_check": 65, + "bitwise": 1115, "syscall_base_gas_cost": 1 }, "replace_class": { @@ -165,51 +155,51 @@ "syscall_base_gas_cost": 1 }, "secp256k1_add": { - "range_check_gas_cost": 29, + "range_check": 29, "step_gas_cost": 406 }, "secp256k1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 30, + "range_check": 30, "step_gas_cost": 391 }, "secp256k1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 239 }, "secp256k1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 7045, + "range_check": 7045, "step_gas_cost": 76501 }, "secp256k1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 35, + "range_check": 35, "step_gas_cost": 475 }, "secp256r1_add": { - "range_check_gas_cost": 57, + "range_check": 57, "step_gas_cost": 589 }, "secp256r1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 44, + "range_check": 44, "step_gas_cost": 510 }, "secp256r1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 241 }, "secp256r1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 13961, + "range_check": 13961, "step_gas_cost": 125340 }, "secp256r1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 49, + "range_check": 49, "step_gas_cost": 594 }, "send_message_to_l1": { @@ -323,7 +313,7 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { + "KeccakRound": { "n_steps": 381, "builtin_instance_counter": { "bitwise_builtin": 6, @@ -332,6 +322,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 818, "builtin_instance_counter": { @@ -609,8 +604,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ diff --git a/crates/blockifier/resources/versioned_constants_0_13_3.json b/crates/blockifier/resources/versioned_constants_0_13_3.json index ea79b39e532..337622362fe 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_3.json +++ b/crates/blockifier/resources/versioned_constants_0_13_3.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 10000000, - "execute_max_sierra_gas": 10000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -58,7 +57,6 @@ "enable_reverts": false, "segment_arena_cells": false, "os_constants": { - "block_hash_contract_address": 1, "constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "default_entry_point_selector": 0, "entry_point_initial_budget": { @@ -74,10 +72,7 @@ "error_entry_point_failed": "ENTRYPOINT_FAILED", "error_entry_point_not_found": "ENTRYPOINT_NOT_FOUND", "execute_entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", - "fee_transfer_gas_cost": { - "entry_point_initial_budget": 1, - "step_gas_cost": 600 - }, + "execute_max_sierra_gas": 10000000000, "default_initial_gas_cost": { "step_gas_cost": 100000000 }, @@ -93,30 +88,28 @@ "alias_contract_address": 2, "reserved_contract_address": 3 }, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 0, - "pedersen_gas_cost": 0, - "bitwise_builtin_gas_cost": 594, - "ecop_gas_cost": 0, - "poseidon_gas_cost": 0, - "add_mod_gas_cost": 0, - "mul_mod_gas_cost": 0, - "ecdsa_gas_cost": 0, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 0, + "pedersen": 0, + "bitwise": 594, + "ecop": 0, + "poseidon": 0, + "add_mod": 0, + "mul_mod": 0, + "ecdsa": 0 + }, "sierra_array_len_bound": 4294967296, "step_gas_cost": 100, "stored_block_hash_buffer": 10, "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "transaction_gas_cost": { - "entry_point_initial_budget": 2, - "fee_transfer_gas_cost": 1, - "step_gas_cost": 1100 - }, "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "validate_declare_entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "validate_entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "validate_max_sierra_gas": 10000000000, "validate_rounding_consts": { "validate_block_number_rounding": 100, "validate_timestamp_rounding": 3600 @@ -124,12 +117,10 @@ "validated": "VALID", "syscall_gas_costs": { "call_contract": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "deploy": { - "entry_point_initial_budget": 1, "step_gas_cost": 700, "syscall_base_gas_cost": 1 }, @@ -150,14 +141,13 @@ }, "keccak_round_cost": 180000, "library_call": { - "entry_point_initial_budget": 1, "step_gas_cost": 510, "syscall_base_gas_cost": 1 }, "sha256_process_block": { "step_gas_cost": 1852, - "range_check_gas_cost": 65, - "bitwise_builtin_gas_cost": 1115, + "range_check": 65, + "bitwise": 1115, "syscall_base_gas_cost": 1 }, "replace_class": { @@ -165,51 +155,51 @@ "syscall_base_gas_cost": 1 }, "secp256k1_add": { - "range_check_gas_cost": 29, + "range_check": 29, "step_gas_cost": 406 }, "secp256k1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 30, + "range_check": 30, "step_gas_cost": 391 }, "secp256k1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 239 }, "secp256k1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 7045, + "range_check": 7045, "step_gas_cost": 76501 }, "secp256k1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 35, + "range_check": 35, "step_gas_cost": 475 }, "secp256r1_add": { - "range_check_gas_cost": 57, + "range_check": 57, "step_gas_cost": 589 }, "secp256r1_get_point_from_x": { "memory_hole_gas_cost": 20, - "range_check_gas_cost": 44, + "range_check": 44, "step_gas_cost": 510 }, "secp256r1_get_xy": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, + "range_check": 11, "step_gas_cost": 241 }, "secp256r1_mul": { "memory_hole_gas_cost": 2, - "range_check_gas_cost": 13961, + "range_check": 13961, "step_gas_cost": 125340 }, "secp256r1_new": { "memory_hole_gas_cost": 40, - "range_check_gas_cost": 49, + "range_check": 49, "step_gas_cost": 594 }, "send_message_to_l1": { @@ -323,7 +313,7 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { + "KeccakRound": { "n_steps": 381, "builtin_instance_counter": { "bitwise_builtin": 6, @@ -332,6 +322,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 0, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 818, "builtin_instance_counter": { @@ -609,8 +604,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 10000000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "100.0.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ @@ -663,4 +657,4 @@ 10000 ] } -} +} \ No newline at end of file diff --git a/crates/blockifier/resources/versioned_constants_0_13_4.json b/crates/blockifier/resources/versioned_constants_0_13_4.json index dbb15ca39d4..6c967161a8f 100644 --- a/crates/blockifier/resources/versioned_constants_0_13_4.json +++ b/crates/blockifier/resources/versioned_constants_0_13_4.json @@ -9,7 +9,6 @@ "max_contract_bytecode_size": 81920 }, "invoke_tx_max_n_steps": 10000000, - "execute_max_sierra_gas": 1000000000, "deprecated_l2_resource_gas_costs": { "gas_per_data_felt": [ 128, @@ -58,7 +57,6 @@ "max_recursion_depth": 50, "segment_arena_cells": false, "os_constants": { - "block_hash_contract_address": 1, "constructor_entry_point_selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", "default_entry_point_selector": 0, "entry_point_initial_budget": { @@ -74,6 +72,7 @@ "error_entry_point_failed": "ENTRYPOINT_FAILED", "error_entry_point_not_found": "ENTRYPOINT_NOT_FOUND", "execute_entry_point_selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", + "execute_max_sierra_gas": 1000000000, "default_initial_gas_cost": { "step_gas_cost": 100000000 }, @@ -91,144 +90,33 @@ "alias_contract_address": 2, "reserved_contract_address": 3 }, - "range_check_gas_cost": 70, - "keccak_builtin_gas_cost": 136189, - "pedersen_gas_cost": 4050, - "bitwise_builtin_gas_cost": 583, - "ecop_gas_cost": 4085, - "poseidon_gas_cost": 491, - "add_mod_gas_cost": 230, - "mul_mod_gas_cost": 604, - "ecdsa_gas_cost": 10561, + "builtin_gas_costs": { + "range_check": 70, + "keccak": 136189, + "pedersen": 4050, + "bitwise": 583, + "ecop": 4085, + "poseidon": 491, + "add_mod": 230, + "mul_mod": 604, + "ecdsa": 10561 + }, "sierra_array_len_bound": 4294967296, "step_gas_cost": 100, "stored_block_hash_buffer": 10, "syscall_base_gas_cost": { "step_gas_cost": 100 }, - "transaction_gas_cost": { - "step_gas_cost": 4098, - "pedersen_gas_cost": 4, - "range_check_gas_cost": 77, - "poseidon_gas_cost": 11 - }, "transfer_entry_point_selector": "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "validate_declare_entry_point_selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", "validate_deploy_entry_point_selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", "validate_entry_point_selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "validate_max_sierra_gas": 100000000, "validate_rounding_consts": { "validate_block_number_rounding": 100, "validate_timestamp_rounding": 3600 }, - "validated": "VALID", - "syscall_gas_costs": { - "call_contract": { - "entry_point_initial_budget": 1, - "step_gas_cost": 860, - "range_check_gas_cost": 15 - }, - "deploy": { - "entry_point_initial_budget": 1, - "step_gas_cost": 1128, - "range_check_gas_cost": 18, - "pedersen_gas_cost": 7 - }, - "emit_event": { - "step_gas_cost": 100, - "range_check_gas_cost": 1 - }, - "get_block_hash": { - "step_gas_cost": 104, - "range_check_gas_cost": 2 - }, - "get_execution_info": { - "step_gas_cost": 100, - "range_check_gas_cost": 1 - }, - "keccak": { - "syscall_base_gas_cost": 1 - }, - "keccak_round_cost": 180000, - "library_call": { - "entry_point_initial_budget": 1, - "step_gas_cost": 836, - "range_check_gas_cost": 15 - }, - "sha256_process_block": { - "step_gas_cost": 1855, - "range_check_gas_cost": 65, - "bitwise_builtin_gas_cost": 1115, - "syscall_base_gas_cost": 1 - }, - "replace_class": { - "step_gas_cost": 104, - "range_check_gas_cost": 1 - }, - "secp256k1_add": { - "range_check_gas_cost": 29, - "step_gas_cost": 410 - }, - "secp256k1_get_point_from_x": { - "memory_hole_gas_cost": 20, - "range_check_gas_cost": 30, - "step_gas_cost": 395 - }, - "secp256k1_get_xy": { - "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, - "step_gas_cost": 207 - }, - "secp256k1_mul": { - "memory_hole_gas_cost": 2, - "range_check_gas_cost": 7045, - "step_gas_cost": 76505 - }, - "secp256k1_new": { - "memory_hole_gas_cost": 40, - "range_check_gas_cost": 35, - "step_gas_cost": 461 - }, - "secp256r1_add": { - "range_check_gas_cost": 57, - "step_gas_cost": 593 - }, - "secp256r1_get_point_from_x": { - "memory_hole_gas_cost": 20, - "range_check_gas_cost": 44, - "step_gas_cost": 514 - }, - "secp256r1_get_xy": { - "memory_hole_gas_cost": 40, - "range_check_gas_cost": 11, - "step_gas_cost": 209 - }, - "secp256r1_mul": { - "memory_hole_gas_cost": 2, - "range_check_gas_cost": 13961, - "step_gas_cost": 125344 - }, - "secp256r1_new": { - "memory_hole_gas_cost": 40, - "range_check_gas_cost": 49, - "step_gas_cost": 580 - }, - "send_message_to_l1": { - "step_gas_cost": 141, - "range_check_gas_cost": 1 - }, - "storage_read": { - "step_gas_cost": 100, - "range_check_gas_cost": 1 - }, - "storage_write": { - "step_gas_cost": 100, - "range_check_gas_cost": 1 - }, - "get_class_hash_at": { - "step_gas_cost": 100, - "range_check_gas_cost": 1 - } - } + "validated": "VALID" }, "os_resources": { "execute_syscalls": { @@ -323,8 +211,8 @@ "builtin_instance_counter": {}, "n_memory_holes": 0 }, - "Keccak": { - "n_steps": 381, + "KeccakRound": { + "n_steps": 281, "builtin_instance_counter": { "bitwise_builtin": 6, "keccak_builtin": 1, @@ -332,6 +220,11 @@ }, "n_memory_holes": 0 }, + "Keccak": { + "n_steps": 100, + "builtin_instance_counter": {}, + "n_memory_holes": 0 + }, "LibraryCall": { "n_steps": 842, "builtin_instance_counter": { @@ -612,8 +505,7 @@ } }, "validate_max_n_steps": 1000000, - "validate_max_sierra_gas": 100000000, - "min_compiler_version_for_sierra_gas": "2.8.0", + "min_sierra_version_for_sierra_gas": "1.7.0", "vm_resource_fee_cost": { "builtins": { "add_mod_builtin": [ @@ -666,4 +558,4 @@ 10000 ] } -} +} \ No newline at end of file diff --git a/crates/blockifier/src/abi/constants.rs b/crates/blockifier/src/abi/constants.rs index ba8ed1e896b..3ee51f45754 100644 --- a/crates/blockifier/src/abi/constants.rs +++ b/crates/blockifier/src/abi/constants.rs @@ -1,9 +1,3 @@ -use starknet_api::transaction::TransactionVersion; -use starknet_types_core::felt::Felt; - -// The version is considered 0 for L1-Handler transaction hash calculation purposes. -pub const L1_HANDLER_VERSION: TransactionVersion = TransactionVersion(Felt::ZERO); - // OS-related constants. pub const L1_TO_L2_MSG_HEADER_SIZE: usize = 5; pub const L2_TO_L1_MSG_HEADER_SIZE: usize = 3; @@ -27,8 +21,6 @@ pub const CONSUMED_MSG_TO_L2_ENCODED_DATA_SIZE: usize = // Transaction resource names. // TODO(Amos, 1/10/2024): Rename to l1_gas_weight. pub const L1_GAS_USAGE: &str = "gas_weight"; -pub const L2_GAS_USAGE: &str = "l2_gas_weight"; -pub const BLOB_GAS_USAGE: &str = "l1_blob_gas_usage"; pub const N_STEPS_RESOURCE: &str = "n_steps"; pub const N_EVENTS: &str = "n_events"; pub const MESSAGE_SEGMENT_LENGTH: &str = "message_segment_length"; diff --git a/crates/blockifier/src/abi/sierra_types.rs b/crates/blockifier/src/abi/sierra_types.rs index 121a5b84b3b..620fdd97a93 100644 --- a/crates/blockifier/src/abi/sierra_types.rs +++ b/crates/blockifier/src/abi/sierra_types.rs @@ -3,26 +3,18 @@ use cairo_vm::types::relocatable::Relocatable; use cairo_vm::vm::errors::memory_errors::MemoryError; use cairo_vm::vm::vm_core::VirtualMachine; use num_bigint::{BigUint, ToBigUint}; -use num_traits::ToPrimitive; -use starknet_api::core::ContractAddress; +use starknet_api::core::{felt_to_u128, ContractAddress}; use starknet_api::state::StorageKey; use starknet_api::StarknetApiError; -use starknet_types_core::felt::Felt; use thiserror::Error; use crate::state::errors::StateError; use crate::state::state_api::StateReader; -#[cfg(test)] -#[path = "sierra_types_test.rs"] -mod test; - pub type SierraTypeResult = Result; #[derive(Debug, Error)] pub enum SierraTypeError { - #[error("Felt {val} is too big to convert to '{ty}'.")] - ValueTooLargeForType { val: Felt, ty: &'static str }, #[error(transparent)] MemoryError(#[from] MemoryError), #[error(transparent)] @@ -43,12 +35,6 @@ pub trait SierraType: Sized { ) -> SierraTypeResult; } -// Utils. - -fn felt_to_u128(felt: &Felt) -> Result { - felt.to_u128().ok_or(SierraTypeError::ValueTooLargeForType { val: *felt, ty: "u128" }) -} - // Implementations. // We implement the trait SierraType for SierraU128 and not for u128 since it's not guaranteed that diff --git a/crates/blockifier/src/abi/sierra_types_test.rs b/crates/blockifier/src/abi/sierra_types_test.rs deleted file mode 100644 index a78b1e35329..00000000000 --- a/crates/blockifier/src/abi/sierra_types_test.rs +++ /dev/null @@ -1,21 +0,0 @@ -use num_bigint::BigUint; -use starknet_types_core::felt::Felt; - -use crate::abi::sierra_types::felt_to_u128; - -#[test] -fn test_value_too_large_for_type() { - // Happy flow. - let n = 1991_u128; - let n_as_felt = Felt::from(n); - felt_to_u128(&n_as_felt).unwrap(); - - // Value too large for type. - let overflowed_u128: BigUint = BigUint::from(1_u8) << 128; - let overflowed_u128_as_felt = Felt::from(overflowed_u128); - let error = felt_to_u128(&overflowed_u128_as_felt).unwrap_err(); - assert_eq!( - format!("{error}"), - "Felt 340282366920938463463374607431768211456 is too big to convert to 'u128'." - ); -} diff --git a/crates/blockifier/src/blockifier/config.rs b/crates/blockifier/src/blockifier/config.rs index aca073f1b49..d3b7d3c68b2 100644 --- a/crates/blockifier/src/blockifier/config.rs +++ b/crates/blockifier/src/blockifier/config.rs @@ -3,23 +3,38 @@ use std::collections::BTreeMap; use papyrus_config::dumping::{append_sub_config_name, ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use serde::{Deserialize, Serialize}; +use starknet_sierra_multicompile::config::SierraCompilationConfig; +#[cfg(any(test, feature = "testing", feature = "native_blockifier"))] +use crate::blockifier::transaction_executor::DEFAULT_STACK_SIZE; +use crate::state::contract_class_manager::DEFAULT_COMPILATION_REQUEST_CHANNEL_SIZE; use crate::state::global_cache::GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST; #[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] pub struct TransactionExecutorConfig { pub concurrency_config: ConcurrencyConfig, + pub stack_size: usize, } impl TransactionExecutorConfig { #[cfg(any(test, feature = "testing", feature = "native_blockifier"))] pub fn create_for_testing(concurrency_enabled: bool) -> Self { - Self { concurrency_config: ConcurrencyConfig::create_for_testing(concurrency_enabled) } + Self { + concurrency_config: ConcurrencyConfig::create_for_testing(concurrency_enabled), + stack_size: DEFAULT_STACK_SIZE, + } } } impl SerializeConfig for TransactionExecutorConfig { fn dump(&self) -> BTreeMap { - append_sub_config_name(self.concurrency_config.dump(), "concurrency_config") + let mut dump = append_sub_config_name(self.concurrency_config.dump(), "concurrency_config"); + dump.append(&mut BTreeMap::from([ser_param( + "stack_size", + &self.stack_size, + "The thread stack size (proportional to the maximal gas of a transaction).", + ParamPrivacyInput::Public, + )])); + dump } } @@ -66,22 +81,71 @@ impl SerializeConfig for ConcurrencyConfig { #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] pub struct ContractClassManagerConfig { - pub run_cairo_native: bool, - pub wait_on_native_compilation: bool, + pub cairo_native_run_config: CairoNativeRunConfig, pub contract_cache_size: usize, + pub native_compiler_config: SierraCompilationConfig, } impl Default for ContractClassManagerConfig { fn default() -> Self { Self { - run_cairo_native: false, - wait_on_native_compilation: false, + cairo_native_run_config: CairoNativeRunConfig::default(), contract_cache_size: GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST, + native_compiler_config: SierraCompilationConfig::default(), } } } +impl ContractClassManagerConfig { + #[cfg(any(test, feature = "testing", feature = "native_blockifier"))] + pub fn create_for_testing(run_cairo_native: bool, wait_on_native_compilation: bool) -> Self { + let cairo_native_run_config = CairoNativeRunConfig { + run_cairo_native, + wait_on_native_compilation, + ..Default::default() + }; + Self { cairo_native_run_config, ..Default::default() } + } +} + impl SerializeConfig for ContractClassManagerConfig { + fn dump(&self) -> BTreeMap { + let mut dump = BTreeMap::from_iter([ser_param( + "contract_cache_size", + &self.contract_cache_size, + "The size of the global contract cache.", + ParamPrivacyInput::Public, + )]); + dump.append(&mut append_sub_config_name( + self.cairo_native_run_config.dump(), + "cairo_native_run_config", + )); + dump.append(&mut append_sub_config_name( + self.native_compiler_config.dump(), + "native_compiler_config", + )); + dump + } +} + +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)] +pub struct CairoNativeRunConfig { + pub run_cairo_native: bool, + pub wait_on_native_compilation: bool, + pub channel_size: usize, +} + +impl Default for CairoNativeRunConfig { + fn default() -> Self { + Self { + run_cairo_native: false, + wait_on_native_compilation: false, + channel_size: DEFAULT_COMPILATION_REQUEST_CHANNEL_SIZE, + } + } +} + +impl SerializeConfig for CairoNativeRunConfig { fn dump(&self) -> BTreeMap { BTreeMap::from_iter([ ser_param( @@ -97,9 +161,9 @@ impl SerializeConfig for ContractClassManagerConfig { ParamPrivacyInput::Public, ), ser_param( - "contract_cache_size", - &self.contract_cache_size, - "The size of the global contract cache.", + "channel_size", + &self.channel_size, + "The size of the compilation request channel.", ParamPrivacyInput::Public, ), ]) diff --git a/crates/blockifier/src/blockifier/stateful_validator.rs b/crates/blockifier/src/blockifier/stateful_validator.rs index 8683088833e..d044bad0c01 100644 --- a/crates/blockifier/src/blockifier/stateful_validator.rs +++ b/crates/blockifier/src/blockifier/stateful_validator.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::executable_transaction::AccountTransaction as ApiTransaction; +use starknet_api::execution_resources::GasAmount; use thiserror::Error; use crate::blockifier::config::TransactionExecutorConfig; @@ -132,6 +133,7 @@ impl StatefulValidator { &tx_context.block_context.versioned_constants, ), 0, + GasAmount(0), ); Ok((validate_call_info, tx_receipt)) diff --git a/crates/blockifier/src/blockifier/transaction_executor.rs b/crates/blockifier/src/blockifier/transaction_executor.rs index bec2bd5b8cb..5ee21ac558a 100644 --- a/crates/blockifier/src/blockifier/transaction_executor.rs +++ b/crates/blockifier/src/blockifier/transaction_executor.rs @@ -1,11 +1,9 @@ -use std::collections::{HashMap, HashSet}; use std::panic::{self, catch_unwind, AssertUnwindSafe}; use std::sync::{Arc, Mutex}; use itertools::FoldWhile::{Continue, Done}; use itertools::Itertools; use starknet_api::block::BlockHashAndNumber; -use starknet_api::core::ClassHash; use thiserror::Error; use crate::blockifier::block::pre_process_block; @@ -16,6 +14,7 @@ use crate::context::BlockContext; use crate::state::cached_state::{CachedState, CommitmentStateDiff, TransactionalState}; use crate::state::errors::StateError; use crate::state::state_api::{StateReader, StateResult}; +use crate::state::stateful_compression::{allocate_aliases_in_storage, compress, CompressionError}; use crate::transaction::errors::TransactionExecutionError; use crate::transaction::objects::TransactionExecutionInfo; use crate::transaction::transaction_execution::Transaction; @@ -26,6 +25,7 @@ use crate::transaction::transactions::ExecutableTransaction; pub mod transaction_executor_test; pub const BLOCK_STATE_ACCESS_ERR: &str = "Error: The block state should be `Some`."; +pub const DEFAULT_STACK_SIZE: usize = 60 * 1024 * 1024; #[derive(Debug, Error)] pub enum TransactionExecutorError { @@ -35,10 +35,17 @@ pub enum TransactionExecutorError { StateError(#[from] StateError), #[error(transparent)] TransactionExecutionError(#[from] TransactionExecutionError), + #[error(transparent)] + CompressionError(#[from] CompressionError), } pub type TransactionExecutorResult = Result; -pub type VisitedSegmentsMapping = Vec<(ClassHash, Vec)>; + +pub struct BlockExecutionSummary { + pub state_diff: CommitmentStateDiff, + pub compressed_state_diff: Option, + pub bouncer_weights: BouncerWeights, +} /// A transaction executor, used for building a single block. pub struct TransactionExecutor { @@ -125,7 +132,7 @@ impl TransactionExecutor { } } - pub fn execute_txs_sequentially( + pub fn execute_txs_sequentially_inner( &mut self, txs: &[Transaction], ) -> Vec> { @@ -140,42 +147,41 @@ impl TransactionExecutor { results } - /// Returns the state diff, a list of contract class hash with the corresponding list of - /// visited segment values and the block weights. - pub fn finalize( - &mut self, - ) -> TransactionExecutorResult<(CommitmentStateDiff, VisitedSegmentsMapping, BouncerWeights)> - { - // Get the visited segments of each contract class. - // This is done by taking all the visited PCs of each contract, and compress them to one - // representative for each visited segment. - let visited_segments = self - .block_state - .as_ref() - .expect(BLOCK_STATE_ACCESS_ERR) - .visited_pcs - .iter() - .map(|(class_hash, class_visited_pcs)| -> TransactionExecutorResult<_> { - let contract_class = self - .block_state - .as_ref() - .expect(BLOCK_STATE_ACCESS_ERR) - .get_compiled_class(*class_hash)?; - Ok((*class_hash, contract_class.get_visited_segments(class_visited_pcs)?)) - }) - .collect::>()?; + /// Returns the state diff and the block weights. + // TODO(Aner): Consume "self", i.e., remove the reference, after removing the native blockifier. + pub fn finalize(&mut self) -> TransactionExecutorResult { + self.internal_finalize() + } + + #[cfg(feature = "reexecution")] + pub fn non_consuming_finalize(&mut self) -> TransactionExecutorResult { + self.internal_finalize() + } + fn internal_finalize(&mut self) -> TransactionExecutorResult { log::debug!("Final block weights: {:?}.", self.bouncer.get_accumulated_weights()); - Ok(( - self.block_state - .as_mut() - .expect(BLOCK_STATE_ACCESS_ERR) - .to_state_diff()? - .state_maps - .into(), - visited_segments, - *self.bouncer.get_accumulated_weights(), - )) + let block_state = self.block_state.as_mut().expect(BLOCK_STATE_ACCESS_ERR); + let alias_contract_address = self + .block_context + .versioned_constants + .os_constants + .os_contract_addresses + .alias_contract_address(); + if self.block_context.versioned_constants.enable_stateful_compression { + allocate_aliases_in_storage(block_state, alias_contract_address)?; + } + let state_diff = block_state.to_state_diff()?.state_maps; + let compressed_state_diff = + if self.block_context.versioned_constants.enable_stateful_compression { + Some(compress(&state_diff, block_state, alias_contract_address)?.into()) + } else { + None + }; + Ok(BlockExecutionSummary { + state_diff: state_diff.into(), + compressed_state_diff, + bouncer_weights: *self.bouncer.get_accumulated_weights(), + }) } } @@ -222,6 +228,39 @@ impl TransactionExecutor { } } + pub fn execute_txs_sequentially( + &mut self, + txs: &[Transaction], + ) -> Vec> { + #[cfg(not(feature = "cairo_native"))] + return self.execute_txs_sequentially_inner(txs); + #[cfg(feature = "cairo_native")] + { + // TODO meshi: find a way to access the contract class manager config from transaction + // executor. + let txs = txs.to_vec(); + std::thread::scope(|s| { + std::thread::Builder::new() + // when running Cairo natively, the real stack is used and could get overflowed + // (unlike the VM where the stack is simulated in the heap as a memory segment). + // + // We pre-allocate the stack here, and not during Native execution (not trivial), so it + // needs to be big enough ahead. + // However, making it very big is wasteful (especially with multi-threading). + // So, the stack size should support calls with a reasonable gas limit, for extremely deep + // recursions to reach out-of-gas before hitting the bottom of the recursion. + // + // The gas upper bound is MAX_POSSIBLE_SIERRA_GAS, and sequencers must not raise it without + // adjusting the stack size. + .stack_size(self.config.stack_size) + .spawn_scoped(s, || self.execute_txs_sequentially_inner(&txs)) + .expect("Failed to spawn thread") + .join() + .expect("Failed to join thread.") + }) + } + } + pub fn execute_chunk( &mut self, chunk: &[Transaction], @@ -245,32 +284,45 @@ impl TransactionExecutor { std::thread::scope(|s| { for _ in 0..self.config.concurrency_config.n_workers { let worker_executor = Arc::clone(&worker_executor); - s.spawn(move || { - // Making sure that the program will abort if a panic accured while halting the - // scheduler. - let abort_guard = AbortIfPanic; - // If a panic is not handled or the handling logic itself panics, then we abort - // the program. - if let Err(err) = catch_unwind(AssertUnwindSafe(|| { - worker_executor.run(); - })) { - // If the program panics here, the abort guard will exit the program. - // In this case, no panic message will be logged. Add the cargo flag - // --nocapture to log the panic message. + let _handle = std::thread::Builder::new() + // when running Cairo natively, the real stack is used and could get overflowed + // (unlike the VM where the stack is simulated in the heap as a memory segment). + // + // We pre-allocate the stack here, and not during Native execution (not trivial), so it + // needs to be big enough ahead. + // However, making it very big is wasteful (especially with multi-threading). + // So, the stack size should support calls with a reasonable gas limit, for extremely deep + // recursions to reach out-of-gas before hitting the bottom of the recursion. + // + // The gas upper bound is MAX_POSSIBLE_SIERRA_GAS, and sequencers must not raise it without + // adjusting the stack size. + .stack_size(self.config.stack_size) + .spawn_scoped(s, move || { + // Making sure that the program will abort if a panic accured while halting + // the scheduler. + let abort_guard = AbortIfPanic; + // If a panic is not handled or the handling logic itself panics, then we + // abort the program. + if let Err(err) = catch_unwind(AssertUnwindSafe(|| { + worker_executor.run(); + })) { + // If the program panics here, the abort guard will exit the program. + // In this case, no panic message will be logged. Add the cargo flag + // --nocapture to log the panic message. - worker_executor.scheduler.halt(); - abort_guard.release(); - panic::resume_unwind(err); - } + worker_executor.scheduler.halt(); + abort_guard.release(); + panic::resume_unwind(err); + } - abort_guard.release(); - }); + abort_guard.release(); + }) + .expect("Failed to spawn thread."); } }); let n_committed_txs = worker_executor.scheduler.get_n_committed_txs(); let mut tx_execution_results = Vec::new(); - let mut visited_pcs: HashMap> = HashMap::new(); for execution_output in worker_executor.execution_outputs.iter() { if tx_execution_results.len() >= n_committed_txs { break; @@ -282,9 +334,6 @@ impl TransactionExecutor { .expect("Output must be ready."); tx_execution_results .push(locked_execution_output.result.map_err(TransactionExecutorError::from)); - for (class_hash, class_visited_pcs) in locked_execution_output.visited_pcs { - visited_pcs.entry(class_hash).or_default().extend(class_visited_pcs); - } } let block_state_after_commit = Arc::try_unwrap(worker_executor) @@ -295,7 +344,7 @@ impl TransactionExecutor { it." ) }) - .commit_chunk_and_recover_block_state(n_committed_txs, visited_pcs); + .commit_chunk_and_recover_block_state(n_committed_txs); self.block_state.replace(block_state_after_commit); tx_execution_results diff --git a/crates/blockifier/src/blockifier/transaction_executor_test.rs b/crates/blockifier/src/blockifier/transaction_executor_test.rs index da5d3bab1a3..fbdd6c89f4a 100644 --- a/crates/blockifier/src/blockifier/transaction_executor_test.rs +++ b/crates/blockifier/src/blockifier/transaction_executor_test.rs @@ -4,7 +4,7 @@ use rstest::rstest; use starknet_api::test_utils::declare::executable_declare_tx; use starknet_api::test_utils::deploy_account::executable_deploy_account_tx; use starknet_api::test_utils::invoke::executable_invoke_tx; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{NonceManager, DEFAULT_STRK_L1_GAS_PRICE}; use starknet_api::transaction::fields::Fee; use starknet_api::transaction::TransactionVersion; use starknet_api::{declare_tx_args, deploy_account_tx_args, felt, invoke_tx_args, nonce}; @@ -29,7 +29,6 @@ use crate::test_utils::{ CairoVersion, RunnableCairo1, BALANCE, - DEFAULT_STRK_L1_GAS_PRICE, }; use crate::transaction::account_transaction::AccountTransaction; use crate::transaction::errors::TransactionExecutionError; diff --git a/crates/blockifier/src/bouncer.rs b/crates/blockifier/src/bouncer.rs index 99c93451841..29a05432a16 100644 --- a/crates/blockifier/src/bouncer.rs +++ b/crates/blockifier/src/bouncer.rs @@ -25,7 +25,7 @@ use crate::utils::usize_from_u64; #[path = "bouncer_test.rs"] mod test; -macro_rules! impl_checked_sub { +macro_rules! impl_checked_ops { ($($field:ident),+) => { pub fn checked_sub(self: Self, other: Self) -> Option { Some( @@ -36,6 +36,16 @@ macro_rules! impl_checked_sub { } ) } + + pub fn checked_add(self: Self, other: Self) -> Option { + Some( + Self { + $( + $field: self.$field.checked_add(other.$field)?, + )+ + } + ) + } }; } @@ -80,17 +90,8 @@ impl SerializeConfig for BouncerConfig { } } -#[derive( - Clone, - Copy, - Debug, - derive_more::Add, - derive_more::AddAssign, - derive_more::Sub, - Deserialize, - PartialEq, - Serialize, -)] +#[cfg_attr(any(test, feature = "testing"), derive(derive_more::Add, derive_more::AddAssign))] +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)] /// Represents the execution resources counted throughout block creation. pub struct BouncerWeights { pub builtin_count: BuiltinCount, @@ -103,7 +104,7 @@ pub struct BouncerWeights { } impl BouncerWeights { - impl_checked_sub!( + impl_checked_ops!( builtin_count, l1_gas, message_segment_length, @@ -251,7 +252,7 @@ macro_rules! impl_all_non_zero { macro_rules! impl_builtin_variants { ($($field:ident),+) => { - impl_checked_sub!($($field),+); + impl_checked_ops!($($field),+); impl_all_non_zero!($($field),+); }; } @@ -495,7 +496,14 @@ impl Bouncer { )?; // Check if the transaction can fit the current block available capacity. - if !self.bouncer_config.has_room(self.accumulated_weights + tx_weights) { + let err_msg = format!( + "Addition overflow. Transaction weights: {tx_weights:?}, block weights: {:?}.", + self.accumulated_weights + ); + if !self + .bouncer_config + .has_room(self.accumulated_weights.checked_add(tx_weights).expect(&err_msg)) + { log::debug!( "Transaction cannot be added to the current block, block capacity reached; \ transaction weights: {tx_weights:?}, block weights: {:?}.", @@ -515,7 +523,12 @@ impl Bouncer { tx_execution_summary: &ExecutionSummary, state_changes_keys: &StateChangesKeys, ) { - self.accumulated_weights += tx_weights; + let err_msg = format!( + "Addition overflow. Transaction weights: {tx_weights:?}, block weights: {:?}.", + self.accumulated_weights + ); + self.accumulated_weights = + self.accumulated_weights.checked_add(tx_weights).expect(&err_msg); self.visited_storage_entries.extend(&tx_execution_summary.visited_storage_entries); self.executed_class_hashes.extend(&tx_execution_summary.executed_class_hashes); // Note: cancelling writes (0 -> 1 -> 0) will not be removed, but it's fine since fee was diff --git a/crates/blockifier/src/concurrency/fee_utils.rs b/crates/blockifier/src/concurrency/fee_utils.rs index 8ea34ea0654..5188185277d 100644 --- a/crates/blockifier/src/concurrency/fee_utils.rs +++ b/crates/blockifier/src/concurrency/fee_utils.rs @@ -118,5 +118,5 @@ pub fn add_fee_to_sequencer_balance( ]), ..StateMaps::default() }; - state.apply_writes(&writes, &ContractClassMapping::default(), &HashMap::default()); + state.apply_writes(&writes, &ContractClassMapping::default()); } diff --git a/crates/blockifier/src/concurrency/flow_test.rs b/crates/blockifier/src/concurrency/flow_test.rs index 5b828c32600..15f0af4f50c 100644 --- a/crates/blockifier/src/concurrency/flow_test.rs +++ b/crates/blockifier/src/concurrency/flow_test.rs @@ -48,11 +48,7 @@ fn scheduler_flow_test( Task::ExecutionTask(tx_index), &versioned_state, ); - state_proxy.apply_writes( - &new_writes, - &ContractClassMapping::default(), - &HashMap::default(), - ); + state_proxy.apply_writes(&new_writes, &ContractClassMapping::default()); scheduler.finish_execution_during_commit(tx_index); } } @@ -61,11 +57,9 @@ fn scheduler_flow_test( Task::ExecutionTask(tx_index) => { let (_, writes) = get_reads_writes_for(Task::ExecutionTask(tx_index), &versioned_state); - versioned_state.pin_version(tx_index).apply_writes( - &writes, - &ContractClassMapping::default(), - &HashMap::default(), - ); + versioned_state + .pin_version(tx_index) + .apply_writes(&writes, &ContractClassMapping::default()); scheduler.finish_execution(tx_index); Task::AskForTask } diff --git a/crates/blockifier/src/concurrency/versioned_state.rs b/crates/blockifier/src/concurrency/versioned_state.rs index 1d3c9a9270a..65ea81cd7c5 100644 --- a/crates/blockifier/src/concurrency/versioned_state.rs +++ b/crates/blockifier/src/concurrency/versioned_state.rs @@ -1,4 +1,3 @@ -use std::collections::{HashMap, HashSet}; use std::sync::{Arc, Mutex, MutexGuard}; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; @@ -199,11 +198,7 @@ impl VersionedState { } impl VersionedState { - pub fn commit_chunk_and_recover_block_state( - mut self, - n_committed_txs: usize, - visited_pcs: HashMap>, - ) -> U { + pub fn commit_chunk_and_recover_block_state(mut self, n_committed_txs: usize) -> U { if n_committed_txs == 0 { return self.into_initial_state(); } @@ -212,7 +207,7 @@ impl VersionedState { let class_hash_to_class = self.compiled_contract_classes.get_writes_up_to_index(commit_index); let mut state = self.into_initial_state(); - state.apply_writes(&writes, &class_hash_to_class, &visited_pcs); + state.apply_writes(&writes, &class_hash_to_class); state } } @@ -271,14 +266,8 @@ impl VersionedStateProxy { } } -// TODO(Noa, 15/5/24): Consider using visited_pcs. impl UpdatableState for VersionedStateProxy { - fn apply_writes( - &mut self, - writes: &StateMaps, - class_hash_to_class: &ContractClassMapping, - _visited_pcs: &HashMap>, - ) { + fn apply_writes(&mut self, writes: &StateMaps, class_hash_to_class: &ContractClassMapping) { self.state().apply_writes(self.tx_index, writes, class_hash_to_class) } } diff --git a/crates/blockifier/src/concurrency/versioned_state_test.rs b/crates/blockifier/src/concurrency/versioned_state_test.rs index 6db3b95a1de..a76beafa85b 100644 --- a/crates/blockifier/src/concurrency/versioned_state_test.rs +++ b/crates/blockifier/src/concurrency/versioned_state_test.rs @@ -7,7 +7,7 @@ use rstest::{fixture, rstest}; use starknet_api::abi::abi_utils::{get_fee_token_var_address, get_storage_var_address}; use starknet_api::core::{calculate_contract_address, ClassHash, ContractAddress}; use starknet_api::test_utils::deploy_account::executable_deploy_account_tx; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{NonceManager, DEFAULT_STRK_L1_GAS_PRICE}; use starknet_api::transaction::fields::{ContractAddressSalt, ValidResourceBounds}; use starknet_api::{ calldata, @@ -43,7 +43,7 @@ use crate::state::state_api::{State, StateReader, UpdatableState}; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::dict_state_reader::DictStateReader; use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{CairoVersion, RunnableCairo1, BALANCE, DEFAULT_STRK_L1_GAS_PRICE}; +use crate::test_utils::{CairoVersion, RunnableCairo1, BALANCE}; use crate::transaction::account_transaction::AccountTransaction; use crate::transaction::objects::HasRelatedFeeType; use crate::transaction::test_utils::{default_all_resource_bounds, l1_resource_bounds}; @@ -441,7 +441,6 @@ fn test_apply_writes( safe_versioned_state.pin_version(0).apply_writes( &transactional_states[0].cache.borrow().writes, &transactional_states[0].class_hash_to_class.borrow().clone(), - &HashMap::default(), ); assert!(transactional_states[1].get_class_hash_at(contract_address).unwrap() == class_hash_0); assert!(transactional_states[1].get_compiled_class(class_hash).unwrap() == contract_class_0); @@ -470,7 +469,6 @@ fn test_apply_writes_reexecute_scenario( safe_versioned_state.pin_version(0).apply_writes( &transactional_states[0].cache.borrow().writes, &transactional_states[0].class_hash_to_class.borrow().clone(), - &HashMap::default(), ); // Although transaction 0 wrote to the shared state, version 1 needs to be re-executed to see // the new value (its read value has already been cached). @@ -516,11 +514,9 @@ fn test_delete_writes( feature_contract.get_runnable_class(), ) .unwrap(); - safe_versioned_state.pin_version(i).apply_writes( - &tx_state.cache.borrow().writes, - &tx_state.class_hash_to_class.borrow(), - &HashMap::default(), - ); + safe_versioned_state + .pin_version(i) + .apply_writes(&tx_state.cache.borrow().writes, &tx_state.class_hash_to_class.borrow()); } safe_versioned_state.pin_version(tx_index_to_delete_writes).delete_writes( @@ -579,11 +575,7 @@ fn test_delete_writes_completeness( let tx_index = 0; let mut versioned_state_proxy = safe_versioned_state.pin_version(tx_index); - versioned_state_proxy.apply_writes( - &state_maps_writes, - &class_hash_to_class_writes, - &HashMap::default(), - ); + versioned_state_proxy.apply_writes(&state_maps_writes, &class_hash_to_class_writes); assert_eq!( safe_versioned_state.0.lock().unwrap().get_writes_of_index(tx_index), state_maps_writes @@ -658,9 +650,8 @@ fn test_versioned_proxy_state_flow( for proxy in versioned_proxy_states { drop(proxy); } - let modified_block_state = safe_versioned_state - .into_inner_state() - .commit_chunk_and_recover_block_state(4, HashMap::new()); + let modified_block_state = + safe_versioned_state.into_inner_state().commit_chunk_and_recover_block_state(4); assert!(modified_block_state.get_class_hash_at(contract_address).unwrap() == class_hash_3); assert!(modified_block_state.get_compiled_class(class_hash).unwrap() == contract_class_2); diff --git a/crates/blockifier/src/concurrency/worker_logic.rs b/crates/blockifier/src/concurrency/worker_logic.rs index 851a462f31f..76dc7313a5f 100644 --- a/crates/blockifier/src/concurrency/worker_logic.rs +++ b/crates/blockifier/src/concurrency/worker_logic.rs @@ -1,11 +1,9 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::fmt::Debug; use std::sync::Mutex; use std::thread; use std::time::Duration; -use starknet_api::core::ClassHash; - use super::versioned_state::VersionedState; use crate::blockifier::transaction_executor::TransactionExecutorError; use crate::bouncer::Bouncer; @@ -33,7 +31,6 @@ pub struct ExecutionTaskOutput { // TODO(Yoni): rename to state_diff. pub writes: StateMaps, pub contract_classes: ContractClassMapping, - pub visited_pcs: HashMap>, pub result: TransactionExecutionResult, } @@ -123,6 +120,7 @@ impl<'a, S: StateReader> WorkerExecutor<'a, S> { fn execute_tx(&self, tx_index: TxIndex) { let mut tx_versioned_state = self.state.pin_version(tx_index); let tx = &self.chunk[tx_index]; + // TODO(Yoni): is it necessary to use a transactional state here? let mut transactional_state = TransactionalState::create_transactional(&mut tx_versioned_state); let concurrency_mode = true; @@ -135,23 +133,19 @@ impl<'a, S: StateReader> WorkerExecutor<'a, S> { let tx_reads_writes = transactional_state.cache.take(); let writes = tx_reads_writes.to_state_diff().state_maps; let contract_classes = transactional_state.class_hash_to_class.take(); - let visited_pcs = transactional_state.visited_pcs; - // The versioned state does not carry the visited PCs. - tx_versioned_state.apply_writes(&writes, &contract_classes, &HashMap::default()); + tx_versioned_state.apply_writes(&writes, &contract_classes); ExecutionTaskOutput { reads: tx_reads_writes.initial_reads, writes, contract_classes, - visited_pcs, result: execution_result, } } Err(_) => ExecutionTaskOutput { reads: transactional_state.cache.take().initial_reads, - // Failed transaction - ignore the writes and visited PCs. + // Failed transaction - ignore the writes. writes: StateMaps::default(), contract_classes: HashMap::default(), - visited_pcs: HashMap::default(), result: execution_result, }, }; @@ -261,13 +255,7 @@ impl<'a, S: StateReader> WorkerExecutor<'a, S> { } impl WorkerExecutor<'_, U> { - pub fn commit_chunk_and_recover_block_state( - self, - n_committed_txs: usize, - visited_pcs: HashMap>, - ) -> U { - self.state - .into_inner_state() - .commit_chunk_and_recover_block_state(n_committed_txs, visited_pcs) + pub fn commit_chunk_and_recover_block_state(self, n_committed_txs: usize) -> U { + self.state.into_inner_state().commit_chunk_and_recover_block_state(n_committed_txs) } } diff --git a/crates/blockifier/src/concurrency/worker_logic_test.rs b/crates/blockifier/src/concurrency/worker_logic_test.rs index bf1b29647a1..873f28b6273 100644 --- a/crates/blockifier/src/concurrency/worker_logic_test.rs +++ b/crates/blockifier/src/concurrency/worker_logic_test.rs @@ -5,7 +5,7 @@ use rstest::rstest; use starknet_api::abi::abi_utils::get_fee_token_var_address; use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::test_utils::declare::executable_declare_tx; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{NonceManager, TEST_ERC20_CONTRACT_ADDRESS2}; use starknet_api::transaction::constants::DEPLOY_CONTRACT_FUNCTION_ENTRY_POINT_NAME; use starknet_api::transaction::fields::{ContractAddressSalt, Fee, ValidResourceBounds}; use starknet_api::transaction::TransactionVersion; @@ -31,7 +31,6 @@ use crate::test_utils::{ CairoVersion, RunnableCairo1, BALANCE, - TEST_ERC20_CONTRACT_ADDRESS2, }; use crate::transaction::account_transaction::AccountTransaction; use crate::transaction::objects::HasRelatedFeeType; @@ -386,7 +385,6 @@ fn test_worker_execute(default_all_resource_bounds: ValidResourceBounds) { assert_eq!(execution_output.writes, writes.diff(&reads)); assert_eq!(execution_output.reads, reads); - assert_ne!(execution_output.visited_pcs, HashMap::default()); // Failed execution. let tx_index = 1; @@ -405,7 +403,6 @@ fn test_worker_execute(default_all_resource_bounds: ValidResourceBounds) { }; assert_eq!(execution_output.reads, reads); assert_eq!(execution_output.writes, StateMaps::default()); - assert_eq!(execution_output.visited_pcs, HashMap::default()); // Reverted execution. let tx_index = 2; @@ -419,7 +416,6 @@ fn test_worker_execute(default_all_resource_bounds: ValidResourceBounds) { let execution_output = execution_output.as_ref().unwrap(); assert!(execution_output.result.as_ref().unwrap().is_reverted()); assert_ne!(execution_output.writes, StateMaps::default()); - assert_ne!(execution_output.visited_pcs, HashMap::default()); // Validate status change. for tx_index in 0..3 { diff --git a/crates/blockifier/src/context.rs b/crates/blockifier/src/context.rs index 152524f5c5a..fdf6be73b2d 100644 --- a/crates/blockifier/src/context.rs +++ b/crates/blockifier/src/context.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use papyrus_config::dumping::{append_sub_config_name, ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use serde::{Deserialize, Serialize}; -use starknet_api::block::{BlockInfo, FeeType, GasPriceVector}; +use starknet_api::block::{BlockInfo, BlockNumber, BlockTimestamp, FeeType, GasPriceVector}; use starknet_api::core::{ChainId, ContractAddress}; use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::{ @@ -127,6 +127,46 @@ impl BlockContext { tx_info: tx_info_creator.create_tx_info(), } } + + pub fn block_info_for_validate(&self) -> BlockInfo { + let block_number = self.block_info.block_number.0; + let block_timestamp = self.block_info.block_timestamp.0; + // Round down to the nearest multiple of validate_block_number_rounding. + let validate_block_number_rounding = + self.versioned_constants.get_validate_block_number_rounding(); + let rounded_block_number = + (block_number / validate_block_number_rounding) * validate_block_number_rounding; + // Round down to the nearest multiple of validate_timestamp_rounding. + let validate_timestamp_rounding = + self.versioned_constants.get_validate_timestamp_rounding(); + let rounded_timestamp = + (block_timestamp / validate_timestamp_rounding) * validate_timestamp_rounding; + BlockInfo { + block_number: BlockNumber(rounded_block_number), + block_timestamp: BlockTimestamp(rounded_timestamp), + sequencer_address: 0_u128.into(), + // TODO(Yoni) consider setting here trivial prices if and when this field is exposed. + gas_prices: self.block_info.gas_prices.clone(), + use_kzg_da: self.block_info.use_kzg_da, + } + } + + /// Test util to allow overriding block gas limits. + #[cfg(any(test, feature = "testing"))] + pub fn set_sierra_gas_limits( + &mut self, + execute_max_gas: Option, + validate_max_gas: Option, + ) { + let mut new_os_constants = *self.versioned_constants.os_constants.clone(); + if let Some(execute_max_gas) = execute_max_gas { + new_os_constants.execute_max_sierra_gas = execute_max_gas; + } + if let Some(validate_max_gas) = validate_max_gas { + new_os_constants.validate_max_sierra_gas = validate_max_gas; + } + self.versioned_constants.os_constants = std::sync::Arc::new(new_os_constants); + } } #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] diff --git a/crates/blockifier/src/execution/call_info.rs b/crates/blockifier/src/execution/call_info.rs index c63669f1759..6e4a3e0effd 100644 --- a/crates/blockifier/src/execution/call_info.rs +++ b/crates/blockifier/src/execution/call_info.rs @@ -106,7 +106,7 @@ impl Sum for ExecutionSummary { #[derive(Clone, Debug, Default, Serialize, Eq, PartialEq)] pub struct ChargedResources { pub vm_resources: ExecutionResources, // Counted in CairoSteps mode calls. - pub gas_for_fee: GasAmount, // Counted in SierraGas mode calls. + pub gas_consumed: GasAmount, // Counted in SierraGas mode calls. } impl ChargedResources { @@ -114,8 +114,8 @@ impl ChargedResources { Self { vm_resources: resources, ..Default::default() } } - pub fn from_gas(gas_for_fee: GasAmount) -> Self { - Self { gas_for_fee, ..Default::default() } + pub fn from_gas(gas_consumed: GasAmount) -> Self { + Self { gas_consumed, ..Default::default() } } } @@ -132,8 +132,8 @@ impl Add<&ChargedResources> for &ChargedResources { impl AddAssign<&ChargedResources> for ChargedResources { fn add_assign(&mut self, other: &Self) { self.vm_resources += &other.vm_resources; - self.gas_for_fee = - self.gas_for_fee.checked_add(other.gas_for_fee).expect("Gas for fee overflowed."); + self.gas_consumed = + self.gas_consumed.checked_add(other.gas_consumed).expect("Gas for fee overflowed."); } } @@ -145,8 +145,8 @@ pub struct CallInfo { pub call: CallEntryPoint, pub execution: CallExecution, pub inner_calls: Vec, + pub resources: ExecutionResources, pub tracked_resource: TrackedResource, - pub charged_resources: ChargedResources, // Additional information gathered during execution. pub time: std::time::Duration, @@ -213,9 +213,12 @@ impl CallInfo { } ExecutionSummary { - // Note: the charged resourses of a call contains the inner call resources, unlike other - // fields such as events and messages, - charged_resources: self.charged_resources.clone(), + // Note: the vm_resources and gas_consumed of a call contains the inner call resources, + // unlike other fields such as events and messages. + charged_resources: ChargedResources { + vm_resources: self.resources.clone(), + gas_consumed: GasAmount(self.execution.gas_consumed), + }, executed_class_hashes, visited_storage_entries, l2_to_l1_payload_lengths, @@ -230,13 +233,13 @@ impl CallInfo { call_infos.map(|call_info| call_info.summarize(versioned_constants)).sum() } - pub fn summarize_charged_resources<'a>( + pub fn summarize_vm_resources<'a>( call_infos: impl Iterator, - ) -> ChargedResources { - // Note: the charged resourses of a call contains the inner call resources, unlike other - // fields such as events and messages, - call_infos.fold(ChargedResources::default(), |mut acc, inner_call| { - acc += &inner_call.charged_resources; + ) -> ExecutionResources { + // Note: the vm resources (and entire charged resources) of a call contains the inner call + // resources, unlike other fields such as events and messages. + call_infos.fold(ExecutionResources::default(), |mut acc, inner_call| { + acc += &inner_call.resources; acc }) } diff --git a/crates/blockifier/src/execution/contract_address_test.rs b/crates/blockifier/src/execution/contract_address_test.rs index 2b8f5927a82..aec03e509e7 100644 --- a/crates/blockifier/src/execution/contract_address_test.rs +++ b/crates/blockifier/src/execution/contract_address_test.rs @@ -34,7 +34,7 @@ fn test_calculate_contract_address() { calldata, entry_point_selector: selector_from_name("test_contract_address"), storage_address: deployer_address, - initial_gas: versioned_constants.inifite_gas_for_vm_mode(), + initial_gas: versioned_constants.infinite_gas_for_vm_mode(), ..Default::default() }; let contract_address = diff --git a/crates/blockifier/src/execution/contract_class.rs b/crates/blockifier/src/execution/contract_class.rs index ef787086a01..fd8604ddc6d 100644 --- a/crates/blockifier/src/execution/contract_class.rs +++ b/crates/blockifier/src/execution/contract_class.rs @@ -18,10 +18,9 @@ use cairo_vm::types::program::Program; use cairo_vm::types::relocatable::MaybeRelocatable; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use itertools::Itertools; -use semver::Version; use serde::de::Error as DeserializationError; use serde::{Deserialize, Deserializer, Serialize}; -use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion}; +use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion, VersionedCasm}; use starknet_api::core::EntryPointSelector; use starknet_api::deprecated_contract_class::{ ContractClass as DeprecatedContractClass, @@ -32,13 +31,12 @@ use starknet_api::deprecated_contract_class::{ use starknet_types_core::felt::Felt; use crate::abi::constants::{self}; -use crate::execution::entry_point::CallEntryPoint; +use crate::execution::entry_point::{CallEntryPoint, EntryPointExecutionContext}; use crate::execution::errors::PreExecutionError; use crate::execution::execution_utils::{poseidon_hash_many_cost, sn_api_to_cairo_vm_program}; #[cfg(feature = "cairo_native")] use crate::execution::native::contract_class::NativeCompiledClassV1; use crate::transaction::errors::TransactionExecutionError; -use crate::versioned_constants::CompilerVersion; #[cfg(test)] #[path = "contract_class_test.rs"] @@ -67,33 +65,13 @@ pub enum RunnableCompiledClass { V1Native(NativeCompiledClassV1), } -/// Represents a runnable compiled class for Cairo, with the Sierra version (for Cairo 1). -#[derive(Clone)] -pub enum VersionedRunnableCompiledClass { - Cairo0(RunnableCompiledClass), - Cairo1((RunnableCompiledClass, SierraVersion)), -} - -impl From for RunnableCompiledClass { - fn from( - versioned_runnable_compiled_class: VersionedRunnableCompiledClass, - ) -> RunnableCompiledClass { - match versioned_runnable_compiled_class { - VersionedRunnableCompiledClass::Cairo0(runnable_compiled_class) - | VersionedRunnableCompiledClass::Cairo1((runnable_compiled_class, _)) => { - runnable_compiled_class - } - } - } -} - impl TryFrom for RunnableCompiledClass { type Error = ProgramError; fn try_from(raw_contract_class: ContractClass) -> Result { let contract_class: Self = match raw_contract_class { ContractClass::V0(raw_contract_class) => Self::V0(raw_contract_class.try_into()?), - ContractClass::V1(raw_contract_class) => Self::V1(raw_contract_class.try_into()?), + ContractClass::V1(versioned_casm) => Self::V1(versioned_casm.try_into()?), }; Ok(contract_class) @@ -115,7 +93,7 @@ impl RunnableCompiledClass { Self::V0(class) => class.estimate_casm_hash_computation_resources(), Self::V1(class) => class.estimate_casm_hash_computation_resources(), #[cfg(feature = "cairo_native")] - Self::V1Native(_) => ExecutionResources::default(), + Self::V1Native(class) => class.casm().estimate_casm_hash_computation_resources(), } } @@ -135,30 +113,16 @@ impl RunnableCompiledClass { } } - pub fn bytecode_length(&self) -> usize { - match self { - Self::V0(class) => class.bytecode_length(), - Self::V1(class) => class.bytecode_length(), - #[cfg(feature = "cairo_native")] - Self::V1Native(_) => { - todo!("implement bytecode_length for native contracts.") - } - } - } - /// Returns whether this contract should run using Cairo steps or Sierra gas. pub fn tracked_resource( &self, - min_sierra_version: &CompilerVersion, + min_sierra_version: &SierraVersion, last_tracked_resource: Option<&TrackedResource>, ) -> TrackedResource { + let _ = min_sierra_version; let contract_tracked_resource = match self { Self::V0(_) => TrackedResource::CairoSteps, - Self::V1(contract_class) => contract_class.tracked_resource(min_sierra_version), - #[cfg(feature = "cairo_native")] - Self::V1Native(contract_class) => { - contract_class.casm().tracked_resource(min_sierra_version) - } + _ => TrackedResource::SierraGas, }; match last_tracked_resource { // Once we ran with CairoSteps, we will continue to run using it for all nested calls. @@ -166,6 +130,17 @@ impl RunnableCompiledClass { Some(TrackedResource::SierraGas) | None => contract_tracked_resource, } } + + /// Returns the tracked resource for calling this contract from within a context. + pub fn get_current_tracked_resource( + &self, + context: &EntryPointExecutionContext, + ) -> TrackedResource { + self.tracked_resource( + &context.versioned_constants().min_sierra_version_for_sierra_gas, + context.tracked_resource_stack.last(), + ) + } } // V0. @@ -281,8 +256,8 @@ impl CompiledClassV1 { } /// Returns whether this contract should run using Cairo steps or Sierra gas. - pub fn tracked_resource(&self, min_sierra_version: &CompilerVersion) -> TrackedResource { - if *min_sierra_version <= self.compiler_version { + pub fn tracked_resource(&self, min_sierra_version: &SierraVersion) -> TrackedResource { + if *min_sierra_version <= self.sierra_version { TrackedResource::SierraGas } else { TrackedResource::CairoSteps @@ -306,10 +281,12 @@ impl CompiledClassV1 { get_visited_segments(&self.bytecode_segment_lengths, &mut reversed_visited_pcs, &mut 0) } - pub fn try_from_json_string(raw_contract_class: &str) -> Result { + pub fn try_from_json_string( + raw_contract_class: &str, + sierra_version: SierraVersion, + ) -> Result { let casm_contract_class: CasmContractClass = serde_json::from_str(raw_contract_class)?; - let contract_class = CompiledClassV1::try_from(casm_contract_class)?; - + let contract_class = CompiledClassV1::try_from((casm_contract_class, sierra_version))?; Ok(contract_class) } } @@ -410,7 +387,7 @@ pub struct ContractClassV1Inner { pub program: Program, pub entry_points_by_type: EntryPointsByType, pub hints: HashMap, - pub compiler_version: CompilerVersion, + pub sierra_version: SierraVersion, bytecode_segment_lengths: NestedIntList, } @@ -433,10 +410,10 @@ impl HasSelector for EntryPointV1 { } } -impl TryFrom for CompiledClassV1 { +impl TryFrom for CompiledClassV1 { type Error = ProgramError; - fn try_from(class: CasmContractClass) -> Result { + fn try_from((class, sierra_version): VersionedCasm) -> Result { let data: Vec = class.bytecode.iter().map(|x| MaybeRelocatable::from(Felt::from(&x.value))).collect(); @@ -482,15 +459,11 @@ impl TryFrom for CompiledClassV1 { let bytecode_segment_lengths = class .bytecode_segment_lengths .unwrap_or_else(|| NestedIntList::Leaf(program.data_len())); - let compiler_version = CompilerVersion( - Version::parse(&class.compiler_version) - .unwrap_or_else(|_| panic!("Invalid version: '{}'", class.compiler_version)), - ); Ok(CompiledClassV1(Arc::new(ContractClassV1Inner { program, entry_points_by_type, hints: string_to_hint, - compiler_version, + sierra_version, bytecode_segment_lengths, }))) } diff --git a/crates/blockifier/src/execution/contract_class_test.rs b/crates/blockifier/src/execution/contract_class_test.rs index bbf9bedc6c2..15a76af858c 100644 --- a/crates/blockifier/src/execution/contract_class_test.rs +++ b/crates/blockifier/src/execution/contract_class_test.rs @@ -14,7 +14,7 @@ fn test_get_visited_segments() { program: Default::default(), entry_points_by_type: Default::default(), hints: Default::default(), - compiler_version: Default::default(), + sierra_version: Default::default(), bytecode_segment_lengths: NestedIntList::Node(vec![ NestedIntList::Leaf(151), NestedIntList::Leaf(104), diff --git a/crates/blockifier/src/execution/deprecated_entry_point_execution.rs b/crates/blockifier/src/execution/deprecated_entry_point_execution.rs index bee02bedd5f..65a4025d929 100644 --- a/crates/blockifier/src/execution/deprecated_entry_point_execution.rs +++ b/crates/blockifier/src/execution/deprecated_entry_point_execution.rs @@ -9,11 +9,10 @@ use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::abi::constants::{CONSTRUCTOR_ENTRY_POINT_NAME, DEFAULT_ENTRY_POINT_SELECTOR}; use starknet_api::contract_class::EntryPointType; use starknet_api::core::EntryPointSelector; -use starknet_api::execution_resources::GasAmount; use starknet_api::hash::StarkHash; use super::execution_utils::SEGMENT_ARENA_BUILTIN_SIZE; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources}; +use crate::execution::call_info::{CallExecution, CallInfo}; use crate::execution::contract_class::{CompiledClassV0, TrackedResource}; use crate::execution::deprecated_syscalls::hint_processor::DeprecatedSyscallHintProcessor; use crate::execution::entry_point::{ @@ -254,12 +253,8 @@ pub fn finalize_execution( vm_resources_without_inner_calls += &versioned_constants.get_additional_os_syscall_resources(&syscall_handler.syscall_counter); - let charged_resources_without_inner_calls = ChargedResources { - vm_resources: vm_resources_without_inner_calls, - gas_for_fee: GasAmount(0), - }; - let charged_resources = &charged_resources_without_inner_calls - + &CallInfo::summarize_charged_resources(syscall_handler.inner_calls.iter()); + let vm_resources = &vm_resources_without_inner_calls + + &CallInfo::summarize_vm_resources(syscall_handler.inner_calls.iter()); Ok(CallInfo { call, @@ -272,7 +267,7 @@ pub fn finalize_execution( }, inner_calls: syscall_handler.inner_calls, tracked_resource: TrackedResource::CairoSteps, - charged_resources, + resources: vm_resources, storage_read_values: syscall_handler.read_values, accessed_storage_keys: syscall_handler.accessed_keys, ..Default::default() diff --git a/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs b/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs index 7f04bb9abd4..9dc2a7c04cf 100644 --- a/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs +++ b/crates/blockifier/src/execution/deprecated_syscalls/deprecated_syscalls_test.rs @@ -7,6 +7,13 @@ use rstest::rstest; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::core::{calculate_contract_address, ChainId}; use starknet_api::state::StorageKey; +use starknet_api::test_utils::{ + CURRENT_BLOCK_NUMBER, + CURRENT_BLOCK_NUMBER_FOR_VALIDATE, + CURRENT_BLOCK_TIMESTAMP, + CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, + TEST_SEQUENCER_ADDRESS, +}; use starknet_api::transaction::fields::{Calldata, ContractAddressSalt, Fee}; use starknet_api::transaction::{ EventContent, @@ -20,7 +27,7 @@ use starknet_types_core::felt::Felt; use test_case::test_case; use crate::context::ChainInfo; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources, OrderedEvent}; +use crate::execution::call_info::{CallExecution, CallInfo, OrderedEvent}; use crate::execution::common_hints::ExecutionMode; use crate::execution::deprecated_syscalls::DeprecatedSyscallSelector; use crate::execution::entry_point::{CallEntryPoint, CallType}; @@ -34,11 +41,6 @@ use crate::test_utils::{ get_syscall_resources, trivial_external_entry_point_new, CairoVersion, - CURRENT_BLOCK_NUMBER, - CURRENT_BLOCK_NUMBER_FOR_VALIDATE, - CURRENT_BLOCK_TIMESTAMP, - CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, - TEST_SEQUENCER_ADDRESS, }; use crate::transaction::objects::{ CommonAccountFields, @@ -153,9 +155,7 @@ fn test_nested_library_call() { let nested_storage_call_info = CallInfo { call: nested_storage_entry_point, execution: CallExecution::from_retdata(retdata![felt!(value + 1)]), - charged_resources: ChargedResources::from_execution_resources( - storage_entry_point_resources.clone(), - ), + resources: storage_entry_point_resources.clone(), storage_read_values: vec![felt!(value + 1)], accessed_storage_keys: HashSet::from([storage_key!(key + 1)]), ..Default::default() @@ -170,18 +170,14 @@ fn test_nested_library_call() { let library_call_info = CallInfo { call: library_entry_point, execution: CallExecution::from_retdata(retdata![felt!(value + 1)]), - charged_resources: ChargedResources::from_execution_resources( - library_call_resources.clone(), - ), + resources: library_call_resources.clone(), inner_calls: vec![nested_storage_call_info], ..Default::default() }; let storage_call_info = CallInfo { call: storage_entry_point, execution: CallExecution::from_retdata(retdata![felt!(value)]), - charged_resources: ChargedResources::from_execution_resources( - storage_entry_point_resources.clone(), - ), + resources: storage_entry_point_resources.clone(), storage_read_values: vec![felt!(value)], accessed_storage_keys: HashSet::from([storage_key!(key)]), ..Default::default() @@ -198,7 +194,7 @@ fn test_nested_library_call() { let expected_call_info = CallInfo { call: main_entry_point.clone(), execution: CallExecution::from_retdata(retdata![felt!(0_u8)]), - charged_resources: ChargedResources::from_execution_resources(main_call_resources), + resources: main_call_resources, inner_calls: vec![library_call_info, storage_call_info], ..Default::default() }; @@ -243,11 +239,11 @@ fn test_call_contract() { ..trivial_external_entry_point }, execution: expected_execution.clone(), - charged_resources: ChargedResources::from_execution_resources(ExecutionResources { + resources: ExecutionResources { n_steps: 222, n_memory_holes: 0, builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 2)]), - }), + }, storage_read_values: vec![value], accessed_storage_keys: HashSet::from([storage_key!(key_int)]), ..Default::default() @@ -261,14 +257,12 @@ fn test_call_contract() { ..trivial_external_entry_point }, execution: expected_execution, - charged_resources: ChargedResources::from_execution_resources( - &get_syscall_resources(DeprecatedSyscallSelector::CallContract) - + &ExecutionResources { - n_steps: 261, - n_memory_holes: 0, - builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 3)]), - }, - ), + resources: &get_syscall_resources(DeprecatedSyscallSelector::CallContract) + + &ExecutionResources { + n_steps: 261, + n_memory_holes: 0, + builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 3)]), + }, ..Default::default() }; diff --git a/crates/blockifier/src/execution/deprecated_syscalls/mod.rs b/crates/blockifier/src/execution/deprecated_syscalls/mod.rs index b921789774e..5a1d826399b 100644 --- a/crates/blockifier/src/execution/deprecated_syscalls/mod.rs +++ b/crates/blockifier/src/execution/deprecated_syscalls/mod.rs @@ -64,6 +64,9 @@ pub enum DeprecatedSyscallSelector { GetTxInfo, GetTxSignature, Keccak, + // TODO(Noa): Remove it (as it is not a syscall) and define its resources in + // `OsResources`. + KeccakRound, Sha256ProcessBlock, LibraryCall, LibraryCallL1Handler, diff --git a/crates/blockifier/src/execution/entry_point.rs b/crates/blockifier/src/execution/entry_point.rs index e7fd2e84a74..c3b23fd5f60 100644 --- a/crates/blockifier/src/execution/entry_point.rs +++ b/crates/blockifier/src/execution/entry_point.rs @@ -24,7 +24,7 @@ use starknet_types_core::felt::Felt; use crate::context::{BlockContext, TransactionContext}; use crate::execution::call_info::CallInfo; use crate::execution::common_hints::ExecutionMode; -use crate::execution::contract_class::TrackedResource; +use crate::execution::contract_class::{RunnableCompiledClass, TrackedResource}; use crate::execution::errors::{ ConstructorEntryPointExecutionError, EntryPointExecutionError, @@ -170,6 +170,12 @@ impl CallEntryPoint { ) -> EntryPointExecutionResult { let execution_result = self.execute(state, context, remaining_gas); if let Ok(call_info) = &execution_result { + // Update revert gas tracking (for completeness - value will not be used unless the tx + // is reverted). + context.sierra_gas_revert_tracker.update_with_next_remaining_gas( + call_info.tracked_resource, + GasAmount(*remaining_gas), + ); // If the execution of the outer call failed, revert the transction. if call_info.execution.failed { return Err(EntryPointExecutionError::ExecutionFailed { @@ -183,6 +189,7 @@ impl CallEntryPoint { execution_result } + pub fn verify_constructor(&self) -> Result<(), PreExecutionError> { if self.entry_point_type == EntryPointType::Constructor && self.entry_point_selector != selector_from_name(CONSTRUCTOR_ENTRY_POINT_NAME) @@ -202,6 +209,38 @@ pub struct ConstructorContext { pub caller_address: ContractAddress, } +#[derive(Debug)] +pub struct SierraGasRevertTracker { + initial_remaining_gas: GasAmount, + last_seen_remaining_gas: GasAmount, +} + +impl SierraGasRevertTracker { + pub fn new(initial_remaining_gas: GasAmount) -> Self { + Self { initial_remaining_gas, last_seen_remaining_gas: initial_remaining_gas } + } + + /// Updates the last seen remaining gas, if we are in gas-tracking mode. + pub fn update_with_next_remaining_gas( + &mut self, + tracked_resource: TrackedResource, + next_remaining_gas: GasAmount, + ) { + if tracked_resource == TrackedResource::SierraGas { + self.last_seen_remaining_gas = next_remaining_gas; + } + } + + pub fn get_gas_consumed(&self) -> GasAmount { + self.initial_remaining_gas.checked_sub(self.last_seen_remaining_gas).unwrap_or_else(|| { + panic!( + "The consumed gas must be non-negative. Initial gas: {}, last seen gas: {}.", + self.initial_remaining_gas, self.last_seen_remaining_gas + ) + }) + } +} + #[derive(Debug)] pub struct EntryPointExecutionContext { // We use `Arc` to avoid the clone of this potentially large object, as inner calls @@ -223,6 +262,9 @@ pub struct EntryPointExecutionContext { // Information for reverting the state (inludes the revert info of the callers). pub revert_infos: ExecutionRevertInfo, + + // Used to support charging for gas consumed in blockifier revert flow. + pub sierra_gas_revert_tracker: SierraGasRevertTracker, } impl EntryPointExecutionContext { @@ -230,6 +272,7 @@ impl EntryPointExecutionContext { tx_context: Arc, mode: ExecutionMode, limit_steps_by_resources: bool, + sierra_gas_revert_tracker: SierraGasRevertTracker, ) -> Self { let max_steps = Self::max_steps(&tx_context, &mode, limit_steps_by_resources); Self { @@ -241,18 +284,34 @@ impl EntryPointExecutionContext { execution_mode: mode, tracked_resource_stack: vec![], revert_infos: ExecutionRevertInfo(vec![]), + sierra_gas_revert_tracker, } } pub fn new_validate( tx_context: Arc, limit_steps_by_resources: bool, + sierra_gas_revert_tracker: SierraGasRevertTracker, ) -> Self { - Self::new(tx_context, ExecutionMode::Validate, limit_steps_by_resources) + Self::new( + tx_context, + ExecutionMode::Validate, + limit_steps_by_resources, + sierra_gas_revert_tracker, + ) } - pub fn new_invoke(tx_context: Arc, limit_steps_by_resources: bool) -> Self { - Self::new(tx_context, ExecutionMode::Execute, limit_steps_by_resources) + pub fn new_invoke( + tx_context: Arc, + limit_steps_by_resources: bool, + sierra_gas_revert_tracker: SierraGasRevertTracker, + ) -> Self { + Self::new( + tx_context, + ExecutionMode::Execute, + limit_steps_by_resources, + sierra_gas_revert_tracker, + ) } /// Returns the maximum number of cairo steps allowed, given the max fee, gas price and the @@ -360,7 +419,7 @@ impl EntryPointExecutionContext { ) -> usize { let validate_steps = validate_call_info .as_ref() - .map(|call_info| call_info.charged_resources.vm_resources.n_steps) + .map(|call_info| call_info.resources.n_steps) .unwrap_or_default(); let overhead_steps = @@ -368,6 +427,17 @@ impl EntryPointExecutionContext { self.subtract_steps(validate_steps + overhead_steps) } + /// Calls update_with_next_remaining_gas if the tracked resource is sierra gas. + pub fn update_revert_gas_with_next_remaining_gas(&mut self, next_remaining_gas: GasAmount) { + self.sierra_gas_revert_tracker.update_with_next_remaining_gas( + *self + .tracked_resource_stack + .last() + .expect("Tracked resource stack should not be empty at this point."), + next_remaining_gas, + ); + } + pub fn versioned_constants(&self) -> &VersionedConstants { &self.tx_context.block_context.versioned_constants } @@ -412,8 +482,14 @@ pub fn execute_constructor_entry_point( })?; let Some(constructor_selector) = compiled_class.constructor_selector() else { // Contract has no constructor. - return handle_empty_constructor(&ctor_context, calldata, *remaining_gas) - .map_err(|error| ConstructorEntryPointExecutionError::new(error, &ctor_context, None)); + return handle_empty_constructor( + compiled_class, + context, + &ctor_context, + calldata, + *remaining_gas, + ) + .map_err(|error| ConstructorEntryPointExecutionError::new(error, &ctor_context, None)); }; let constructor_call = CallEntryPoint { @@ -434,6 +510,8 @@ pub fn execute_constructor_entry_point( } pub fn handle_empty_constructor( + compiled_class: RunnableCompiledClass, + context: &mut EntryPointExecutionContext, ctor_context: &ConstructorContext, calldata: Calldata, remaining_gas: u64, @@ -446,6 +524,14 @@ pub fn handle_empty_constructor( }); } + let current_tracked_resource = compiled_class.get_current_tracked_resource(context); + let initial_gas = if current_tracked_resource == TrackedResource::CairoSteps { + // Override the initial gas with a high value to be consistent with the behavior for the + // rest of the CairoSteps mode calls. + context.versioned_constants().infinite_gas_for_vm_mode() + } else { + remaining_gas + }; let empty_constructor_call_info = CallInfo { call: CallEntryPoint { class_hash: Some(ctor_context.class_hash), @@ -456,8 +542,9 @@ pub fn handle_empty_constructor( storage_address: ctor_context.storage_address, caller_address: ctor_context.caller_address, call_type: CallType::Call, - initial_gas: remaining_gas, + initial_gas, }, + tracked_resource: current_tracked_resource, ..Default::default() }; diff --git a/crates/blockifier/src/execution/entry_point_execution.rs b/crates/blockifier/src/execution/entry_point_execution.rs index 31a9611eed3..b84e4d4ef43 100644 --- a/crates/blockifier/src/execution/entry_point_execution.rs +++ b/crates/blockifier/src/execution/entry_point_execution.rs @@ -1,5 +1,3 @@ -use std::collections::HashSet; - use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::types::layout_name::LayoutName; use cairo_vm::types::relocatable::{MaybeRelocatable, Relocatable}; @@ -10,10 +8,9 @@ use cairo_vm::vm::runners::builtin_runner::BuiltinRunner; use cairo_vm::vm::runners::cairo_runner::{CairoArg, CairoRunner, ExecutionResources}; use cairo_vm::vm::security::verify_secure_runner; use num_traits::{ToPrimitive, Zero}; -use starknet_api::execution_resources::GasAmount; use starknet_types_core::felt::Felt; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources, Retdata}; +use crate::execution::call_info::{CallExecution, CallInfo, Retdata}; use crate::execution::contract_class::{CompiledClassV1, EntryPointV1, TrackedResource}; use crate::execution::entry_point::{ CallEntryPoint, @@ -61,13 +58,10 @@ pub fn execute_entry_point_call( state: &mut dyn State, context: &mut EntryPointExecutionContext, ) -> EntryPointExecutionResult { - // Fetch the class hash from `call`. - let class_hash = call.class_hash.ok_or(EntryPointExecutionError::InternalError( - "Class hash must not be None when executing an entry point.".into(), - ))?; - let tracked_resource = *context.tracked_resource_stack.last().expect("Unexpected empty tracked resource."); + // Extract information from the context, as it will be passed as a mutable reference. + let entry_point_initial_budget = context.gas_costs().base.entry_point_initial_budget; let VmExecutionContext { mut runner, mut syscall_handler, @@ -82,7 +76,9 @@ pub fn execute_entry_point_call( initial_syscall_ptr, &mut syscall_handler.read_only_segments, &entry_point, + entry_point_initial_budget, )?; + let n_total_args = args.len(); // Execute. @@ -90,15 +86,6 @@ pub fn execute_entry_point_call( let program_segment_size = bytecode_length + program_extra_data_length; run_entry_point(&mut runner, &mut syscall_handler, entry_point, args, program_segment_size)?; - // Collect the set PC values that were visited during the entry point execution. - register_visited_pcs( - &mut runner, - syscall_handler.base.state, - class_hash, - program_segment_size, - bytecode_length, - )?; - Ok(finalize_execution( runner, syscall_handler, @@ -108,38 +95,6 @@ pub fn execute_entry_point_call( )?) } -// Collects the set PC values that were visited during the entry point execution. -fn register_visited_pcs( - runner: &mut CairoRunner, - state: &mut dyn State, - class_hash: starknet_api::core::ClassHash, - program_segment_size: usize, - bytecode_length: usize, -) -> EntryPointExecutionResult<()> { - let mut class_visited_pcs = HashSet::new(); - // Relocate the trace, putting the program segment at address 1 and the execution segment right - // after it. - // TODO(lior): Avoid unnecessary relocation once the VM has a non-relocated `get_trace()` - // function. - runner.relocate_trace(&[1, 1 + program_segment_size])?; - for trace_entry in runner.relocated_trace.as_ref().expect("Relocated trace not found") { - let pc = trace_entry.pc; - if pc < 1 { - return Err(EntryPointExecutionError::InternalError(format!( - "Invalid PC value {pc} in trace." - ))); - } - let real_pc = pc - 1; - // Jumping to a PC that is not inside the bytecode is possible. For example, to obtain - // the builtin costs. Filter out these values. - if real_pc < bytecode_length { - class_visited_pcs.insert(real_pc); - } - } - state.add_visited_pcs(class_hash, &class_visited_pcs); - Ok(()) -} - pub fn initialize_execution_context<'a>( call: CallEntryPoint, compiled_class: &'a CompiledClassV1, @@ -150,7 +105,7 @@ pub fn initialize_execution_context<'a>( // Instantiate Cairo runner. let proof_mode = false; - let trace_enabled = true; + let trace_enabled = false; let mut runner = CairoRunner::new( &compiled_class.0.program, LayoutName::starknet, @@ -196,12 +151,12 @@ fn prepare_program_extra_data( // Create the builtin cost segment, the builtin order should be the same as the price builtin // array in the os in compiled_class.cairo in load_compiled_class_facts. let builtin_price_array = [ - gas_costs.base.pedersen_gas_cost, - gas_costs.base.bitwise_builtin_gas_cost, - gas_costs.base.ecop_gas_cost, - gas_costs.base.poseidon_gas_cost, - gas_costs.base.add_mod_gas_cost, - gas_costs.base.mul_mod_gas_cost, + gas_costs.builtins.pedersen, + gas_costs.builtins.bitwise, + gas_costs.builtins.ecop, + gas_costs.builtins.poseidon, + gas_costs.builtins.add_mod, + gas_costs.builtins.mul_mod, ]; let data = builtin_price_array @@ -228,6 +183,7 @@ pub fn prepare_call_arguments( initial_syscall_ptr: Relocatable, read_only_segments: &mut ReadOnlySegments, entrypoint: &EntryPointV1, + entry_point_initial_budget: u64, ) -> Result { let mut args: Args = vec![]; @@ -256,8 +212,15 @@ pub fn prepare_call_arguments( } return Err(PreExecutionError::InvalidBuiltin(*builtin_name)); } + // Pre-charge entry point's initial budget to ensure sufficient gas for executing a minimal + // entry point code. When redepositing is used, the entry point is aware of this pre-charge + // and adjusts the gas counter accordingly if a smaller amount of gas is required. + let call_initial_gas = call + .initial_gas + .checked_sub(entry_point_initial_budget) + .ok_or(PreExecutionError::InsufficientEntryPointGas)?; // Push gas counter. - args.push(CairoArg::Single(MaybeRelocatable::from(Felt::from(call.initial_gas)))); + args.push(CairoArg::Single(MaybeRelocatable::from(Felt::from(call_initial_gas)))); // Push syscall ptr. args.push(CairoArg::Single(MaybeRelocatable::from(initial_syscall_ptr))); @@ -360,20 +323,6 @@ fn maybe_fill_holes( Ok(()) } -/// Calculates the gas consumed in the current call. -pub fn gas_consumed_without_inner_calls( - tracked_resource: &TrackedResource, - gas_consumed: u64, - inner_calls: &[CallInfo], -) -> GasAmount { - GasAmount(match tracked_resource { - TrackedResource::CairoSteps => 0, - TrackedResource::SierraGas => gas_consumed - .checked_sub(inner_calls.iter().map(|call| call.execution.gas_consumed).sum::()) - .expect("gas_consumed unexpectedly underflowed."), - }) -} - pub fn finalize_execution( mut runner: CairoRunner, mut syscall_handler: SyscallHintProcessor<'_>, @@ -423,18 +372,8 @@ pub fn finalize_execution( syscall_handler.finalize(); - let charged_resources_without_inner_calls = ChargedResources { - vm_resources: vm_resources_without_inner_calls, - gas_for_fee: gas_consumed_without_inner_calls( - &tracked_resource, - call_result.gas_consumed, - &syscall_handler.base.inner_calls, - ), - }; - - let charged_resources = &charged_resources_without_inner_calls - + &CallInfo::summarize_charged_resources(syscall_handler.base.inner_calls.iter()); - + let vm_resources = &vm_resources_without_inner_calls + + &CallInfo::summarize_vm_resources(syscall_handler.base.inner_calls.iter()); let syscall_handler_base = syscall_handler.base; Ok(CallInfo { call: syscall_handler_base.call, @@ -447,7 +386,7 @@ pub fn finalize_execution( }, inner_calls: syscall_handler_base.inner_calls, tracked_resource, - charged_resources, + resources: vm_resources, storage_read_values: syscall_handler_base.read_values, accessed_storage_keys: syscall_handler_base.accessed_keys, read_class_hash_values: syscall_handler_base.read_class_hash_values, diff --git a/crates/blockifier/src/execution/entry_point_execution_test.rs b/crates/blockifier/src/execution/entry_point_execution_test.rs index 2fe0d29542a..7f0fc4a3226 100644 --- a/crates/blockifier/src/execution/entry_point_execution_test.rs +++ b/crates/blockifier/src/execution/entry_point_execution_test.rs @@ -7,10 +7,9 @@ use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::Calldata; use crate::context::ChainInfo; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources}; +use crate::execution::call_info::CallInfo; use crate::execution::contract_class::TrackedResource; use crate::execution::entry_point::CallEntryPoint; -use crate::execution::entry_point_execution::gas_consumed_without_inner_calls; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::initial_test_state::test_state; use crate::test_utils::syscall::build_recurse_calldata; @@ -22,79 +21,28 @@ use crate::test_utils::{ BALANCE, }; -#[test] -/// Verifies that every call from the inner most to the outer has the expected gas_for_fee for the -/// following topology (marked as TrackedResource(gas_consumed)): -// Gas(8) -> Gas(3) -> VM(2) -> VM(1) -// \ -> VM(4) -// Expected values are 1 -> 1 -> 0 -> 0. -// \-> 0. -fn test_gas_for_fee() { - // First branch - 3 nested calls. - let mut inner_calls = vec![]; - for (tracked_resource, gas_consumed, expected_gas_for_fee) in [ - (TrackedResource::CairoSteps, 1, 0), - (TrackedResource::CairoSteps, 2, 0), - (TrackedResource::SierraGas, 3, 1), - ] { - assert_eq!( - gas_consumed_without_inner_calls(&tracked_resource, gas_consumed, &inner_calls).0, - expected_gas_for_fee - ); - inner_calls = vec![CallInfo { - execution: CallExecution { gas_consumed, ..Default::default() }, - tracked_resource, - inner_calls, - charged_resources: ChargedResources { - gas_for_fee: GasAmount(expected_gas_for_fee), - ..Default::default() - }, - ..Default::default() - }]; - } - - // Second branch - 1 call. - let (tracked_resource, gas_consumed, expected_gas_for_fee) = - (TrackedResource::CairoSteps, 4, 0); - assert_eq!( - gas_consumed_without_inner_calls(&tracked_resource, gas_consumed, &[]).0, - expected_gas_for_fee - ); - - inner_calls.push(CallInfo { - execution: CallExecution { gas_consumed, ..Default::default() }, - tracked_resource, - charged_resources: ChargedResources { - gas_for_fee: GasAmount(expected_gas_for_fee), - ..Default::default() - }, - ..Default::default() - }); - - // Outer call. - assert_eq!(gas_consumed_without_inner_calls(&TrackedResource::SierraGas, 8, &inner_calls).0, 1); -} - /// Asserts that the charged resources of a call is consistent with the inner calls in its subtree. fn assert_charged_resource_as_expected_rec(call_info: &CallInfo) { let inner_calls = &call_info.inner_calls; let mut children_vm_resources = ExecutionResources::default(); let mut children_gas = GasAmount(0); for child_call_info in inner_calls.iter() { - let ChargedResources { gas_for_fee, vm_resources } = &child_call_info.charged_resources; + let gas_consumed = GasAmount(child_call_info.execution.gas_consumed); + let vm_resources = &child_call_info.resources; children_vm_resources += vm_resources; - children_gas += *gas_for_fee; + children_gas += gas_consumed; } - let ChargedResources { gas_for_fee, vm_resources } = &call_info.charged_resources; + let gas_consumed = GasAmount(call_info.execution.gas_consumed); + let vm_resources = &call_info.resources; match call_info.tracked_resource { TrackedResource::SierraGas => { assert_eq!(vm_resources, &children_vm_resources); - assert!(gas_for_fee > &children_gas) + assert!(gas_consumed > children_gas) } TrackedResource::CairoSteps => { - assert_eq!(gas_for_fee, &children_gas); + assert_eq!(gas_consumed, children_gas); assert!(vm_resources.n_steps > children_vm_resources.n_steps) } } diff --git a/crates/blockifier/src/execution/entry_point_test.rs b/crates/blockifier/src/execution/entry_point_test.rs index 845fec006a4..405d837537a 100644 --- a/crates/blockifier/src/execution/entry_point_test.rs +++ b/crates/blockifier/src/execution/entry_point_test.rs @@ -200,7 +200,7 @@ fn run_security_test( entry_point_selector: selector_from_name(entry_point_name), calldata, storage_address: security_contract.get_instance_address(0), - initial_gas: versioned_constants.inifite_gas_for_vm_mode(), + initial_gas: versioned_constants.infinite_gas_for_vm_mode(), ..Default::default() }; let error = match entry_point_call.execute_directly(state) { @@ -525,12 +525,8 @@ fn test_old_cairo1_entry_point_segment_arena() { }; assert_eq!( - entry_point_call - .execute_directly(&mut state) - .unwrap() - .charged_resources - .vm_resources - .builtin_instance_counter[&BuiltinName::segment_arena], + entry_point_call.execute_directly(&mut state).unwrap().resources.builtin_instance_counter + [&BuiltinName::segment_arena], // Note: the number of segment_arena instances should not depend on the compiler or VM // version. Do not manually fix this then when upgrading them - it might be a bug. 2 diff --git a/crates/blockifier/src/execution/errors.rs b/crates/blockifier/src/execution/errors.rs index 6dc1b6f9bdb..8345db57ccd 100644 --- a/crates/blockifier/src/execution/errors.rs +++ b/crates/blockifier/src/execution/errors.rs @@ -50,6 +50,11 @@ pub enum PreExecutionError { UninitializedStorageAddress(ContractAddress), #[error("Called builtins: {0:?} are unsupported in a Cairo0 contract")] UnsupportedCairo0Builtin(HashSet), + #[error( + "Insufficient entry point initial gas, must be greater than the entry point initial \ + budget." + )] + InsufficientEntryPointGas, } impl From for PreExecutionError { diff --git a/crates/blockifier/src/execution/execution_utils.rs b/crates/blockifier/src/execution/execution_utils.rs index 38ed259227c..153b6cde55a 100644 --- a/crates/blockifier/src/execution/execution_utils.rs +++ b/crates/blockifier/src/execution/execution_utils.rs @@ -40,7 +40,7 @@ use crate::execution::errors::{ #[cfg(feature = "cairo_native")] use crate::execution::native::entry_point_execution as native_entry_point_execution; use crate::execution::stack_trace::{extract_trailing_cairo1_revert_trace, Cairo1RevertHeader}; -use crate::execution::syscalls::hint_processor::ENTRYPOINT_NOT_FOUND_ERROR; +use crate::execution::syscalls::hint_processor::{ENTRYPOINT_NOT_FOUND_ERROR, OUT_OF_GAS_ERROR}; use crate::execution::{deprecated_entry_point_execution, entry_point_execution}; use crate::state::errors::StateError; use crate::state::state_api::State; @@ -57,16 +57,12 @@ pub fn execute_entry_point_call_wrapper( context: &mut EntryPointExecutionContext, remaining_gas: &mut u64, ) -> EntryPointExecutionResult { - let current_tracked_resource = compiled_class.tracked_resource( - &context.versioned_constants().min_compiler_version_for_sierra_gas, - context.tracked_resource_stack.last(), - ); + let current_tracked_resource = compiled_class.get_current_tracked_resource(context); if current_tracked_resource == TrackedResource::CairoSteps { // Override the initial gas with a high value so it won't limit the run. - call.initial_gas = context.versioned_constants().inifite_gas_for_vm_mode(); + call.initial_gas = context.versioned_constants().infinite_gas_for_vm_mode(); } let orig_call = call.clone(); - // Note: no return statements (explicit or implicit) should be added between the push and the // pop commands. context.tracked_resource_stack.push(current_tracked_resource); @@ -87,20 +83,27 @@ pub fn execute_entry_point_call_wrapper( update_remaining_gas(remaining_gas, &call_info); Ok(call_info) } - Err(EntryPointExecutionError::PreExecutionError( - PreExecutionError::EntryPointNotFound(_) - | PreExecutionError::NoEntryPointOfTypeFound(_), - )) if context.versioned_constants().enable_reverts => Ok(CallInfo { - call: orig_call, - execution: CallExecution { - retdata: Retdata(vec![Felt::from_hex(ENTRYPOINT_NOT_FOUND_ERROR).unwrap()]), - failed: true, - gas_consumed: 0, - ..CallExecution::default() - }, - tracked_resource: current_tracked_resource, - ..CallInfo::default() - }), + Err(EntryPointExecutionError::PreExecutionError(err)) + if context.versioned_constants().enable_reverts => + { + let error_code = match err { + PreExecutionError::EntryPointNotFound(_) + | PreExecutionError::NoEntryPointOfTypeFound(_) => ENTRYPOINT_NOT_FOUND_ERROR, + PreExecutionError::InsufficientEntryPointGas => OUT_OF_GAS_ERROR, + _ => return Err(err.into()), + }; + Ok(CallInfo { + call: orig_call, + execution: CallExecution { + retdata: Retdata(vec![Felt::from_hex(error_code).unwrap()]), + failed: true, + gas_consumed: 0, + ..CallExecution::default() + }, + tracked_resource: current_tracked_resource, + ..CallInfo::default() + }) + } Err(err) => Err(err), } } @@ -112,53 +115,42 @@ pub fn execute_entry_point_call( state: &mut dyn State, context: &mut EntryPointExecutionContext, ) -> EntryPointExecutionResult { - match compiled_class { + let pre_time = std::time::Instant::now(); + let mut result = match compiled_class { RunnableCompiledClass::V0(compiled_class) => { - let pre_time = std::time::Instant::now(); - let mut result = deprecated_entry_point_execution::execute_entry_point_call( + deprecated_entry_point_execution::execute_entry_point_call( call, compiled_class, state, context, - )?; - result.time = pre_time.elapsed(); - Ok(result) + ) } RunnableCompiledClass::V1(compiled_class) => { - let pre_time = std::time::Instant::now(); - let mut result = entry_point_execution::execute_entry_point_call( - call, - compiled_class, - state, - context, - )?; - result.time = pre_time.elapsed(); - Ok(result) + entry_point_execution::execute_entry_point_call(call, compiled_class, state, context) } #[cfg(feature = "cairo_native")] RunnableCompiledClass::V1Native(compiled_class) => { - // if context.tracked_resource_stack.last() == Some(&TrackedResource::CairoSteps) { - // // We cannot run native with cairo steps as the tracked resources (it's a vm - // // resouorce). - // entry_point_execution::execute_entry_point_call( - // call, - // compiled_class.casm(), - // state, - // context, - // ) - // } else { - let pre_time = std::time::Instant::now(); - let mut result = native_entry_point_execution::execute_entry_point_call( - call, - compiled_class, - state, - context, - )?; - result.time = pre_time.elapsed(); - Ok(result) - // } + if context.tracked_resource_stack.last() == Some(&TrackedResource::CairoSteps) + && !cfg!(feature = "only-native") + { + entry_point_execution::execute_entry_point_call( + call, + compiled_class.casm(), + state, + context, + ) + } else { + native_entry_point_execution::execute_entry_point_call( + call, + compiled_class, + state, + context, + ) + } } - } + }?; + result.time = pre_time.elapsed(); + Ok(result) } pub fn update_remaining_gas(remaining_gas: &mut u64, call_info: &CallInfo) { diff --git a/crates/blockifier/src/execution/native/entry_point_execution.rs b/crates/blockifier/src/execution/native/entry_point_execution.rs index 8ec8dc1f02e..c9b8c59b580 100644 --- a/crates/blockifier/src/execution/native/entry_point_execution.rs +++ b/crates/blockifier/src/execution/native/entry_point_execution.rs @@ -1,17 +1,14 @@ use cairo_native::execution_result::ContractExecutionResult; use cairo_native::utils::BuiltinCosts; -use cairo_vm::vm::runners::cairo_runner::ExecutionResources; -use stacker; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources, Retdata}; +use crate::execution::call_info::{CallExecution, CallInfo, Retdata}; use crate::execution::contract_class::TrackedResource; use crate::execution::entry_point::{ CallEntryPoint, EntryPointExecutionContext, EntryPointExecutionResult, }; -use crate::execution::entry_point_execution::gas_consumed_without_inner_calls; -use crate::execution::errors::{EntryPointExecutionError, PostExecutionError}; +use crate::execution::errors::{EntryPointExecutionError, PostExecutionError, PreExecutionError}; use crate::execution::native::contract_class::NativeCompiledClassV1; use crate::execution::native::syscall_handler::NativeSyscallHandler; use crate::state::state_api::State; @@ -32,41 +29,33 @@ pub fn execute_entry_point_call( let builtin_costs = BuiltinCosts { // todo(rodrigo): Unsure of what value `const` means, but 1 is the right value. r#const: 1, - pedersen: gas_costs.base.pedersen_gas_cost, - bitwise: gas_costs.base.bitwise_builtin_gas_cost, - ecop: gas_costs.base.ecop_gas_cost, - poseidon: gas_costs.base.poseidon_gas_cost, - add_mod: gas_costs.base.add_mod_gas_cost, - mul_mod: gas_costs.base.mul_mod_gas_cost, + pedersen: gas_costs.builtins.pedersen, + bitwise: gas_costs.builtins.bitwise, + ecop: gas_costs.builtins.ecop, + poseidon: gas_costs.builtins.poseidon, + add_mod: gas_costs.builtins.add_mod, + mul_mod: gas_costs.builtins.mul_mod, }; - // Grow the stack (if it's below the red zone) to handle deep Cairo recursions - - // when running Cairo natively, the real stack is used and could get overflowed - // (unlike the VM where the stack is simulated in the heap as a memory segment). - // - // We pre-allocate the stack here, and not during Native execution (not trivial), so it - // needs to be big enough ahead. - // However, making it very big is wasteful (especially with multi-threading). - // So, the stack size should support calls with a reasonable gas limit, for extremely deep - // recursions to reach out-of-gas before hitting the bottom of the recursion. - // - // The gas upper bound is MAX_POSSIBLE_SIERRA_GAS, and sequencers must not raise it without - // adjusting the stack size. - // This also limits multi-threading, since each thread has its own stack. - // TODO(Aviv/Yonatan): add these numbers to overridable VC. - let stack_size_red_zone = if !cfg!(feature = "profiling") { 160 * 1024 * 1024 } else { 0 }; - let target_stack_size = stack_size_red_zone + 10 * 1024 * 1024; - // Use `maybe_grow` and not `grow` for performance, since in happy flows, only the main call - // should trigger the growth. - let execution_result = stacker::maybe_grow(stack_size_red_zone, target_stack_size, || { - compiled_class.executor.run( - entry_point.selector.0, - &syscall_handler.base.call.calldata.0.clone(), - syscall_handler.base.call.initial_gas, - Some(builtin_costs), - &mut syscall_handler, - ) - }); + // Pre-charge entry point's initial budget to ensure sufficient gas for executing a minimal + // entry point code. When redepositing is used, the entry point is aware of this pre-charge + // and adjusts the gas counter accordingly if a smaller amount of gas is required. + let initial_budget = syscall_handler.base.context.gas_costs().base.entry_point_initial_budget; + let call_initial_gas = syscall_handler + .base + .call + .initial_gas + .checked_sub(initial_budget) + .ok_or(PreExecutionError::InsufficientEntryPointGas)?; + + let execution_result = compiled_class.executor.run( + entry_point.selector.0, + &syscall_handler.base.call.calldata.0.clone(), + call_initial_gas, + Some(builtin_costs), + &mut syscall_handler, + ); + syscall_handler.finalize(); let call_result = execution_result.map_err(EntryPointExecutionError::NativeUnexpectedError)?; @@ -95,17 +84,7 @@ fn create_callinfo( } let gas_consumed = syscall_handler.base.call.initial_gas - remaining_gas; - - let charged_resources_without_inner_calls = ChargedResources { - vm_resources: ExecutionResources::default(), - gas_for_fee: gas_consumed_without_inner_calls( - &TrackedResource::SierraGas, - gas_consumed, - &syscall_handler.base.inner_calls, - ), - }; - let charged_resources = &charged_resources_without_inner_calls - + &CallInfo::summarize_charged_resources(syscall_handler.base.inner_calls.iter()); + let vm_resources = CallInfo::summarize_vm_resources(syscall_handler.base.inner_calls.iter()); Ok(CallInfo { call: syscall_handler.base.call, @@ -116,7 +95,7 @@ fn create_callinfo( failed: call_result.failure_flag, gas_consumed, }, - charged_resources, + resources: vm_resources, inner_calls: syscall_handler.base.inner_calls, storage_read_values: syscall_handler.base.read_values, accessed_storage_keys: syscall_handler.base.accessed_keys, diff --git a/crates/blockifier/src/execution/native/executor.rs b/crates/blockifier/src/execution/native/executor.rs index 9e5cd7c4c80..70955b8ce43 100644 --- a/crates/blockifier/src/execution/native/executor.rs +++ b/crates/blockifier/src/execution/native/executor.rs @@ -46,8 +46,18 @@ impl ContractExecutor { let mut virtual_machine = VirtualMachine::new_starknet(program.to_owned(), entrypoints); + let builtin_costs = builtin_costs.map(|builtin_costs| sierra_emu::BuiltinCosts { + r#const: builtin_costs.r#const, + pedersen: builtin_costs.pedersen, + bitwise: builtin_costs.bitwise, + ecop: builtin_costs.ecop, + poseidon: builtin_costs.poseidon, + add_mod: builtin_costs.add_mod, + mul_mod: builtin_costs.mul_mod, + }); + let args = args.to_owned(); - virtual_machine.call_contract(selector, gas, args); + virtual_machine.call_contract(selector, gas, args, builtin_costs); let result = virtual_machine.run(&mut syscall_handler).unwrap(); diff --git a/crates/blockifier/src/execution/native/syscall_handler.rs b/crates/blockifier/src/execution/native/syscall_handler.rs index bdef145cb97..82644e4ce46 100644 --- a/crates/blockifier/src/execution/native/syscall_handler.rs +++ b/crates/blockifier/src/execution/native/syscall_handler.rs @@ -19,6 +19,7 @@ use cairo_native::starknet::{ use num_bigint::BigUint; use starknet_api::contract_class::EntryPointType; use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, EthAddress}; +use starknet_api::execution_resources::GasAmount; use starknet_api::state::StorageKey; use starknet_api::transaction::fields::{Calldata, ContractAddressSalt}; use starknet_api::transaction::{EventContent, EventData, EventKey, L2ToL1Payload}; @@ -36,6 +37,8 @@ use crate::state::state_api::State; use crate::transaction::objects::TransactionInfo; use crate::versioned_constants::GasCosts; +pub const CALL_CONTRACT_SELECTOR_NAME: &str = "call_contract"; +pub const LIBRARY_CALL_SELECTOR_NAME: &str = "library_call"; pub struct NativeSyscallHandler<'state> { pub base: Box>, @@ -55,19 +58,6 @@ impl<'state> NativeSyscallHandler<'state> { } } - fn execute_inner_call( - &mut self, - entry_point: CallEntryPoint, - remaining_gas: &mut u64, - ) -> SyscallResult { - let raw_retdata = self - .base - .execute_inner_call(entry_point, remaining_gas) - .map_err(|e| self.handle_error(remaining_gas, e))?; - - Ok(Retdata(raw_retdata)) - } - pub fn gas_costs(&self) -> &GasCosts { self.base.context.gas_costs() } @@ -97,6 +87,20 @@ impl<'state> NativeSyscallHandler<'state> { *remaining_gas -= required_gas; + // To support sierra gas charge for blockifier revert flow, we track the remaining gas left + // before executing a syscall if the current tracked resource is gas. + // 1. If the syscall does not run Cairo code (i.e. not library call, not call contract, and + // not a deploy), any failure will not run in the OS, so no need to charge - the value + // before entering the callback is good enough to charge. + // 2. If the syscall runs Cairo code, but the tracked resource is steps (and not gas), the + // additional charge of reverted cairo steps will cover the inner cost, and the outer + // cost we track here will be the additional reverted gas. + // 3. If the syscall runs Cairo code and the tracked resource is gas, either the inner + // failure will be a Cairo1 revert (and the gas consumed on the call info will override + // the current tracked value), or we will pass through another syscall before failing - + // and by induction (we will reach this point again), the gas will be charged correctly. + self.base.context.update_revert_gas_with_next_remaining_gas(GasAmount(*remaining_gas)); + Ok(()) } @@ -116,7 +120,7 @@ impl<'state> NativeSyscallHandler<'state> { } match error { - SyscallExecutionError::SyscallError { error_data } => error_data, + SyscallExecutionError::Revert { error_data } => error_data, error => { assert!( self.unrecoverable_error.is_none(), @@ -129,6 +133,36 @@ impl<'state> NativeSyscallHandler<'state> { } } + fn execute_inner_call( + &mut self, + entry_point: CallEntryPoint, + remaining_gas: &mut u64, + class_hash: ClassHash, + error_wrapper_fn: impl Fn( + SyscallExecutionError, + ClassHash, + ContractAddress, + EntryPointSelector, + ) -> SyscallExecutionError, + ) -> SyscallResult { + let entry_point_clone = entry_point.clone(); + let raw_data = self.base.execute_inner_call(entry_point, remaining_gas).map_err(|e| { + self.handle_error( + remaining_gas, + match e { + SyscallExecutionError::Revert { .. } => e, + _ => error_wrapper_fn( + e, + class_hash, + entry_point_clone.storage_address, + entry_point_clone.entry_point_selector, + ), + }, + ) + })?; + Ok(Retdata(raw_data)) + } + fn get_tx_info_v1(&self) -> TxInfo { let tx_info = &self.base.context.tx_context.tx_info; TxInfo { @@ -146,31 +180,16 @@ impl<'state> NativeSyscallHandler<'state> { } fn get_block_info(&self) -> BlockInfo { - let block_info = &self.base.context.tx_context.block_context.block_info; - if self.base.context.execution_mode == ExecutionMode::Validate { - let versioned_constants = self.base.context.versioned_constants(); - let block_number = block_info.block_number.0; - let block_timestamp = block_info.block_timestamp.0; - // Round down to the nearest multiple of validate_block_number_rounding. - let validate_block_number_rounding = - versioned_constants.get_validate_block_number_rounding(); - let rounded_block_number = - (block_number / validate_block_number_rounding) * validate_block_number_rounding; - // Round down to the nearest multiple of validate_timestamp_rounding. - let validate_timestamp_rounding = versioned_constants.get_validate_timestamp_rounding(); - let rounded_timestamp = - (block_timestamp / validate_timestamp_rounding) * validate_timestamp_rounding; - BlockInfo { - block_number: rounded_block_number, - block_timestamp: rounded_timestamp, - sequencer_address: Felt::ZERO, - } - } else { - BlockInfo { - block_number: block_info.block_number.0, - block_timestamp: block_info.block_timestamp.0, - sequencer_address: Felt::from(block_info.sequencer_address), + let block_info = match self.base.context.execution_mode { + ExecutionMode::Execute => self.base.context.tx_context.block_context.block_info(), + ExecutionMode::Validate => { + &self.base.context.tx_context.block_context.block_info_for_validate() } + }; + BlockInfo { + block_number: block_info.block_number.0, + block_timestamp: block_info.block_timestamp.0, + sequencer_address: Felt::from(block_info.sequencer_address), } } @@ -310,11 +329,13 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> { let wrapper_calldata = Calldata(Arc::new(calldata.to_vec())); + let selector = EntryPointSelector(function_selector); + let entry_point = CallEntryPoint { class_hash: Some(class_hash), code_address: None, entry_point_type: EntryPointType::External, - entry_point_selector: EntryPointSelector(function_selector), + entry_point_selector: selector, calldata: wrapper_calldata, // The call context remains the same in a library call. storage_address: self.base.call.storage_address, @@ -323,7 +344,17 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> { initial_gas: *remaining_gas, }; - Ok(self.execute_inner_call(entry_point, remaining_gas)?.0) + let error_wrapper_function = + |e: SyscallExecutionError, + class_hash: ClassHash, + storage_address: ContractAddress, + selector: EntryPointSelector| { + e.as_lib_call_execution_error(class_hash, storage_address, selector) + }; + + Ok(self + .execute_inner_call(entry_point, remaining_gas, class_hash, error_wrapper_function)? + .0) } fn call_contract( @@ -337,6 +368,12 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> { let contract_address = ContractAddress::try_from(address) .map_err(|error| self.handle_error(remaining_gas, error.into()))?; + + let class_hash = self + .base + .state + .get_class_hash_at(contract_address) + .map_err(|e| self.handle_error(remaining_gas, e.into()))?; if self.base.context.execution_mode == ExecutionMode::Validate && self.base.call.storage_address != contract_address { @@ -357,12 +394,21 @@ impl StarknetSyscallHandler for &mut NativeSyscallHandler<'_> { calldata: wrapper_calldata, storage_address: contract_address, caller_address: self.base.call.storage_address, - call_type: CallType::Call, initial_gas: *remaining_gas, }; - Ok(self.execute_inner_call(entry_point, remaining_gas)?.0) + let error_wrapper_function = + |e: SyscallExecutionError, + class_hash: ClassHash, + storage_address: ContractAddress, + selector: EntryPointSelector| { + e.as_call_contract_execution_error(class_hash, storage_address, selector) + }; + + Ok(self + .execute_inner_call(entry_point, remaining_gas, class_hash, error_wrapper_function)? + .0) } fn storage_read( diff --git a/crates/blockifier/src/execution/secp.rs b/crates/blockifier/src/execution/secp.rs index f96bb11633f..976bbfacb18 100644 --- a/crates/blockifier/src/execution/secp.rs +++ b/crates/blockifier/src/execution/secp.rs @@ -47,7 +47,7 @@ where if bounds.iter().any(|p| **p >= modulus) { let error = match Felt::from_hex(INVALID_ARGUMENT) { - Ok(err) => SyscallExecutionError::SyscallError { error_data: vec![err] }, + Ok(err) => SyscallExecutionError::Revert { error_data: vec![err] }, Err(err) => SyscallExecutionError::from(err), }; diff --git a/crates/blockifier/src/execution/stack_trace.rs b/crates/blockifier/src/execution/stack_trace.rs index 1b90caad70d..f05a023b167 100644 --- a/crates/blockifier/src/execution/stack_trace.rs +++ b/crates/blockifier/src/execution/stack_trace.rs @@ -709,6 +709,10 @@ fn extract_entry_point_execution_error_into_stack_trace( EntryPointExecutionError::CairoRunError(cairo_run_error) => { extract_cairo_run_error_into_stack_trace(error_stack, depth, cairo_run_error) } + #[cfg(feature = "cairo_native")] + EntryPointExecutionError::NativeUnrecoverableError(error) => { + extract_syscall_execution_error_into_stack_trace(error_stack, depth, error) + } EntryPointExecutionError::ExecutionFailed { error_trace } => { error_stack.push(error_trace.clone().into()) } diff --git a/crates/blockifier/src/execution/stack_trace_test.rs b/crates/blockifier/src/execution/stack_trace_test.rs index 1a4868880c5..9654ce2bf7e 100644 --- a/crates/blockifier/src/execution/stack_trace_test.rs +++ b/crates/blockifier/src/execution/stack_trace_test.rs @@ -2,6 +2,7 @@ use assert_matches::assert_matches; use pretty_assertions::assert_eq; use regex::Regex; use rstest::rstest; +use rstest_reuse::apply; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::abi::constants::CONSTRUCTOR_ENTRY_POINT_NAME; use starknet_api::core::{ @@ -44,6 +45,7 @@ use crate::execution::stack_trace::{ use crate::execution::syscalls::hint_processor::ENTRYPOINT_FAILED_ERROR; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::initial_test_state::{fund_account, test_state}; +use crate::test_utils::test_templates::cairo_version; use crate::test_utils::{create_calldata, CairoVersion, RunnableCairo1, BALANCE}; use crate::transaction::account_transaction::{AccountTransaction, ExecutionFlags}; use crate::transaction::test_utils::{ @@ -145,11 +147,10 @@ An ASSERT_EQ instruction failed: 1 != 0. } #[rstest] -fn test_stack_trace( - block_context: BlockContext, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, -) { +#[case(CairoVersion::Cairo0)] +#[case(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr(feature = "cairo_native", case(CairoVersion::Cairo1(RunnableCairo1::Native)))] +fn test_stack_trace(block_context: BlockContext, #[case] cairo_version: CairoVersion) { let chain_info = ChainInfo::create_for_testing(); let account = FeatureContract::AccountWithoutValidations(cairo_version); let test_contract = FeatureContract::TestContract(cairo_version); @@ -187,40 +188,43 @@ fn test_stack_trace( ) .unwrap_err(); - // Fetch PC locations from the compiled contract to compute the expected PC locations in the - // traceback. Computation is not robust, but as long as the cairo function itself is not edited, - // this computation should be stable. - let account_entry_point_offset = - account.get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); let execute_selector_felt = selector_from_name(EXECUTE_ENTRY_POINT_NAME).0; let external_entry_point_selector_felt = selector_from_name(call_contract_function_name).0; - let entry_point_offset = - test_contract.get_entry_point_offset(selector_from_name(call_contract_function_name)); - // Relative offsets of the test_call_contract entry point and the inner call. - let call_location = entry_point_offset.0 + 14; - let entry_point_location = entry_point_offset.0 - 3; - // Relative offsets of the account contract. - let account_call_location = account_entry_point_offset.0 + 18; - let account_entry_point_location = account_entry_point_offset.0 - 8; - - let expected_trace_cairo0 = format!( - "Transaction execution has failed: + let expected_trace = match cairo_version { + CairoVersion::Cairo0 => { + // Fetch PC locations from the compiled contract to compute the expected PC locations in + // the traceback. Computation is not robust, but as long as the cairo + // function itself is not edited, this computation should be stable. + let account_entry_point_offset = + account.get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); + let entry_point_offset = test_contract + .get_entry_point_offset(selector_from_name(call_contract_function_name)); + // Relative offsets of the test_call_contract entry point and the inner call. + let call_location = entry_point_offset.0 + 14; + let entry_point_location = entry_point_offset.0 - 3; + // Relative offsets of the account contract. + let account_call_location = account_entry_point_offset.0 + 18; + let account_entry_point_location = account_entry_point_offset.0 - 8; + format!( + "Transaction execution has failed: 0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \ - {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): + {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): Error at pc=0:7: Cairo traceback (most recent call last): Unknown location (pc=0:{account_call_location}) Unknown location (pc=0:{account_entry_point_location}) 1: Error in the called contract (contract address: {test_contract_address_felt:#064x}, class hash: \ - {test_contract_hash:#064x}, selector: {external_entry_point_selector_felt:#064x}): + {test_contract_hash:#064x}, selector: \ + {external_entry_point_selector_felt:#064x}): Error at pc=0:37: Cairo traceback (most recent call last): Unknown location (pc=0:{call_location}) Unknown location (pc=0:{entry_point_location}) 2: Error in the called contract (contract address: {test_contract_address_2_felt:#064x}, class \ - hash: {test_contract_hash:#064x}, selector: {inner_entry_point_selector_felt:#064x}): + hash: {test_contract_hash:#064x}, selector: \ + {inner_entry_point_selector_felt:#064x}): Error message: You shall not pass! Error at pc=0:1294: Cairo traceback (most recent call last): @@ -228,30 +232,24 @@ Unknown location (pc=0:1298) An ASSERT_EQ instruction failed: 1 != 0. " - ); - - let expected_trace_cairo1 = format!( - "Transaction execution has failed: + ) + .to_string() + } + CairoVersion::Cairo1(_) => format!( + "Transaction execution has failed: 0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \ - {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): + {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): Execution failed. Failure reason: Error in contract (contract address: {account_address_felt:#064x}, class hash: \ - {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): + {account_contract_hash:#064x}, selector: {execute_selector_felt:#064x}): Error in contract (contract address: {test_contract_address_felt:#064x}, class hash: \ - {test_contract_hash:#064x}, selector: {external_entry_point_selector_felt:#064x}): + {test_contract_hash:#064x}, selector: {external_entry_point_selector_felt:#064x}): Error in contract (contract address: {test_contract_address_2_felt:#064x}, class hash: \ - {test_contract_hash:#064x}, selector: {inner_entry_point_selector_felt:#064x}): + {test_contract_hash:#064x}, selector: {inner_entry_point_selector_felt:#064x}): 0x6661696c ('fail'). " - ); - - let expected_trace = match cairo_version { - CairoVersion::Cairo0 => expected_trace_cairo0, - CairoVersion::Cairo1(RunnableCairo1::Casm) => expected_trace_cairo1, - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - panic!("Cairo Native is not yet supported") - } + ) + .to_string(), }; assert_eq!(tx_execution_error.to_string(), expected_trace); @@ -262,6 +260,14 @@ Error in contract (contract address: {test_contract_address_2_felt:#064x}, class #[case(CairoVersion::Cairo0, "fail", "An ASSERT_EQ instruction failed: 1 != 0.", (1294_u16, 1245_u16))] #[case(CairoVersion::Cairo1(RunnableCairo1::Casm), "invoke_call_chain", "0x4469766973696f6e2062792030 ('Division by 0')", (0_u16, 0_u16))] #[case(CairoVersion::Cairo1(RunnableCairo1::Casm), "fail", "0x6661696c ('fail')", (0_u16, 0_u16))] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "invoke_call_chain", "0x4469766973696f6e2062792030 ('Division by 0')", (0_u16, 0_u16)) +)] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "fail", "0x6661696c ('fail')", (0_u16, 0_u16)) +)] fn test_trace_callchain_ends_with_regular_call( block_context: BlockContext, #[case] cairo_version: CairoVersion, @@ -315,13 +321,14 @@ fn test_trace_callchain_ends_with_regular_call( ) .unwrap_err(); - let account_entry_point_offset = - account_contract.get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); - let entry_point_offset = test_contract.get_entry_point_offset(invoke_call_chain_selector); let execute_selector_felt = selector_from_name(EXECUTE_ENTRY_POINT_NAME).0; let expected_trace = match cairo_version { CairoVersion::Cairo0 => { + let account_entry_point_offset = account_contract + .get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); + let entry_point_offset = + test_contract.get_entry_point_offset(invoke_call_chain_selector); let call_location = entry_point_offset.0 + 12; let entry_point_location = entry_point_offset.0 - 61; // Relative offsets of the account contract. @@ -356,7 +363,7 @@ Unknown location (pc=0:{expected_pc1}) " ) } - CairoVersion::Cairo1(RunnableCairo1::Casm) => { + CairoVersion::Cairo1(_) => { format!( "Transaction execution has failed: 0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \ @@ -372,10 +379,6 @@ Error in contract (contract address: {contract_address_felt:#064x}, class hash: " ) } - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - todo!("Cairo Native is not yet supported here") - } }; assert_eq!(tx_execution_error.to_string(), expected_trace); @@ -390,6 +393,22 @@ Error in contract (contract address: {contract_address_felt:#064x}, class hash: #[case(CairoVersion::Cairo1(RunnableCairo1::Casm), "invoke_call_chain", "0x4469766973696f6e2062792030 ('Division by 0')", 1_u8, 1_u8, (9631_u16, 9700_u16, 0_u16, 0_u16))] #[case(CairoVersion::Cairo1(RunnableCairo1::Casm), "fail", "0x6661696c ('fail')", 0_u8, 0_u8, (9631_u16, 9631_u16, 0_u16, 0_u16))] #[case(CairoVersion::Cairo1(RunnableCairo1::Casm), "fail", "0x6661696c ('fail')", 0_u8, 1_u8, (9631_u16, 9700_u16, 0_u16, 0_u16))] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "invoke_call_chain", "0x4469766973696f6e2062792030 ('Division by 0')", 1_u8, 0_u8, (9631_u16, 9631_u16, 0_u16, 0_u16)) +)] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "invoke_call_chain", "0x4469766973696f6e2062792030 ('Division by 0')", 1_u8, 1_u8, (9631_u16, 9700_u16, 0_u16, 0_u16)) +)] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "fail", "0x6661696c ('fail')", 0_u8, 0_u8, (9631_u16, 9631_u16, 0_u16, 0_u16)) +)] +#[cfg_attr( + feature = "cairo_native", + case(CairoVersion::Cairo1(RunnableCairo1::Native), "fail", "0x6661696c ('fail')", 0_u8, 1_u8, (9631_u16, 9700_u16, 0_u16, 0_u16)) +)] fn test_trace_call_chain_with_syscalls( block_context: BlockContext, #[case] cairo_version: CairoVersion, @@ -456,9 +475,6 @@ fn test_trace_call_chain_with_syscalls( ) .unwrap_err(); - let account_entry_point_offset = - account_contract.get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); - let entry_point_offset = test_contract.get_entry_point_offset(invoke_call_chain_selector); let execute_selector_felt = selector_from_name(EXECUTE_ENTRY_POINT_NAME).0; let last_call_preamble = if call_type == 0 { @@ -475,6 +491,10 @@ fn test_trace_call_chain_with_syscalls( let expected_trace = match cairo_version { CairoVersion::Cairo0 => { + let account_entry_point_offset = account_contract + .get_entry_point_offset(selector_from_name(EXECUTE_ENTRY_POINT_NAME)); + let entry_point_offset = + test_contract.get_entry_point_offset(invoke_call_chain_selector); let call_location = entry_point_offset.0 + 12; let entry_point_location = entry_point_offset.0 - 61; // Relative offsets of the account contract. @@ -513,7 +533,7 @@ Unknown location (pc=0:{expected_pc3}) " ) } - CairoVersion::Cairo1(RunnableCairo1::Casm) => { + CairoVersion::Cairo1(_) => { format!( "Transaction execution has failed: 0: Error in the called contract (contract address: {account_address_felt:#064x}, class hash: \ @@ -531,10 +551,6 @@ Error in contract (contract address: {address_felt:#064x}, class hash: {test_con " ) } - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - todo!("Cairo Native not yet supported here.") - } }; assert_eq!(tx_execution_error.to_string(), expected_trace); @@ -542,7 +558,7 @@ Error in contract (contract address: {address_felt:#064x}, class hash: {test_con // TODO(Arni, 1/5/2024): Cover version 0 declare transaction. // TODO(Arni, 1/5/2024): Consider version 0 invoke. -#[rstest] +#[apply(cairo_version)] #[case::validate_version_1( TransactionType::InvokeFunction, VALIDATE_ENTRY_POINT_NAME, @@ -582,7 +598,6 @@ fn test_validate_trace( #[case] tx_type: TransactionType, #[case] entry_point_name: &str, #[case] tx_version: TransactionVersion, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] cairo_version: CairoVersion, ) { let create_for_account_testing = &BlockContext::create_for_account_testing(); @@ -634,7 +649,7 @@ An ASSERT_EQ instruction failed: 1 != 0. ", class_hash.0 ), - CairoVersion::Cairo1(RunnableCairo1::Casm) => format!( + CairoVersion::Cairo1(_) => format!( "The `validate` entry point panicked with: Error in contract (contract address: {contract_address:#064x}, class hash: {:#064x}, selector: \ {selector:#064x}): @@ -642,10 +657,6 @@ Error in contract (contract address: {contract_address:#064x}, class hash: {:#06 ", class_hash.0 ), - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - todo!("Cairo Native is not yet supported here.") - } }; // Clean pc locations from the trace. @@ -661,10 +672,12 @@ Error in contract (contract address: {contract_address:#064x}, class hash: {:#06 #[rstest] /// Tests that hitting an execution error in an account contract constructor outputs the correct /// traceback (including correct class hash, contract address and constructor entry point selector). +#[case(CairoVersion::Cairo0)] +#[case(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr(feature = "cairo_native", case(CairoVersion::Cairo1(RunnableCairo1::Native)))] fn test_account_ctor_frame_stack_trace( block_context: BlockContext, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { let chain_info = &block_context.chain_info; let faulty_account = FeatureContract::FaultyAccount(cairo_version); @@ -709,7 +722,7 @@ Unknown location (pc=0:206) An ASSERT_EQ instruction failed: 1 != 0. " .to_string(), - CairoVersion::Cairo1(RunnableCairo1::Casm) => format!( + CairoVersion::Cairo1(_) => format!( "Execution failed. Failure reason: Error in contract (contract address: {expected_address:#064x}, class hash: {:#064x}, selector: \ {expected_selector:#064x}): @@ -718,10 +731,6 @@ Error in contract (contract address: {expected_address:#064x}, class hash: {:#06 class_hash.0 ) .to_string(), - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - todo!("Cairo Native not yet supported here.") - } }; // Compare expected and actual error. @@ -733,11 +742,13 @@ Error in contract (contract address: {expected_address:#064x}, class hash: {:#06 /// Tests that hitting an execution error in a contract constructor during a deploy syscall outputs /// the correct traceback (including correct class hash, contract address and constructor entry /// point selector). +#[case(CairoVersion::Cairo0)] +#[case(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr(feature = "cairo_native", case(CairoVersion::Cairo1(RunnableCairo1::Native)))] fn test_contract_ctor_frame_stack_trace( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { let chain_info = &block_context.chain_info; let account = FeatureContract::AccountWithoutValidations(cairo_version); @@ -803,14 +814,14 @@ fn test_contract_ctor_frame_stack_trace( faulty_class_hash.0, ctor_selector.0 ), ); - let (execute_offset, deploy_offset, ctor_offset) = ( - account.get_entry_point_offset(execute_selector).0, - account.get_entry_point_offset(deploy_contract_selector).0, - faulty_ctor.get_ctor_offset(Some(ctor_selector)).0, - ); let expected_error = match cairo_version { CairoVersion::Cairo0 => { + let (execute_offset, deploy_offset, ctor_offset) = ( + account.get_entry_point_offset(execute_selector).0, + account.get_entry_point_offset(deploy_contract_selector).0, + faulty_ctor.get_ctor_offset(Some(ctor_selector)).0, + ); format!( "{frame_0} Error at pc=0:7: @@ -840,29 +851,42 @@ An ASSERT_EQ instruction failed: 1 != 0. ctor_offset - 9 ) } - CairoVersion::Cairo1(RunnableCairo1::Casm) => { + CairoVersion::Cairo1(runnable_version) => { + let final_error = format!( + "Execution failed. Failure reason: +Error in contract (contract address: {expected_address:#064x}, class hash: {:#064x}, selector: \ + {:#064x}): +0x496e76616c6964207363656e6172696f ('Invalid scenario'). +", + faulty_class_hash.0, ctor_selector.0 + ); // TODO(Dori, 1/1/2025): Get lowest level PC locations from Cairo1 errors (ctor offset // does not appear in the trace). - format!( - "{frame_0} + match runnable_version { + RunnableCairo1::Casm => { + let (execute_offset, deploy_offset) = ( + account.get_entry_point_offset(execute_selector).0, + account.get_entry_point_offset(deploy_contract_selector).0, + ); + format!( + "{frame_0} Error at pc=0:{}: {frame_1} Error at pc=0:{}: {frame_2} -Execution failed. Failure reason: -Error in contract (contract address: {expected_address:#064x}, class hash: {:#064x}, selector: \ - {:#064x}): -0x496e76616c6964207363656e6172696f ('Invalid scenario'). -", - execute_offset + 165, - deploy_offset + 154, - faulty_class_hash.0, - ctor_selector.0 - ) - } - #[cfg(feature = "cairo_native")] - CairoVersion::Cairo1(RunnableCairo1::Native) => { - todo!("Cairo Native not yet supported here.") +{final_error}", + execute_offset + 181, + deploy_offset + 168, + ) + } + #[cfg(feature = "cairo_native")] + RunnableCairo1::Native => format!( + "{frame_0} +{frame_1} +{frame_2} +{final_error}" + ), + } } }; diff --git a/crates/blockifier/src/execution/syscalls/hint_processor.rs b/crates/blockifier/src/execution/syscalls/hint_processor.rs index 6bdfc8f9055..b33da2c4ed4 100644 --- a/crates/blockifier/src/execution/syscalls/hint_processor.rs +++ b/crates/blockifier/src/execution/syscalls/hint_processor.rs @@ -14,6 +14,7 @@ use cairo_vm::vm::errors::vm_errors::VirtualMachineError; use cairo_vm::vm::runners::cairo_runner::{ResourceTracker, RunResources}; use cairo_vm::vm::vm_core::VirtualMachine; use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector}; +use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::{ AllResourceBounds, Calldata, @@ -26,6 +27,7 @@ use thiserror::Error; use crate::abi::sierra_types::SierraTypeError; use crate::execution::common_hints::{ExecutionMode, HintExecutionResult}; +use crate::execution::contract_class::TrackedResource; use crate::execution::entry_point::{CallEntryPoint, EntryPointExecutionContext}; use crate::execution::errors::{ConstructorEntryPointExecutionError, EntryPointExecutionError}; use crate::execution::execution_utils::{ @@ -125,8 +127,8 @@ pub enum SyscallExecutionError { StateError(#[from] StateError), #[error(transparent)] VirtualMachineError(#[from] VirtualMachineError), - #[error("Syscall error.")] - SyscallError { error_data: Vec }, + #[error("Syscall revert.")] + Revert { error_data: Vec }, } #[derive(Debug, Error)] @@ -475,12 +477,27 @@ impl<'a> SyscallHintProcessor<'a> { // Execute. let mut remaining_gas = gas_counter - required_gas; + + // To support sierra gas charge for blockifier revert flow, we track the remaining gas left + // before executing a syscall if the current tracked resource is gas. + // 1. If the syscall does not run Cairo code (i.e. not library call, not call contract, and + // not a deploy), any failure will not run in the OS, so no need to charge - the value + // before entering the callback is good enough to charge. + // 2. If the syscall runs Cairo code, but the tracked resource is steps (and not gas), the + // additional charge of reverted cairo steps will cover the inner cost, and the outer + // cost we track here will be the additional reverted gas. + // 3. If the syscall runs Cairo code and the tracked resource is gas, either the inner + // failure will be a Cairo1 revert (and the gas consumed on the call info will override + // the current tracked value), or we will pass through another syscall before failing - + // and by induction (we will reach this point again), the gas will be charged correctly. + self.base.context.update_revert_gas_with_next_remaining_gas(GasAmount(remaining_gas)); + let original_response = execute_callback(request, vm, self, &mut remaining_gas); let response = match original_response { Ok(response) => { SyscallResponseWrapper::Success { gas_counter: remaining_gas, response } } - Err(SyscallExecutionError::SyscallError { error_data: data }) => { + Err(SyscallExecutionError::Revert { error_data: data }) => { SyscallResponseWrapper::Failure { gas_counter: remaining_gas, error_data: data } } Err(error) => return Err(error.into()), @@ -528,29 +545,17 @@ impl<'a> SyscallHintProcessor<'a> { &mut self, vm: &mut VirtualMachine, ) -> SyscallResult { - let block_info = &self.base.context.tx_context.block_context.block_info; - let block_timestamp = block_info.block_timestamp.0; - let block_number = block_info.block_number.0; - let versioned_constants = self.base.context.versioned_constants(); - let block_data: Vec = if self.is_validate_mode() { - // Round down to the nearest multiple of validate_block_number_rounding. - let validate_block_number_rounding = - versioned_constants.get_validate_block_number_rounding(); - let rounded_block_number = - (block_number / validate_block_number_rounding) * validate_block_number_rounding; - // Round down to the nearest multiple of validate_timestamp_rounding. - let validate_timestamp_rounding = versioned_constants.get_validate_timestamp_rounding(); - let rounded_timestamp = - (block_timestamp / validate_timestamp_rounding) * validate_timestamp_rounding; - - vec![Felt::from(rounded_block_number), Felt::from(rounded_timestamp), Felt::ZERO] - } else { - vec![ - Felt::from(block_number), - Felt::from(block_timestamp), - *block_info.sequencer_address.0.key(), - ] + let block_info = match self.base.context.execution_mode { + ExecutionMode::Execute => self.base.context.tx_context.block_context.block_info(), + ExecutionMode::Validate => { + &self.base.context.tx_context.block_context.block_info_for_validate() + } }; + let block_data = vec![ + Felt::from(block_info.block_number.0), + Felt::from(block_info.block_timestamp.0), + Felt::from(block_info.sequencer_address), + ]; let (block_info_segment_start_ptr, _) = self.allocate_data_segment(vm, &block_data)?; Ok(block_info_segment_start_ptr) @@ -639,8 +644,18 @@ impl ResourceTracker for SyscallHintProcessor<'_> { self.base.context.vm_run_resources.consumed() } + /// Consumes a single step (if we are in step-tracking mode). fn consume_step(&mut self) { - self.base.context.vm_run_resources.consume_step() + if *self + .base + .context + .tracked_resource_stack + .last() + .expect("When consume_step is called, tracked resource stack is initialized.") + == TrackedResource::CairoSteps + { + self.base.context.vm_run_resources.consume_step(); + } } fn get_n_steps(&self) -> Option { diff --git a/crates/blockifier/src/execution/syscalls/mod.rs b/crates/blockifier/src/execution/syscalls/mod.rs index 9d6f412b720..df9a12f95ee 100644 --- a/crates/blockifier/src/execution/syscalls/mod.rs +++ b/crates/blockifier/src/execution/syscalls/mod.rs @@ -184,7 +184,7 @@ pub fn call_contract( let retdata_segment = execute_inner_call(entry_point, vm, syscall_handler, remaining_gas) .map_err(|error| match error { - SyscallExecutionError::SyscallError { .. } => error, + SyscallExecutionError::Revert { .. } => error, _ => error.as_call_contract_execution_error(class_hash, storage_address, selector), })?; @@ -343,8 +343,8 @@ impl SyscallResponse for GetBlockHashResponse { /// Returns the block hash of a given block_number. /// Returns the expected block hash if the given block was created at least -/// [constants::STORED_BLOCK_HASH_BUFFER] blocks before the current block. Otherwise, returns an -/// error. +/// [crate::abi::constants::STORED_BLOCK_HASH_BUFFER] blocks before the current block. Otherwise, +/// returns an error. pub fn get_block_hash( request: GetBlockHashRequest, _vm: &mut VirtualMachine, @@ -423,7 +423,7 @@ pub fn library_call( let retdata_segment = execute_inner_call(entry_point, vm, syscall_handler, remaining_gas) .map_err(|error| match error { - SyscallExecutionError::SyscallError { .. } => error, + SyscallExecutionError::Revert { .. } => error, _ => error.as_lib_call_execution_error( request.class_hash, syscall_handler.storage_address(), diff --git a/crates/blockifier/src/execution/syscalls/syscall_base.rs b/crates/blockifier/src/execution/syscalls/syscall_base.rs index 7e172065f1c..8a092a9aecf 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_base.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_base.rs @@ -52,6 +52,8 @@ pub struct SyscallHandlerBase<'state> { // The original storage value of the executed contract. // Should be moved back `context.revert_info` before executing an inner call. pub original_values: HashMap, + + revert_info_idx: usize, } impl<'state> SyscallHandlerBase<'state> { @@ -60,6 +62,7 @@ impl<'state> SyscallHandlerBase<'state> { state: &'state mut dyn State, context: &'state mut EntryPointExecutionContext, ) -> SyscallHandlerBase<'state> { + let revert_info_idx = context.revert_infos.0.len() - 1; let original_values = std::mem::take( &mut context .revert_infos @@ -80,28 +83,43 @@ impl<'state> SyscallHandlerBase<'state> { read_class_hash_values: Vec::new(), accessed_contract_addresses: HashSet::new(), original_values, + revert_info_idx, } } pub fn get_block_hash(&self, requested_block_number: u64) -> SyscallResult { - let execution_mode = self.context.execution_mode; - if execution_mode == ExecutionMode::Validate { - return Err(SyscallExecutionError::InvalidSyscallInExecutionMode { - syscall_name: "get_block_hash".to_string(), - execution_mode, - }); - } - + // Note: we take the actual block number (and not the rounded one for validate) + // in any case; it is consistent with the OS implementation and safe (see `Validate` arm). let current_block_number = self.context.tx_context.block_context.block_info.block_number.0; if current_block_number < constants::STORED_BLOCK_HASH_BUFFER || requested_block_number > current_block_number - constants::STORED_BLOCK_HASH_BUFFER { - let out_of_range_error = Felt::from_hex(BLOCK_NUMBER_OUT_OF_RANGE_ERROR) - .expect("Converting BLOCK_NUMBER_OUT_OF_RANGE_ERROR to Felt should not fail."); - return Err(SyscallExecutionError::SyscallError { - error_data: vec![out_of_range_error], - }); + // Requested block is too recent. + match self.context.execution_mode { + ExecutionMode::Execute => { + // Revert the syscall. + let out_of_range_error = Felt::from_hex(BLOCK_NUMBER_OUT_OF_RANGE_ERROR) + .expect( + "Converting BLOCK_NUMBER_OUT_OF_RANGE_ERROR to Felt should not fail.", + ); + return Err(SyscallExecutionError::Revert { + error_data: vec![out_of_range_error], + }); + } + ExecutionMode::Validate => { + // In this case, the transaction must be **rejected** to avoid the following + // attack: + // * query a given block in validate, + // * if reverted - ignore, if succeeded - panic. + // * in the gateway, the queried block is (actual_latest - 9), + // * while in the sequencer, the queried block can be further than that. + return Err(SyscallExecutionError::InvalidSyscallInExecutionMode { + syscall_name: "get_block_hash on recent blocks".to_string(), + execution_mode: ExecutionMode::Validate, + }); + } + } } let key = StorageKey::try_from(Felt::from(requested_block_number))?; @@ -143,6 +161,12 @@ impl<'state> SyscallHandlerBase<'state> { &mut self, contract_address: ContractAddress, ) -> SyscallResult { + if self.context.execution_mode == ExecutionMode::Validate { + return Err(SyscallExecutionError::InvalidSyscallInExecutionMode { + syscall_name: "get_class_hash_at".to_string(), + execution_mode: ExecutionMode::Validate, + }); + } self.accessed_contract_addresses.insert(contract_address); let class_hash = self.state.get_class_hash_at(contract_address)?; self.read_class_hash_values.push(class_hash); @@ -252,7 +276,7 @@ impl<'state> SyscallHandlerBase<'state> { raw_retdata.push( Felt::from_hex(ENTRYPOINT_FAILED_ERROR).map_err(SyscallExecutionError::from)?, ); - return Err(SyscallExecutionError::SyscallError { error_data: raw_retdata }); + return Err(SyscallExecutionError::Revert { error_data: raw_retdata }); } Ok(raw_retdata) @@ -268,7 +292,7 @@ impl<'state> SyscallHandlerBase<'state> { let (n_rounds, remainder) = num_integer::div_rem(input_length, KECCAK_FULL_RATE_IN_WORDS); if remainder != 0 { - return Err(SyscallExecutionError::SyscallError { + return Err(SyscallExecutionError::Revert { error_data: vec![ Felt::from_hex(INVALID_INPUT_LENGTH_ERROR) .expect("Failed to parse INVALID_INPUT_LENGTH_ERROR hex string"), @@ -284,7 +308,7 @@ impl<'state> SyscallHandlerBase<'state> { let out_of_gas_error = Felt::from_hex(OUT_OF_GAS_ERROR) .expect("Failed to parse OUT_OF_GAS_ERROR hex string"); - return Err(SyscallExecutionError::SyscallError { error_data: vec![out_of_gas_error] }); + return Err(SyscallExecutionError::Revert { error_data: vec![out_of_gas_error] }); } *remaining_gas -= gas_cost; @@ -303,7 +327,7 @@ impl<'state> SyscallHandlerBase<'state> { self.context .revert_infos .0 - .last_mut() + .get_mut(self.revert_info_idx) .expect("Missing contract revert info.") .original_values = std::mem::take(&mut self.original_values); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/call_contract.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/call_contract.rs index dc5daa41a3e..3d39585173a 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/call_contract.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/call_contract.rs @@ -37,12 +37,12 @@ fn test_call_contract_that_panics(runnable_version: RunnableCairo1) { let mut state = test_state(chain_info, BALANCE, &[(test_contract, 1), (empty_contract, 0)]); let new_class_hash = empty_contract.get_class_hash(); + let to_panic = true.into(); let outer_entry_point_selector = selector_from_name("test_call_contract_revert"); let calldata = create_calldata( - FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)) - .get_instance_address(0), + test_contract.get_instance_address(0), "test_revert_helper", - &[new_class_hash.0], + &[new_class_hash.0, to_panic], ); let entry_point_call = CallEntryPoint { entry_point_selector: outer_entry_point_selector, @@ -70,6 +70,141 @@ fn test_call_contract_that_panics(runnable_version: RunnableCairo1) { } } +#[rstest] +#[cfg_attr(feature = "cairo_native", case::native(RunnableCairo1::Native))] +#[case::vm(RunnableCairo1::Casm)] +/// This test verifies the behavior of a contract call sequence with nested calls and state +/// assertions. +/// +/// - Contract A calls Contract B and asserts that the state remains unchanged. +/// - Contract B calls Contract C and panics. +/// - Contract C modifies the state but does not panic. +/// +/// The test ensures that: +/// 1. Contract A's state remains unaffected despite the modifications in Contract C. +/// 2. Contract B error as expected. +/// 3. Tracked resources are correctly identified as SierraGas in all calls. +fn test_call_contract_and_than_revert(#[case] runnable_version: RunnableCairo1) { + let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(runnable_version)); + let empty_contract = FeatureContract::Empty(CairoVersion::Cairo1(runnable_version)); + let chain_info = &ChainInfo::create_for_testing(); + let mut state = test_state(chain_info, BALANCE, &[(test_contract, 1), (empty_contract, 0)]); + + // Arguments of Contact C. + let new_class_hash = empty_contract.get_class_hash(); + let to_panic = false.into(); + + // Calldata of contract B + let middle_call_data = create_calldata( + test_contract.get_instance_address(0), + "test_revert_helper", + &[new_class_hash.0, to_panic], + ); + + // Calldata of contract A + let calldata = create_calldata( + test_contract.get_instance_address(0), + "middle_revert_contract", + &middle_call_data.0, + ); + + // Create the entry point call to contract A. + let outer_entry_point_selector = selector_from_name("test_call_contract_revert"); + let entry_point_call = CallEntryPoint { + entry_point_selector: outer_entry_point_selector, + calldata, + ..trivial_external_entry_point_new(test_contract) + }; + + // Execute. + let call_info_a = entry_point_call.execute_directly(&mut state).unwrap(); + + // Contract A should not fail. + assert!(!call_info_a.execution.failed); + + // Contract B should fail. + let [inner_call_b] = &call_info_a.inner_calls[..] else { + panic!("Expected one inner call, got {:?}", call_info_a.inner_calls); + }; + assert!(inner_call_b.execution.failed); + assert!(inner_call_b.execution.events.is_empty()); + assert!(inner_call_b.execution.l2_to_l1_messages.is_empty()); + assert_eq!( + format_panic_data(&inner_call_b.execution.retdata.0), + "0x657865637574655f616e645f726576657274 ('execute_and_revert')" + ); + + // Contract C should not fail. + let [inner_inner_call_c] = &inner_call_b.inner_calls[..] else { + panic!("Expected one inner call, got {:?}", inner_call_b.inner_calls); + }; + assert!(!inner_inner_call_c.execution.failed); + + // Contract C events and messages should be reverted, + // since his parent (contract B) panics. + assert!(inner_inner_call_c.execution.events.is_empty()); + assert!(inner_inner_call_c.execution.l2_to_l1_messages.is_empty()); + + // Check that the tracked resource is SierraGas to make sure that Native is running. + for call in call_info_a.iter() { + assert_eq!(call.tracked_resource, TrackedResource::SierraGas); + } +} + +#[rstest] +#[cfg_attr(feature = "cairo_native", case::native(RunnableCairo1::Native))] +#[case::vm(RunnableCairo1::Casm)] +/// This test verifies the behavior of a contract call with inner calls where both try to change +/// the storage, but one succeeds and the other fails (panics). +/// +/// - Contract A call contact B. +/// - Contract B changes the storage value from 0 to 10. +/// - Contract A call contact C. +/// - Contract C changes the storage value from 10 to 17 and panics. +/// - Contract A checks that storage value == 10. +fn test_revert_with_inner_call_and_reverted_storage(#[case] runnable_version: RunnableCairo1) { + let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(runnable_version)); + let empty_contract = FeatureContract::Empty(CairoVersion::Cairo1(runnable_version)); + let chain_info = &ChainInfo::create_for_testing(); + let mut state = test_state(chain_info, BALANCE, &[(test_contract, 1), (empty_contract, 0)]); + + // Calldata of contract A + let calldata = Calldata( + [test_contract.get_instance_address(0).into(), empty_contract.get_class_hash().0] + .to_vec() + .into(), + ); + + // Create the entry point call to contract A. + let outer_entry_point_selector = + selector_from_name("test_revert_with_inner_call_and_reverted_storage"); + let entry_point_call = CallEntryPoint { + entry_point_selector: outer_entry_point_selector, + calldata, + ..trivial_external_entry_point_new(test_contract) + }; + + // Execute. + let outer_call = entry_point_call.execute_directly(&mut state).unwrap(); + + // The outer call (contract A) should not fail. + assert!(!outer_call.execution.failed); + + let [inner_call_to_b, inner_call_to_c] = &outer_call.inner_calls[..] else { + panic!("Expected two inner calls, got {:?}", outer_call.inner_calls); + }; + + // The first inner call (contract B) should not fail. + assert!(inner_call_to_c.execution.failed); + // The second inner call (contract C) should fail. + assert!(!inner_call_to_b.execution.failed); + + // Check that the tracked resource is SierraGas to make sure that Native is running. + for call in outer_call.iter() { + assert_eq!(call.tracked_resource, TrackedResource::SierraGas); + } +} + #[cfg_attr( feature = "cairo_native", test_case( @@ -239,3 +374,30 @@ fn test_tracked_resources_nested( assert_eq!(second_inner_call.tracked_resource, TrackedResource::SierraGas); assert_ne!(second_inner_call.execution.gas_consumed, 0); } + +#[rstest] +#[case(RunnableCairo1::Casm)] +#[cfg_attr(feature = "cairo_native", case(RunnableCairo1::Native))] +fn test_empty_function_flow(#[case] runnable: RunnableCairo1) { + let outer_contract = FeatureContract::TestContract(CairoVersion::Cairo1(runnable)); + let chain_info = &ChainInfo::create_for_testing(); + let mut state = test_state(chain_info, BALANCE, &[(outer_contract, 1)]); + let test_contract_address = outer_contract.get_instance_address(0); + + let calldata = create_calldata( + test_contract_address, + "empty_function", + &[], // Calldata. + ); + let outer_entry_point_selector = selector_from_name("test_call_contract"); + let entry_point_call = CallEntryPoint { + entry_point_selector: outer_entry_point_selector, + calldata, + ..trivial_external_entry_point_new(outer_contract) + }; + + let call_info = entry_point_call.execute_directly(&mut state).unwrap(); + + // Contract should not fail. + assert!(!call_info.execution.failed); +} diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/constants.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/constants.rs index ff3ebd021d2..2ed4a312da8 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/constants.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/constants.rs @@ -1,4 +1,5 @@ -pub const REQUIRED_GAS_CALL_CONTRACT_TEST: u64 = 120370; -pub const REQUIRED_GAS_STORAGE_READ_WRITE_TEST: u64 = 16990; -pub const REQUIRED_GAS_GET_CLASS_HASH_AT_TEST: u64 = 7830; -pub const REQUIRED_GAS_LIBRARY_CALL_TEST: u64 = 117970; +pub const REQUIRED_GAS_CALL_CONTRACT_TEST: u64 = 130760; +pub const REQUIRED_GAS_STORAGE_READ_WRITE_TEST: u64 = 27550; +pub const REQUIRED_GAS_GET_CLASS_HASH_AT_TEST: u64 = 17760; +pub const REQUIRED_GAS_LIBRARY_CALL_TEST: u64 = 128360; +pub const REQUIRED_GAS_GET_BLOCK_HASH_TEST: u64 = 15920; diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/deploy.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/deploy.rs index c2428bfeafe..01d06024bf0 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/deploy.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/deploy.rs @@ -43,7 +43,7 @@ fn no_constructor(runnable_version: RunnableCairo1) { let deploy_call = &entry_point_call.execute_directly(&mut state).unwrap(); assert_eq!( deploy_call.execution, - CallExecution { retdata: retdata![], gas_consumed: 155200, ..CallExecution::default() } + CallExecution { retdata: retdata![], gas_consumed: 154430, ..CallExecution::default() } ); let deployed_contract_address = calculate_contract_address( @@ -124,7 +124,7 @@ fn with_constructor(runnable_version: RunnableCairo1) { let deploy_call = &entry_point_call.execute_directly(&mut state).unwrap(); assert_eq!( deploy_call.execution, - CallExecution { retdata: retdata![], gas_consumed: 164550, ..CallExecution::default() } + CallExecution { retdata: retdata![], gas_consumed: 174910, ..CallExecution::default() } ); let constructor_call = &deploy_call.inner_calls[0]; @@ -136,7 +136,7 @@ fn with_constructor(runnable_version: RunnableCairo1) { // The test contract constructor returns its first argument. retdata: retdata![constructor_calldata[0]], // This reflects the gas cost of storage write syscall. - gas_consumed: 4610, + gas_consumed: 15140, ..CallExecution::default() } ); diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/emit_event.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/emit_event.rs index f45e9aa2570..c788994e47a 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/emit_event.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/emit_event.rs @@ -41,7 +41,7 @@ fn positive_flow(runnable_version: RunnableCairo1) { call_info.execution, CallExecution { events: vec![OrderedEvent { order: 0, event }], - gas_consumed: 47330, + gas_consumed: 41880, ..Default::default() } ); diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/get_block_hash.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/get_block_hash.rs index 09ffe2619b4..4c0304794dd 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/get_block_hash.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/get_block_hash.rs @@ -2,6 +2,7 @@ use pretty_assertions::assert_eq; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::execution_utils::format_panic_data; use starknet_api::state::StorageKey; +use starknet_api::test_utils::CURRENT_BLOCK_NUMBER; use starknet_api::{calldata, felt}; use starknet_types_core::felt::Felt; use test_case::test_case; @@ -10,22 +11,19 @@ use crate::abi::constants; use crate::context::ChainInfo; use crate::execution::call_info::CallExecution; use crate::execution::entry_point::CallEntryPoint; +use crate::execution::syscalls::syscall_tests::constants::REQUIRED_GAS_GET_BLOCK_HASH_TEST; +use crate::retdata; use crate::state::cached_state::CachedState; use crate::state::state_api::State; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::dict_state_reader::DictStateReader; use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{ - trivial_external_entry_point_new, - CairoVersion, - RunnableCairo1, - BALANCE, - CURRENT_BLOCK_NUMBER, -}; +use crate::test_utils::{trivial_external_entry_point_new, CairoVersion, RunnableCairo1, BALANCE}; use crate::versioned_constants::VersionedConstants; -use crate::{check_entry_point_execution_error_for_custom_hint, retdata}; -fn initialize_state(test_contract: FeatureContract) -> (CachedState, Felt, Felt) { +pub fn initialize_state( + test_contract: FeatureContract, +) -> (CachedState, Felt, Felt) { let chain_info = &ChainInfo::create_for_testing(); let mut state = test_state(chain_info, BALANCE, &[(test_contract, 1)]); @@ -58,44 +56,10 @@ fn positive_flow(runnable_version: RunnableCairo1) { assert_eq!( entry_point_call.clone().execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 5220, ..CallExecution::from_retdata(retdata![block_hash]) } - ); -} - -#[cfg_attr(feature = "cairo_native", test_case(RunnableCairo1::Native;"Native"))] -#[test_case(RunnableCairo1::Casm;"VM")] -fn negative_flow_execution_mode_validate(runnable_version: RunnableCairo1) { - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(runnable_version)); - let (mut state, block_number, _) = initialize_state(test_contract); - - let calldata = calldata![block_number]; - let entry_point_call = CallEntryPoint { - entry_point_selector: selector_from_name("test_get_block_hash"), - calldata, - ..trivial_external_entry_point_new(test_contract) - }; - - let error = entry_point_call.execute_directly_in_validate_mode(&mut state).unwrap_err(); - #[cfg(feature = "cairo_native")] - if matches!( - test_contract, - FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Native)) - ) { - assert!( - error - .to_string() - .contains("Unauthorized syscall get_block_hash in execution mode Validate.") - ); - } else { - check_entry_point_execution_error_for_custom_hint!( - &error, - "Unauthorized syscall get_block_hash in execution mode Validate.", - ); - } - #[cfg(not(feature = "cairo_native"))] - check_entry_point_execution_error_for_custom_hint!( - &error, - "Unauthorized syscall get_block_hash in execution mode Validate.", + CallExecution { + gas_consumed: REQUIRED_GAS_GET_BLOCK_HASH_TEST, + ..CallExecution::from_retdata(retdata![block_hash]) + } ); } @@ -114,10 +78,15 @@ fn negative_flow_block_number_out_of_range(runnable_version: RunnableCairo1) { ..trivial_external_entry_point_new(test_contract) }; - let call_info = entry_point_call.execute_directly(&mut state).unwrap(); + let call_info = entry_point_call.clone().execute_directly(&mut state).unwrap(); assert!(call_info.execution.failed); assert_eq!( format_panic_data(&call_info.execution.retdata.0), "0x426c6f636b206e756d626572206f7574206f662072616e6765 ('Block number out of range')" ); + + let error = entry_point_call.execute_directly_in_validate_mode(&mut state).unwrap_err(); + assert!(error.to_string().contains( + "Unauthorized syscall get_block_hash on recent blocks in execution mode Validate." + )); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/get_class_hash_at.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/get_class_hash_at.rs index 11322694a92..45345c7069b 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/get_class_hash_at.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/get_class_hash_at.rs @@ -33,14 +33,16 @@ fn test_get_class_hash_at(runnable_version: RunnableCairo1) { entry_point_selector: selector_from_name("test_get_class_hash_at"), ..trivial_external_entry_point_new(test_contract) }; - let positive_call_info = positive_entry_point_call.execute_directly(&mut state).unwrap(); + let positive_call_info = + positive_entry_point_call.clone().execute_directly(&mut state).unwrap(); + let redeposit_gas = 300; assert!(positive_call_info.accessed_contract_addresses.contains(&address)); assert!(positive_call_info.read_class_hash_values[0] == class_hash); assert_eq!( positive_call_info.execution, CallExecution { retdata: retdata!(), - gas_consumed: REQUIRED_GAS_GET_CLASS_HASH_AT_TEST, + gas_consumed: REQUIRED_GAS_GET_CLASS_HASH_AT_TEST + redeposit_gas, failed: false, ..CallExecution::default() } @@ -70,4 +72,12 @@ fn test_get_class_hash_at(runnable_version: RunnableCairo1) { .execution .failed ); + + let error = + positive_entry_point_call.execute_directly_in_validate_mode(&mut state).unwrap_err(); + assert!( + error + .to_string() + .contains("Unauthorized syscall get_class_hash_at in execution mode Validate.") + ); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs index 47f351467d7..788f23deef8 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/get_execution_info.rs @@ -3,6 +3,13 @@ use starknet_api::block::GasPrice; use starknet_api::core::ChainId; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::execution_resources::GasAmount; +use starknet_api::test_utils::{ + CURRENT_BLOCK_NUMBER, + CURRENT_BLOCK_NUMBER_FOR_VALIDATE, + CURRENT_BLOCK_TIMESTAMP, + CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, + TEST_SEQUENCER_ADDRESS, +}; use starknet_api::transaction::fields::{ AccountDeploymentData, Calldata, @@ -28,11 +35,6 @@ use crate::test_utils::{ CairoVersion, RunnableCairo1, BALANCE, - CURRENT_BLOCK_NUMBER, - CURRENT_BLOCK_NUMBER_FOR_VALIDATE, - CURRENT_BLOCK_TIMESTAMP, - CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, - TEST_SEQUENCER_ADDRESS, }; use crate::transaction::objects::{ CommonAccountFields, diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/keccak.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/keccak.rs index 644db1ed877..e5653d902d5 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/keccak.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/keccak.rs @@ -26,6 +26,6 @@ fn test_keccak(runnable_version: RunnableCairo1) { pretty_assertions::assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 254240, ..CallExecution::from_retdata(retdata![]) } + CallExecution { gas_consumed: 245767, ..CallExecution::from_retdata(retdata![]) } ); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/library_call.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/library_call.rs index 654850934cb..db92759292a 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/library_call.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/library_call.rs @@ -2,12 +2,11 @@ use std::collections::HashSet; use pretty_assertions::assert_eq; use starknet_api::abi::abi_utils::selector_from_name; -use starknet_api::execution_resources::GasAmount; use starknet_api::{calldata, felt, storage_key}; use test_case::test_case; use crate::context::ChainInfo; -use crate::execution::call_info::{CallExecution, CallInfo, ChargedResources, Retdata}; +use crate::execution::call_info::{CallExecution, CallInfo, Retdata}; use crate::execution::entry_point::{CallEntryPoint, CallType}; use crate::execution::syscalls::syscall_tests::constants::{ REQUIRED_GAS_LIBRARY_CALL_TEST, @@ -84,7 +83,7 @@ fn test_library_call_assert_fails(runnable_version: RunnableCairo1) { // 'ENTRYPOINT_FAILED'. felt!("0x454e545259504f494e545f4641494c4544") ]), - gas_consumed: 100980, + gas_consumed: 105050, failed: true, ..Default::default() } @@ -124,7 +123,7 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { class_hash: Some(test_class_hash), code_address: None, call_type: CallType::Delegate, - initial_gas: 9999085960, + initial_gas: 9999084430, ..trivial_external_entry_point_new(test_contract) }; let library_entry_point = CallEntryPoint { @@ -139,20 +138,18 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { class_hash: Some(test_class_hash), code_address: None, call_type: CallType::Delegate, - initial_gas: 9999186940, + initial_gas: 9999185240, ..trivial_external_entry_point_new(test_contract) }; let storage_entry_point = CallEntryPoint { calldata: calldata![felt!(key), felt!(value)], - initial_gas: 9998984320, + initial_gas: 9998981630, ..nested_storage_entry_point }; - let storage_entry_point_gas = GasAmount(16990); - // The default VersionedConstants is used in the execute_directly call bellow. let tracked_resource = test_contract.get_runnable_class().tracked_resource( - &VersionedConstants::create_for_testing().min_compiler_version_for_sierra_gas, + &VersionedConstants::create_for_testing().min_sierra_version_for_sierra_gas, None, ); @@ -163,7 +160,6 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { gas_consumed: REQUIRED_GAS_STORAGE_READ_WRITE_TEST, ..CallExecution::default() }, - charged_resources: ChargedResources::from_gas(storage_entry_point_gas), tracked_resource, storage_read_values: vec![felt!(value + 1)], accessed_storage_keys: HashSet::from([storage_key!(key + 1)]), @@ -177,7 +173,6 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { gas_consumed: REQUIRED_GAS_LIBRARY_CALL_TEST, ..CallExecution::default() }, - charged_resources: ChargedResources::from_gas(GasAmount(117970)), inner_calls: vec![nested_storage_call_info], tracked_resource, ..Default::default() @@ -190,14 +185,13 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { gas_consumed: REQUIRED_GAS_STORAGE_READ_WRITE_TEST, ..CallExecution::default() }, - charged_resources: ChargedResources::from_gas(storage_entry_point_gas), storage_read_values: vec![felt!(value)], accessed_storage_keys: HashSet::from([storage_key!(key)]), tracked_resource, ..Default::default() }; - let main_gas_consumed = 325110; + let main_gas_consumed = 338360; let expected_call_info = CallInfo { call: main_entry_point.clone(), execution: CallExecution { @@ -205,7 +199,6 @@ fn test_nested_library_call(runnable_version: RunnableCairo1) { gas_consumed: main_gas_consumed, ..CallExecution::default() }, - charged_resources: ChargedResources::from_gas(GasAmount(main_gas_consumed)), inner_calls: vec![library_call_info, storage_call_info], tracked_resource, ..Default::default() diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/out_of_gas.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/out_of_gas.rs index f61213fe166..1b822c0c9f5 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/out_of_gas.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/out_of_gas.rs @@ -2,74 +2,109 @@ use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::{calldata, felt}; use test_case::test_case; -#[cfg(feature = "cairo_native")] use crate::abi::constants::MAX_POSSIBLE_SIERRA_GAS; -use crate::context::ChainInfo; use crate::execution::call_info::CallExecution; use crate::execution::entry_point::CallEntryPoint; -use crate::execution::syscalls::syscall_tests::constants::REQUIRED_GAS_STORAGE_READ_WRITE_TEST; +use crate::execution::syscalls::syscall_tests::constants; +use crate::execution::syscalls::syscall_tests::get_block_hash::initialize_state; +use crate::execution::syscalls::SyscallSelector; use crate::retdata; use crate::test_utils::contracts::FeatureContract; -use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{trivial_external_entry_point_new, CairoVersion, RunnableCairo1, BALANCE}; +use crate::test_utils::{trivial_external_entry_point_new, CairoVersion, RunnableCairo1}; +use crate::versioned_constants::VersionedConstants; #[cfg_attr(feature = "cairo_native", test_case(RunnableCairo1::Native; "Native"))] #[test_case(RunnableCairo1::Casm; "VM")] fn test_out_of_gas(runnable_version: RunnableCairo1) { let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(runnable_version)); - let mut state = test_state(&ChainInfo::create_for_testing(), BALANCE, &[(test_contract, 1)]); + let (mut state, block_number, _block_hash) = initialize_state(test_contract); - let key = felt!(1234_u16); - let value = felt!(18_u8); - let calldata = calldata![key, value]; + let calldata = calldata![block_number]; let entry_point_call = CallEntryPoint { + entry_point_selector: selector_from_name("test_get_block_hash"), calldata, - entry_point_selector: selector_from_name("test_storage_read_write"), - initial_gas: REQUIRED_GAS_STORAGE_READ_WRITE_TEST - 1, + initial_gas: constants::REQUIRED_GAS_GET_BLOCK_HASH_TEST - 1, ..trivial_external_entry_point_new(test_contract) }; - let call_info = entry_point_call.execute_directly(&mut state).unwrap(); + + let gas_costs = &VersionedConstants::create_for_testing().os_constants.gas_costs; + let get_block_hash_gas_cost = + gas_costs.syscalls.get_syscall_gas_cost(&SyscallSelector::GetBlockHash).unwrap(); + + // We hit the out of gas error right before executing the syscall. + let syscall_base_gas_cost = gas_costs.base.syscall_base_gas_cost; + let redeposit_gas = 300; + let syscall_required_gas = get_block_hash_gas_cost - syscall_base_gas_cost; + let call_info = entry_point_call.clone().execute_directly(&mut state).unwrap(); assert_eq!( call_info.execution, CallExecution { // 'Out of gas' retdata: retdata![felt!["0x4f7574206f6620676173"]], - gas_consumed: REQUIRED_GAS_STORAGE_READ_WRITE_TEST - 70, + gas_consumed: constants::REQUIRED_GAS_GET_BLOCK_HASH_TEST + - syscall_required_gas + - redeposit_gas, failed: true, ..Default::default() } ); } -#[cfg(feature = "cairo_native")] #[test] -/// Tests that Native can handle deep recursion calls without overflowing the stack. -/// Note that the recursive function must be complicated, since the compiler might transform -/// simple recursions into loops. The tested function was manually tested with higher gas and -/// reached stack overflow. -/// -/// Also, there is no need to test the VM here since it doesn't use the stack. -fn test_stack_overflow() { - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Native)); - let mut state = test_state(&ChainInfo::create_for_testing(), BALANCE, &[(test_contract, 1)]); - - let depth = felt!(1000000_u128); - let entry_point_call = CallEntryPoint { - calldata: calldata![depth], - entry_point_selector: selector_from_name("test_stack_overflow"), - // TODO(Aner): assert that the total tx limits are <= MAX_POSSIBLE_SIERRA_GAS. - initial_gas: MAX_POSSIBLE_SIERRA_GAS, - ..trivial_external_entry_point_new(test_contract) - }; - let call_info = entry_point_call.execute_directly(&mut state).unwrap(); - assert_eq!( - call_info.execution, - CallExecution { - // 'Out of gas' - retdata: retdata![felt!["0x4f7574206f6620676173"]], - gas_consumed: MAX_POSSIBLE_SIERRA_GAS - 6590, - failed: true, - ..Default::default() - } +fn test_total_tx_limits_less_than_max_sierra_gas() { + assert!( + VersionedConstants::create_for_testing().initial_gas_no_user_l2_bound().0 + <= MAX_POSSIBLE_SIERRA_GAS ); } + +// TODO (AvivG) move this test to Transaction executor + +// #[cfg(feature = "cairo_native")] +// #[cfg(feature = "cairo_native")] +// use crate::context::ChainInfo; +// #[cfg(feature = "cairo_native")] +// use crate::test_utils::initial_test_state::test_state; +// #[cfg(feature = "cairo_native")] +// use crate::test_utils::BALANCE; +// #[rstest::rstest] +// #[case(MAX_POSSIBLE_SIERRA_GAS, MAX_POSSIBLE_SIERRA_GAS - 2681170910)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 10, 81886490)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 100, 8190940)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 1000, 822890)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 10000, 85440)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 100000, 12340)] +// #[case(MAX_POSSIBLE_SIERRA_GAS / 1000000, 0)] +// #[case(350, 0)] +// #[case(35, 0)] +// #[case(0, 0)] +// /// Tests that Native can handle deep recursion calls without overflowing the stack. +// /// Note that the recursive function must be complicated, since the compiler might transform +// /// simple recursions into loops. The tested function was manually tested with higher gas and +// /// reached stack overflow. +// /// +// /// Also, there is no need to test the VM here since it doesn't use the stack. +// fn test_stack_overflow(#[case] initial_gas: u64, #[case] gas_consumed: u64) { +// let test_contract = +// FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Native)); let mut state = +// test_state(&ChainInfo::create_for_testing(), BALANCE, &[(test_contract, 1)]); + +// let depth = felt!(1000000_u128); +// let entry_point_call = CallEntryPoint { +// calldata: calldata![depth], +// entry_point_selector: selector_from_name("test_stack_overflow"), +// initial_gas, +// ..trivial_external_entry_point_new(test_contract) +// }; +// let call_info = entry_point_call.execute_directly(&mut state).unwrap(); +// assert_eq!( +// call_info.execution, +// CallExecution { +// // 'Out of gas' +// retdata: retdata![felt!["0x4f7574206f6620676173"]], +// gas_consumed, +// failed: true, +// ..Default::default() +// } +// ); +// } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/replace_class.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/replace_class.rs index b0932025f99..f6359bc952e 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/replace_class.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/replace_class.rs @@ -74,7 +74,7 @@ fn positive_flow(runnable_version: RunnableCairo1) { }; assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 5220, ..Default::default() } + CallExecution { gas_consumed: 15920, ..Default::default() } ); assert_eq!(state.get_class_hash_at(contract_address).unwrap(), new_class_hash); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/secp.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/secp.rs index a6ff6d624f4..30dad231b5e 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/secp.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/secp.rs @@ -25,7 +25,7 @@ fn test_secp256k1(runnable_version: RunnableCairo1) { pretty_assertions::assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 17033486, ..Default::default() } + CallExecution { gas_consumed: 17011779, ..Default::default() } ); } @@ -45,6 +45,6 @@ fn test_secp256r1(runnable_version: RunnableCairo1) { pretty_assertions::assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 27562930, ..Default::default() } + CallExecution { gas_consumed: 27571210, ..Default::default() } ); } diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/send_message_to_l1.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/send_message_to_l1.rs index c0569e2bd61..0235b6ed991 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/send_message_to_l1.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/send_message_to_l1.rs @@ -47,7 +47,7 @@ fn test_send_message_to_l1(runnable_version: RunnableCairo1) { entry_point_call.execute_directly(&mut state).unwrap().execution, CallExecution { l2_to_l1_messages: vec![OrderedL2ToL1Message { order: 0, message }], - gas_consumed: 20960, + gas_consumed: 30190, ..Default::default() } ); diff --git a/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs b/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs index bf9b9cd36ff..5cdd980568e 100644 --- a/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs +++ b/crates/blockifier/src/execution/syscalls/syscall_tests/sha256.rs @@ -26,6 +26,6 @@ fn test_sha256(runnable_version: RunnableCairo1) { pretty_assertions::assert_eq!( entry_point_call.execute_directly(&mut state).unwrap().execution, - CallExecution { gas_consumed: 881425, ..CallExecution::from_retdata(retdata![]) } + CallExecution { gas_consumed: 870855, ..CallExecution::from_retdata(retdata![]) } ); } diff --git a/crates/blockifier/src/fee/fee_checks.rs b/crates/blockifier/src/fee/fee_checks.rs index 6ec555b8ee1..5dcf530d508 100644 --- a/crates/blockifier/src/fee/fee_checks.rs +++ b/crates/blockifier/src/fee/fee_checks.rs @@ -11,7 +11,11 @@ use starknet_types_core::felt::Felt; use thiserror::Error; use crate::context::TransactionContext; -use crate::fee::fee_utils::{get_balance_and_if_covers_fee, get_fee_by_gas_vector}; +use crate::fee::fee_utils::{ + get_balance_and_if_covers_fee, + get_fee_by_gas_vector, + GasVectorToL1GasForFee, +}; use crate::fee::receipt::TransactionReceipt; use crate::state::state_api::StateReader; use crate::transaction::errors::TransactionExecutionError; @@ -213,14 +217,16 @@ impl FeeCheckReport { gas_vector: &GasVector, tx_context: &TransactionContext, ) -> FeeCheckResult<()> { - let total_discounted_gas_used = - gas_vector.to_discounted_l1_gas(tx_context.get_gas_prices()); + let total_l1_gas_used = gas_vector.to_l1_gas_for_fee( + tx_context.get_gas_prices(), + &tx_context.block_context.versioned_constants, + ); - if total_discounted_gas_used > l1_bounds.max_amount { + if total_l1_gas_used > l1_bounds.max_amount { return Err(FeeCheckError::MaxGasAmountExceeded { resource: L1Gas, max_amount: l1_bounds.max_amount, - actual_amount: total_discounted_gas_used, + actual_amount: total_l1_gas_used, }); } Ok(()) diff --git a/crates/blockifier/src/fee/fee_test.rs b/crates/blockifier/src/fee/fee_test.rs index aa59e48f626..74ab5b3596a 100644 --- a/crates/blockifier/src/fee/fee_test.rs +++ b/crates/blockifier/src/fee/fee_test.rs @@ -4,6 +4,14 @@ use rstest::rstest; use starknet_api::block::{FeeType, GasPrice, NonzeroGasPrice}; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::invoke_tx_args; +use starknet_api::test_utils::{ + DEFAULT_ETH_L1_DATA_GAS_PRICE, + DEFAULT_ETH_L1_GAS_PRICE, + DEFAULT_L1_DATA_GAS_MAX_AMOUNT, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_L2_GAS_MAX_AMOUNT, + DEFAULT_STRK_L1_GAS_PRICE, +}; use starknet_api::transaction::fields::{ AllResourceBounds, Fee, @@ -20,18 +28,7 @@ use crate::fee::fee_utils::{get_fee_by_gas_vector, get_vm_resources_cost}; use crate::fee::receipt::TransactionReceipt; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{ - gas_vector_from_vm_usage, - get_vm_resource_usage, - CairoVersion, - BALANCE, - DEFAULT_ETH_L1_DATA_GAS_PRICE, - DEFAULT_ETH_L1_GAS_PRICE, - DEFAULT_L1_DATA_GAS_MAX_AMOUNT, - DEFAULT_L1_GAS_AMOUNT, - DEFAULT_L2_GAS_MAX_AMOUNT, - DEFAULT_STRK_L1_GAS_PRICE, -}; +use crate::test_utils::{gas_vector_from_vm_usage, get_vm_resource_usage, CairoVersion, BALANCE}; use crate::transaction::test_utils::{ all_resource_bounds, block_context, diff --git a/crates/blockifier/src/fee/fee_utils.rs b/crates/blockifier/src/fee/fee_utils.rs index 92de4adb630..0272206a2d9 100644 --- a/crates/blockifier/src/fee/fee_utils.rs +++ b/crates/blockifier/src/fee/fee_utils.rs @@ -4,9 +4,9 @@ use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_bigint::BigUint; use starknet_api::abi::abi_utils::get_fee_token_var_address; -use starknet_api::block::{BlockInfo, FeeType}; +use starknet_api::block::{BlockInfo, FeeType, GasPriceVector}; use starknet_api::core::ContractAddress; -use starknet_api::execution_resources::GasVector; +use starknet_api::execution_resources::{to_discounted_l1_gas, GasAmount, GasVector}; use starknet_api::state::StorageKey; use starknet_api::transaction::fields::ValidResourceBounds::{AllResources, L1Gas}; use starknet_api::transaction::fields::{Fee, GasVectorComputationMode, Resource}; @@ -24,6 +24,42 @@ use crate::versioned_constants::VersionedConstants; #[path = "fee_test.rs"] pub mod test; +/// A trait for converting a gas vector to L1 gas for fee. Converts both L1 data gas and L2 gas to +/// L1 gas units. +/// The trait is defined to allow implementing a method on GasVector, which is a starknet-api type. +pub trait GasVectorToL1GasForFee { + fn to_l1_gas_for_fee( + &self, + gas_prices: &GasPriceVector, + versioned_constants: &VersionedConstants, + ) -> GasAmount; +} + +impl GasVectorToL1GasForFee for GasVector { + fn to_l1_gas_for_fee( + &self, + gas_prices: &GasPriceVector, + versioned_constants: &VersionedConstants, + ) -> GasAmount { + // Discounted gas converts data gas to L1 gas. Add L2 gas using conversion ratio. + let discounted_l1_gas = to_discounted_l1_gas( + gas_prices.l1_gas_price, + gas_prices.l1_data_gas_price.into(), + self.l1_gas, + self.l1_data_gas, + ); + discounted_l1_gas + .checked_add(versioned_constants.sierra_gas_to_l1_gas_amount_round_up(self.l2_gas)) + .unwrap_or_else(|| { + panic!( + "L1 gas amount overflowed: addition of converted L2 gas ({}) to discounted \ + gas ({}) resulted in overflow.", + self.l2_gas, discounted_l1_gas + ); + }) + } +} + /// Calculates the gas consumed when submitting the underlying Cairo program to SHARP. /// I.e., returns the heaviest Cairo resource weight (in terms of gas), as the size of /// a proof is determined similarly - by the (normalized) largest segment. diff --git a/crates/blockifier/src/fee/gas_usage_test.rs b/crates/blockifier/src/fee/gas_usage_test.rs index f6fe3e315a4..1d25cd7c274 100644 --- a/crates/blockifier/src/fee/gas_usage_test.rs +++ b/crates/blockifier/src/fee/gas_usage_test.rs @@ -6,6 +6,7 @@ use rstest::{fixture, rstest}; use starknet_api::block::{FeeType, StarknetVersion}; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::invoke_tx_args; +use starknet_api::test_utils::{DEFAULT_ETH_L1_DATA_GAS_PRICE, DEFAULT_ETH_L1_GAS_PRICE}; use starknet_api::transaction::fields::GasVectorComputationMode; use starknet_api::transaction::{EventContent, EventData, EventKey}; use starknet_types_core::felt::Felt; @@ -14,7 +15,7 @@ use crate::abi::constants; use crate::context::BlockContext; use crate::execution::call_info::{CallExecution, CallInfo, OrderedEvent}; use crate::fee::eth_gas_constants; -use crate::fee::fee_utils::get_fee_by_gas_vector; +use crate::fee::fee_utils::{get_fee_by_gas_vector, GasVectorToL1GasForFee}; use crate::fee::gas_usage::{get_da_gas_cost, get_message_segment_length}; use crate::fee::resources::{ ComputationResources, @@ -23,11 +24,7 @@ use crate::fee::resources::{ TransactionResources, }; use crate::state::cached_state::StateChangesCount; -use crate::test_utils::{ - get_vm_resource_usage, - DEFAULT_ETH_L1_DATA_GAS_PRICE, - DEFAULT_ETH_L1_GAS_PRICE, -}; +use crate::test_utils::get_vm_resource_usage; use crate::transaction::test_utils::invoke_tx_with_default_flags; use crate::utils::u64_from_usize; use crate::versioned_constants::{ResourceCost, VersionedConstants, VmResourceCosts}; @@ -284,18 +281,27 @@ fn test_get_message_segment_length( fn test_discounted_gas_from_gas_vector_computation() { let tx_context = BlockContext::create_for_testing() .to_tx_context(&invoke_tx_with_default_flags(invoke_tx_args! {})); - let gas_usage = - GasVector { l1_gas: 100_u8.into(), l1_data_gas: 2_u8.into(), ..Default::default() }; - let actual_result = gas_usage.to_discounted_l1_gas(tx_context.get_gas_prices()); + let mut gas_usage = + GasVector { l1_gas: 100_u8.into(), l1_data_gas: 2_u8.into(), l2_gas: 3_u8.into() }; + let actual_result = gas_usage.to_l1_gas_for_fee( + tx_context.get_gas_prices(), + &tx_context.block_context.versioned_constants, + ); + let converted_l2_gas = tx_context + .block_context + .versioned_constants + .sierra_gas_to_l1_gas_amount_round_up(gas_usage.l2_gas); let result_div_ceil = gas_usage.l1_gas + (gas_usage.l1_data_gas.checked_mul(DEFAULT_ETH_L1_DATA_GAS_PRICE.into()).unwrap()) .checked_div_ceil(DEFAULT_ETH_L1_GAS_PRICE) - .unwrap(); + .unwrap() + + converted_l2_gas; let result_div_floor = gas_usage.l1_gas + (gas_usage.l1_data_gas.checked_mul(DEFAULT_ETH_L1_DATA_GAS_PRICE.into()).unwrap()) .checked_div(DEFAULT_ETH_L1_GAS_PRICE) - .unwrap(); + .unwrap() + + converted_l2_gas; assert_eq!(actual_result, result_div_ceil); assert_eq!(actual_result, result_div_floor + 1_u8.into()); @@ -303,6 +309,15 @@ fn test_discounted_gas_from_gas_vector_computation() { get_fee_by_gas_vector(&tx_context.block_context.block_info, gas_usage, &FeeType::Eth) <= actual_result.checked_mul(DEFAULT_ETH_L1_GAS_PRICE.into()).unwrap() ); + + // Make sure L2 gas has an effect. + gas_usage.l2_gas = 0_u8.into(); + assert!( + gas_usage.to_l1_gas_for_fee( + tx_context.get_gas_prices(), + &tx_context.block_context.versioned_constants, + ) < actual_result + ); } #[rstest] diff --git a/crates/blockifier/src/fee/receipt.rs b/crates/blockifier/src/fee/receipt.rs index 0c7a13d4d90..bcd91612a95 100644 --- a/crates/blockifier/src/fee/receipt.rs +++ b/crates/blockifier/src/fee/receipt.rs @@ -31,6 +31,7 @@ struct TransactionReceiptParameters<'a> { execution_summary_without_fee_transfer: ExecutionSummary, tx_type: TransactionType, reverted_steps: usize, + reverted_sierra_gas: GasAmount, } // TODO(Gilad): Use everywhere instead of passing the `actual_{fee,resources}` tuple, which often @@ -58,6 +59,7 @@ impl TransactionReceipt { execution_summary_without_fee_transfer, tx_type, reverted_steps, + reverted_sierra_gas, } = tx_receipt_params; let charged_resources = execution_summary_without_fee_transfer.charged_resources.clone(); let starknet_resources = StarknetResources::new( @@ -84,8 +86,8 @@ impl TransactionReceipt { computation: ComputationResources { vm_resources: total_vm_resources, n_reverted_steps: reverted_steps, - sierra_gas: charged_resources.gas_for_fee, - reverted_sierra_gas: GasAmount(0), // TODO(tzahi): compute value. + sierra_gas: charged_resources.gas_consumed, + reverted_sierra_gas, }, }; @@ -127,6 +129,7 @@ impl TransactionReceipt { execution_summary_without_fee_transfer, tx_type: TransactionType::L1Handler, reverted_steps: 0, + reverted_sierra_gas: GasAmount(0), }) } @@ -137,6 +140,7 @@ impl TransactionReceipt { state_changes: &'a StateChanges, execution_summary_without_fee_transfer: ExecutionSummary, reverted_steps: usize, + reverted_sierra_gas: GasAmount, ) -> Self { Self::from_params(TransactionReceiptParameters { tx_context, @@ -149,6 +153,7 @@ impl TransactionReceipt { execution_summary_without_fee_transfer, tx_type: account_tx.tx_type(), reverted_steps, + reverted_sierra_gas, }) } } diff --git a/crates/blockifier/src/fee/resources.rs b/crates/blockifier/src/fee/resources.rs index edc1d9249e2..6c0ec1d75a9 100644 --- a/crates/blockifier/src/fee/resources.rs +++ b/crates/blockifier/src/fee/resources.rs @@ -4,6 +4,8 @@ use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::transaction::fields::GasVectorComputationMode; use crate::execution::call_info::{EventSummary, ExecutionSummary}; +#[cfg(test)] +use crate::execution::contract_class::TrackedResource; use crate::fee::eth_gas_constants; use crate::fee::fee_utils::get_vm_resources_cost; use crate::fee::gas_usage::{ @@ -96,9 +98,15 @@ impl ComputationResources { }) } + /// Returns total consumed + reverted units of steps or sierra gas. #[cfg(test)] - pub fn total_charged_steps(&self) -> usize { - self.n_reverted_steps + self.vm_resources.n_steps + pub fn total_charged_computation_units(&self, resource: TrackedResource) -> usize { + match resource { + TrackedResource::CairoSteps => self.vm_resources.n_steps + self.n_reverted_steps, + TrackedResource::SierraGas => { + usize::try_from(self.sierra_gas.0 + self.reverted_sierra_gas.0).unwrap() + } + } } } diff --git a/crates/blockifier/src/state.rs b/crates/blockifier/src/state.rs index 8aa857c963a..913d55f735d 100644 --- a/crates/blockifier/src/state.rs +++ b/crates/blockifier/src/state.rs @@ -1,8 +1,8 @@ pub mod cached_state; -#[cfg(feature = "cairo_native")] pub mod contract_class_manager; #[cfg(test)] pub mod error_format_test; pub mod errors; pub mod global_cache; pub mod state_api; +pub mod stateful_compression; diff --git a/crates/blockifier/src/state/cached_state.rs b/crates/blockifier/src/state/cached_state.rs index f7b2a6b9b68..5fc582edc47 100644 --- a/crates/blockifier/src/state/cached_state.rs +++ b/crates/blockifier/src/state/cached_state.rs @@ -24,6 +24,7 @@ pub type ContractClassMapping = HashMap; /// /// Writer functionality is builtin, whereas Reader functionality is injected through /// initialization. +#[cfg_attr(any(test, feature = "reexecution"), derive(Clone))] #[derive(Debug)] pub struct CachedState { pub state: S, @@ -31,8 +32,6 @@ pub struct CachedState { // Using interior mutability to update caches during `State`'s immutable getters. pub(crate) cache: RefCell, pub(crate) class_hash_to_class: RefCell, - /// A map from class hash to the set of PC values that were visited in the class. - pub visited_pcs: HashMap>, } impl CachedState { @@ -41,7 +40,6 @@ impl CachedState { state, cache: RefCell::new(StateCache::default()), class_hash_to_class: RefCell::new(HashMap::default()), - visited_pcs: HashMap::default(), } } @@ -77,12 +75,6 @@ impl CachedState { self.class_hash_to_class.get_mut().extend(local_contract_cache_updates); } - pub fn update_visited_pcs_cache(&mut self, visited_pcs: &HashMap>) { - for (class_hash, class_visited_pcs) in visited_pcs { - self.add_visited_pcs(*class_hash, class_visited_pcs); - } - } - /// Updates cache with initial cell values for write-only access. /// If written values match the original, the cell is unchanged and not counted as a /// storage-change for fee calculation. @@ -111,15 +103,9 @@ impl CachedState { } impl UpdatableState for CachedState { - fn apply_writes( - &mut self, - writes: &StateMaps, - class_hash_to_class: &ContractClassMapping, - visited_pcs: &HashMap>, - ) { + fn apply_writes(&mut self, writes: &StateMaps, class_hash_to_class: &ContractClassMapping) { // TODO(Noa,15/5/24): Reconsider the clone. self.update_cache(writes, class_hash_to_class.clone()); - self.update_visited_pcs_cache(visited_pcs); } } @@ -277,10 +263,6 @@ impl State for CachedState { self.cache.get_mut().set_compiled_class_hash_write(class_hash, compiled_class_hash); Ok(()) } - - fn add_visited_pcs(&mut self, class_hash: ClassHash, pcs: &HashSet) { - self.visited_pcs.entry(class_hash).or_default().extend(pcs); - } } #[cfg(any(feature = "testing", test))] @@ -290,7 +272,6 @@ impl Default for CachedState HashSet { + pub fn get_contract_addresses(&self) -> HashSet { // Storage updates. let mut modified_contracts: HashSet = self.storage.keys().map(|address_key_pair| address_key_pair.0).collect(); @@ -376,7 +357,7 @@ impl StateMaps { pub fn into_keys(self) -> StateChangesKeys { StateChangesKeys { - modified_contracts: self.get_modified_contracts(), + modified_contracts: self.get_contract_addresses(), nonce_keys: self.nonces.into_keys().collect(), class_hash_keys: self.class_hashes.into_keys().collect(), storage_keys: self.storage.into_keys().collect(), @@ -597,11 +578,7 @@ impl TransactionalState<'_, U> { pub fn commit(self) { let state = self.state.0; let child_cache = self.cache.into_inner(); - state.apply_writes( - &child_cache.writes, - &self.class_hash_to_class.into_inner(), - &self.visited_pcs, - ) + state.apply_writes(&child_cache.writes, &self.class_hash_to_class.into_inner()) } } @@ -762,7 +739,7 @@ impl StateChanges { sender_address: Option, fee_token_address: ContractAddress, ) -> StateChangesCountForFee { - let mut modified_contracts = self.state_maps.get_modified_contracts(); + let mut modified_contracts = self.state_maps.get_contract_addresses(); // For account transactions, we need to compute the transaction fee before we can execute // the fee transfer, and the fee should cover the state changes that happen in the diff --git a/crates/blockifier/src/state/contract_class_manager.rs b/crates/blockifier/src/state/contract_class_manager.rs index 452558cce25..a197111f5d8 100644 --- a/crates/blockifier/src/state/contract_class_manager.rs +++ b/crates/blockifier/src/state/contract_class_manager.rs @@ -1,20 +1,33 @@ +#[cfg(feature = "cairo_native")] use std::sync::mpsc::{sync_channel, Receiver, SyncSender, TrySendError}; +#[cfg(feature = "cairo_native")] use std::sync::Arc; -use log::{error, info}; +#[cfg(any(feature = "testing", test))] +use cached::Cached; +#[cfg(feature = "cairo_native")] +use log; use starknet_api::core::ClassHash; +#[cfg(feature = "cairo_native")] use starknet_api::state::SierraContractClass; -use starknet_sierra_compile::command_line_compiler::CommandLineCompiler; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; -use starknet_sierra_compile::utils::into_contract_class_for_compilation; -use starknet_sierra_compile::SierraToNativeCompiler; - +#[cfg(feature = "cairo_native")] +use starknet_sierra_multicompile::command_line_compiler::CommandLineCompiler; +#[cfg(feature = "cairo_native")] +use starknet_sierra_multicompile::utils::into_contract_class_for_compilation; +#[cfg(feature = "cairo_native")] +use starknet_sierra_multicompile::SierraToNativeCompiler; + +#[cfg(feature = "cairo_native")] +use crate::blockifier::config::CairoNativeRunConfig; use crate::blockifier::config::ContractClassManagerConfig; -use crate::execution::contract_class::{CompiledClassV1, RunnableCompiledClass}; +#[cfg(feature = "cairo_native")] +use crate::execution::contract_class::CompiledClassV1; +#[cfg(feature = "cairo_native")] use crate::execution::native::contract_class::NativeCompiledClassV1; -use crate::state::global_cache::{CachedCairoNative, ContractCaches}; - -const CHANNEL_SIZE: usize = 1000; +#[cfg(feature = "cairo_native")] +use crate::state::global_cache::CachedCairoNative; +use crate::state::global_cache::{CachedCasm, ContractCaches}; +pub const DEFAULT_COMPILATION_REQUEST_CHANNEL_SIZE: usize = 1000; /// Represents a request to compile a sierra contract class to a native compiled class. /// @@ -23,57 +36,103 @@ const CHANNEL_SIZE: usize = 1000; /// * `sierra_contract_class` - the sierra contract class to be compiled. /// * `casm_compiled_class` - stored in [`NativeCompiledClassV1`] to allow fallback to cairo_vm /// execution in case of unexpected failure during native execution. +#[cfg(feature = "cairo_native")] type CompilationRequest = (ClassHash, Arc, CompiledClassV1); /// Manages the global cache of contract classes and handles sierra-to-native compilation requests. -struct ContractClassManager { - config: ContractClassManagerConfig, +#[derive(Clone)] +pub struct ContractClassManager { + #[cfg(feature = "cairo_native")] + cairo_native_run_config: CairoNativeRunConfig, /// The global cache of contract classes: casm, sierra, and native. - contract_caches: Arc, + contract_caches: ContractCaches, /// The sending half of the compilation request channel. Set to `None` if native compilation is /// disabled. + #[cfg(feature = "cairo_native")] sender: Option>, + /// The sierra-to-native compiler. + #[cfg(feature = "cairo_native")] + compiler: Option>, } -#[allow(dead_code)] impl ContractClassManager { /// Creates a new contract class manager and spawns a thread that listens for compilation /// requests and processes them (a.k.a. the compilation worker). /// Returns the contract class manager. + /// NOTE: the compilation worker is not spawned if one of the following conditions is met: + /// 1. The feature `cairo_native` is not enabled. + /// 2. `config.run_cairo_native` is `false`. + /// 3. `config.wait_on_native_compilation` is `true`. pub fn start(config: ContractClassManagerConfig) -> ContractClassManager { // TODO(Avi, 15/12/2024): Add the size of the channel to the config. - let contract_caches = Arc::new(ContractCaches::new(config.contract_cache_size)); - if !config.run_cairo_native { - // Native compilation is disabled - no need to start the compilation worker. - return ContractClassManager { config, contract_caches, sender: None }; - } - let (sender, receiver) = sync_channel(CHANNEL_SIZE); - let compiler_config = SierraToCasmCompilationConfig::default(); - let compiler = CommandLineCompiler::new(compiler_config); + let contract_caches = ContractCaches::new(config.contract_cache_size); + #[cfg(not(feature = "cairo_native"))] + return ContractClassManager { contract_caches }; + #[cfg(feature = "cairo_native")] + { + let cairo_native_run_config = config.cairo_native_run_config; + if !cairo_native_run_config.run_cairo_native { + // Native compilation is disabled - no need to start the compilation worker. + return ContractClassManager { + cairo_native_run_config: config.cairo_native_run_config, + contract_caches, + sender: None, + compiler: None, + }; + } - std::thread::spawn({ - let contract_caches = Arc::clone(&contract_caches); - let compiler = Arc::new(compiler); + let compiler_config = config.native_compiler_config.clone(); + let compiler = Arc::new(CommandLineCompiler::new(compiler_config)); + if cairo_native_run_config.wait_on_native_compilation { + // Compilation requests are processed synchronously. No need to start the worker. + return ContractClassManager { + cairo_native_run_config, + contract_caches, + sender: None, + compiler: Some(compiler), + }; + } - move || run_compilation_worker(contract_caches, receiver, compiler) - }); + let (sender, receiver) = sync_channel(cairo_native_run_config.channel_size); - ContractClassManager { config, contract_caches, sender: Some(sender) } + std::thread::spawn({ + let contract_caches = contract_caches.clone(); + move || run_compilation_worker(contract_caches, receiver, compiler) + }); + + ContractClassManager { + cairo_native_run_config, + contract_caches, + sender: Some(sender), + compiler: None, + } + } } - /// Sends a compilation request to the compilation worker. Does not block the sender. Logs an - /// error if the channel is full. + /// Sends a compilation request. Two cases: + /// 1. If `config.wait_on_native_compilation` is `false`, sends the request to the compilation + /// worker. Does not block the sender. Logs an error if the channel is full. + /// 2. Otherwise, processes the request synchronously, blocking the sender until the request is + /// processed. + #[cfg(feature = "cairo_native")] pub fn send_compilation_request(&self, request: CompilationRequest) { - assert!(!self.config.run_cairo_native, "Native compilation is disabled."); + assert!(self.run_cairo_native(), "Native compilation is disabled."); + if self.wait_on_native_compilation() { + // Compilation requests are processed synchronously. No need to go through the channel. + let compiler = self.compiler.as_ref().expect("Compiler not available."); + process_compilation_request(self.contract_caches.clone(), compiler.clone(), request); + return; + } + let sender = self.sender.as_ref().expect("Compilation channel not available."); - self.cache_request_contracts(&request); // TODO(Avi, 15/12/2024): Check for duplicated requests. sender.try_send(request).unwrap_or_else(|err| match err { TrySendError::Full((class_hash, _, _)) => { - error!( + log::error!( "Compilation request channel is full (size: {}). Compilation request for \ class hash {} was not sent.", - CHANNEL_SIZE, class_hash + self.cairo_native_run_config.channel_size, + class_hash ) } TrySendError::Disconnected(_) => { @@ -83,61 +142,86 @@ impl ContractClassManager { } /// Returns the native compiled class for the given class hash, if it exists in cache. + #[cfg(feature = "cairo_native")] pub fn get_native(&self, class_hash: &ClassHash) -> Option { self.contract_caches.get_native(class_hash) } - /// Returns the Sierra contract class for the given class hash, if it exists in cache. - pub fn get_sierra(&self, class_hash: &ClassHash) -> Option> { - self.contract_caches.get_sierra(class_hash) - } - /// Returns the casm compiled class for the given class hash, if it exists in cache. - pub fn get_casm(&self, class_hash: &ClassHash) -> Option { + pub fn get_casm(&self, class_hash: &ClassHash) -> Option { self.contract_caches.get_casm(class_hash) } /// Sets the casm compiled class for the given class hash in the cache. - pub fn set_casm(&self, class_hash: ClassHash, compiled_class: RunnableCompiledClass) { + pub fn set_casm(&self, class_hash: ClassHash, compiled_class: CachedCasm) { self.contract_caches.set_casm(class_hash, compiled_class); } - /// Caches the sierra and casm contract classes of a compilation request. - fn cache_request_contracts(&self, request: &CompilationRequest) { - let (class_hash, sierra, casm) = request.clone(); - self.contract_caches.set_sierra(class_hash, sierra); - let cached_casm = RunnableCompiledClass::from(casm); - self.contract_caches.set_casm(class_hash, cached_casm); + #[cfg(all(feature = "cairo_native", feature = "testing"))] + pub fn set_native(&self, class_hash: ClassHash, compiled_class: NativeCompiledClassV1) { + self.contract_caches.set_native(class_hash, CachedCairoNative::Compiled(compiled_class)); + } + + #[cfg(feature = "cairo_native")] + pub fn run_cairo_native(&self) -> bool { + self.cairo_native_run_config.run_cairo_native + } + + #[cfg(feature = "cairo_native")] + pub fn wait_on_native_compilation(&self) -> bool { + self.cairo_native_run_config.wait_on_native_compilation + } + + /// Clear the contract caches. + pub fn clear(&mut self) { + self.contract_caches.clear(); + } + + #[cfg(any(feature = "testing", test))] + pub fn get_casm_cache_size(&self) -> usize { + self.contract_caches.casm_cache.lock().cache_size() } } /// Handles compilation requests from the channel, holding the receiver end of the channel. /// If no request is available, non-busy-waits until a request is available. /// When the sender is dropped, the worker processes all pending requests and terminates. +#[cfg(feature = "cairo_native")] fn run_compilation_worker( - contract_caches: Arc, + contract_caches: ContractCaches, receiver: Receiver, compiler: Arc, ) { - info!("Compilation worker started."); - for (class_hash, sierra, casm) in receiver.iter() { - if contract_caches.get_native(&class_hash).is_some() { - // The contract class is already compiled to native - skip the compilation. - continue; + log::info!("Compilation worker started."); + for compilation_request in receiver.iter() { + process_compilation_request(contract_caches.clone(), compiler.clone(), compilation_request); + } + log::info!("Compilation worker terminated."); +} + +/// Processes a compilation request and caches the compiled class in the contract caches. +#[cfg(feature = "cairo_native")] +fn process_compilation_request( + contract_caches: ContractCaches, + compiler: Arc, + compilation_request: CompilationRequest, +) { + let (class_hash, sierra, casm) = compilation_request; + if contract_caches.get_native(&class_hash).is_some() { + // The contract class is already compiled to native - skip the compilation. + return; + } + let sierra_for_compilation = into_contract_class_for_compilation(sierra.as_ref()); + let compilation_result = compiler.compile_to_native(sierra_for_compilation); + match compilation_result { + Ok(executor) => { + let native_compiled_class = NativeCompiledClassV1::new(executor.into(), casm); + contract_caches + .set_native(class_hash, CachedCairoNative::Compiled(native_compiled_class)); } - let sierra_for_compilation = into_contract_class_for_compilation(sierra.as_ref()); - let compilation_result = compiler.compile_to_native(sierra_for_compilation); - match compilation_result { - Ok(executor) => { - let native_compiled_class = NativeCompiledClassV1::new(executor.into(), casm); - contract_caches - .set_native(class_hash, CachedCairoNative::Compiled(native_compiled_class)); - } - Err(err) => { - error!("Error compiling contract class: {}", err); - contract_caches.set_native(class_hash, CachedCairoNative::CompilationFailed); - } + Err(err) => { + log::error!("Error compiling contract class: {}", err); + contract_caches.set_native(class_hash, CachedCairoNative::CompilationFailed); } } - info!("Compilation worker terminated."); } diff --git a/crates/blockifier/src/state/global_cache.rs b/crates/blockifier/src/state/global_cache.rs index f60df02f010..dd5c5f8a64b 100644 --- a/crates/blockifier/src/state/global_cache.rs +++ b/crates/blockifier/src/state/global_cache.rs @@ -2,10 +2,8 @@ use std::sync::{Arc, Mutex, MutexGuard}; use cached::{Cached, SizedCache}; use starknet_api::core::ClassHash; -#[cfg(feature = "cairo_native")] use starknet_api::state::SierraContractClass; -#[cfg(feature = "cairo_native")] use crate::execution::contract_class::RunnableCompiledClass; #[cfg(feature = "cairo_native")] use crate::execution::native::contract_class::NativeCompiledClassV1; @@ -18,6 +16,19 @@ pub type LockedClassCache<'a, T> = MutexGuard<'a, ContractLRUCache>; // TODO(Yoni, 1/1/2025): consider defining CachedStateReader. pub struct GlobalContractCache(pub Arc>>); +#[derive(Debug, Clone)] +pub enum CachedCasm { + WithoutSierra(RunnableCompiledClass), + WithSierra(RunnableCompiledClass, Arc), +} +impl CachedCasm { + pub fn to_runnable_casm(&self) -> RunnableCompiledClass { + match self { + CachedCasm::WithoutSierra(casm) | CachedCasm::WithSierra(casm, _) => casm.clone(), + } + } +} + #[cfg(feature = "cairo_native")] #[derive(Debug, Clone)] pub enum CachedCairoNative { @@ -51,50 +62,43 @@ impl GlobalContractCache { } } -#[cfg(feature = "cairo_native")] +#[derive(Clone)] pub struct ContractCaches { - pub casm_cache: GlobalContractCache, + pub casm_cache: GlobalContractCache, + #[cfg(feature = "cairo_native")] pub native_cache: GlobalContractCache, - pub sierra_cache: GlobalContractCache>, } -#[cfg(feature = "cairo_native")] impl ContractCaches { - pub fn get_casm(&self, class_hash: &ClassHash) -> Option { + pub fn get_casm(&self, class_hash: &ClassHash) -> Option { self.casm_cache.get(class_hash) } - pub fn set_casm(&self, class_hash: ClassHash, compiled_class: RunnableCompiledClass) { + pub fn set_casm(&self, class_hash: ClassHash, compiled_class: CachedCasm) { self.casm_cache.set(class_hash, compiled_class); } + #[cfg(feature = "cairo_native")] pub fn get_native(&self, class_hash: &ClassHash) -> Option { self.native_cache.get(class_hash) } + #[cfg(feature = "cairo_native")] pub fn set_native(&self, class_hash: ClassHash, contract_executor: CachedCairoNative) { self.native_cache.set(class_hash, contract_executor); } - pub fn get_sierra(&self, class_hash: &ClassHash) -> Option> { - self.sierra_cache.get(class_hash) - } - - pub fn set_sierra(&self, class_hash: ClassHash, contract_class: Arc) { - self.sierra_cache.set(class_hash, contract_class); - } - pub fn new(cache_size: usize) -> Self { Self { casm_cache: GlobalContractCache::new(cache_size), + #[cfg(feature = "cairo_native")] native_cache: GlobalContractCache::new(cache_size), - sierra_cache: GlobalContractCache::new(cache_size), } } pub fn clear(&mut self) { self.casm_cache.clear(); + #[cfg(feature = "cairo_native")] self.native_cache.clear(); - self.sierra_cache.clear(); } } diff --git a/crates/blockifier/src/state/state_api.rs b/crates/blockifier/src/state/state_api.rs index 96e24c1e1a3..074d7835c56 100644 --- a/crates/blockifier/src/state/state_api.rs +++ b/crates/blockifier/src/state/state_api.rs @@ -1,5 +1,3 @@ -use std::collections::{HashMap, HashSet}; - use starknet_api::abi::abi_utils::get_fee_token_var_address; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; use starknet_api::state::StorageKey; @@ -102,19 +100,9 @@ pub trait State: StateReader { class_hash: ClassHash, compiled_class_hash: CompiledClassHash, ) -> StateResult<()>; - - /// Marks the given set of PC values as visited for the given class hash. - // TODO(lior): Once we have a BlockResources object, move this logic there. Make sure reverted - // entry points do not affect the final set of PCs. - fn add_visited_pcs(&mut self, _class_hash: ClassHash, _pcs: &HashSet) {} } /// A class defining the API for updating a state with transactions writes. pub trait UpdatableState: StateReader { - fn apply_writes( - &mut self, - writes: &StateMaps, - class_hash_to_class: &ContractClassMapping, - visited_pcs: &HashMap>, - ); + fn apply_writes(&mut self, writes: &StateMaps, class_hash_to_class: &ContractClassMapping); } diff --git a/crates/blockifier/src/state/stateful_compression.rs b/crates/blockifier/src/state/stateful_compression.rs new file mode 100644 index 00000000000..e04504ee6aa --- /dev/null +++ b/crates/blockifier/src/state/stateful_compression.rs @@ -0,0 +1,210 @@ +use std::collections::{BTreeSet, HashMap}; + +use starknet_api::core::{ContractAddress, PatriciaKey}; +use starknet_api::state::StorageKey; +use starknet_api::StarknetApiError; +use starknet_types_core::felt::Felt; +use thiserror::Error; + +use super::cached_state::{CachedState, StateMaps}; +use super::errors::StateError; +use super::state_api::{State, StateReader, StateResult}; + +#[cfg(test)] +#[path = "stateful_compression_test.rs"] +pub mod stateful_compression_test; + +type Alias = Felt; +type AliasKey = StorageKey; + +#[derive(Debug, Error)] +pub enum CompressionError { + #[error("Missing key in alias contract: {:#064x}", ***.0)] + MissedAlias(AliasKey), + #[error(transparent)] + StateError(#[from] StateError), + #[error(transparent)] + StarknetApiError(#[from] StarknetApiError), +} +pub type CompressionResult = Result; + +// The initial alias available for allocation. +const INITIAL_AVAILABLE_ALIAS_HEX: &str = "0x80"; +pub const INITIAL_AVAILABLE_ALIAS: Felt = Felt::from_hex_unchecked(INITIAL_AVAILABLE_ALIAS_HEX); + +// The storage key of the alias counter in the alias contract. +pub const ALIAS_COUNTER_STORAGE_KEY: StorageKey = StorageKey(PatriciaKey::ZERO); +// The maximal contract address for which aliases are not used and all keys are serialized as is, +// without compression. +pub const MAX_NON_COMPRESSED_CONTRACT_ADDRESS: ContractAddress = + ContractAddress(PatriciaKey::from_hex_unchecked("0xf")); +// The minimal value for a key to be allocated an alias. Smaller keys are serialized as is (their +// alias is identical to the key). +pub const MIN_VALUE_FOR_ALIAS_ALLOC: PatriciaKey = + PatriciaKey::from_hex_unchecked(INITIAL_AVAILABLE_ALIAS_HEX); + +/// Allocates aliases for the new addresses and storage keys in the alias contract. +/// Iterates over the addresses in ascending order. For each address, sets an alias for the new +/// storage keys (in ascending order) and for the address itself. +pub fn allocate_aliases_in_storage( + state: &mut CachedState, + alias_contract_address: ContractAddress, +) -> StateResult<()> { + let state_diff = state.to_state_diff()?.state_maps; + + // Collect the contract addresses and the storage keys that need aliases. + let contract_addresses: BTreeSet = + state_diff.get_contract_addresses().into_iter().collect(); + let mut contract_address_to_sorted_storage_keys = HashMap::new(); + for (contract_address, storage_key) in state_diff.storage.keys() { + if contract_address > &MAX_NON_COMPRESSED_CONTRACT_ADDRESS { + contract_address_to_sorted_storage_keys + .entry(contract_address) + .or_insert_with(BTreeSet::new) + .insert(storage_key); + } + } + + // Iterate over the addresses and the storage keys and update the aliases. + let mut alias_updater = AliasUpdater::new(state, alias_contract_address)?; + for contract_address in contract_addresses { + if let Some(storage_keys) = contract_address_to_sorted_storage_keys.get(&contract_address) { + for key in storage_keys { + alias_updater.insert_alias(key)?; + } + } + alias_updater.insert_alias(&StorageKey(contract_address.0))?; + } + + alias_updater.finalize_updates() +} + +/// Updates the alias contract with the new keys. +struct AliasUpdater<'a, S: State> { + state: &'a mut S, + is_alias_inserted: bool, + next_free_alias: Option, + alias_contract_address: ContractAddress, +} + +impl<'a, S: State> AliasUpdater<'a, S> { + fn new(state: &'a mut S, alias_contract_address: ContractAddress) -> StateResult { + let stored_counter = + state.get_storage_at(alias_contract_address, ALIAS_COUNTER_STORAGE_KEY)?; + Ok(Self { + state, + is_alias_inserted: false, + next_free_alias: if stored_counter == Felt::ZERO { None } else { Some(stored_counter) }, + alias_contract_address, + }) + } + + fn set_alias_in_storage(&mut self, alias_key: AliasKey, alias: Alias) -> StateResult<()> { + self.state.set_storage_at(self.alias_contract_address, alias_key, alias) + } + + /// Inserts the alias key to the updates if it's not already aliased. + fn insert_alias(&mut self, alias_key: &AliasKey) -> StateResult<()> { + if alias_key.0 >= MIN_VALUE_FOR_ALIAS_ALLOC + && self.state.get_storage_at(self.alias_contract_address, *alias_key)? == Felt::ZERO + { + let alias_to_allocate = self.next_free_alias.unwrap_or(INITIAL_AVAILABLE_ALIAS); + self.set_alias_in_storage(*alias_key, alias_to_allocate)?; + self.is_alias_inserted = true; + self.next_free_alias = Some(alias_to_allocate + Felt::ONE); + } + Ok(()) + } + + /// Inserts the counter of the alias contract. + fn finalize_updates(mut self) -> StateResult<()> { + match self.next_free_alias { + None => { + self.set_alias_in_storage(ALIAS_COUNTER_STORAGE_KEY, INITIAL_AVAILABLE_ALIAS)?; + } + Some(alias) => { + if self.is_alias_inserted { + self.set_alias_in_storage(ALIAS_COUNTER_STORAGE_KEY, alias)?; + } + } + } + Ok(()) + } +} + +/// Compresses the state diff by replacing the addresses and storage keys with aliases. +pub fn compress( + state_diff: &StateMaps, + state: &S, + alias_contract_address: ContractAddress, +) -> CompressionResult { + let alias_compressor = AliasCompressor { state, alias_contract_address }; + + let nonces = state_diff + .nonces + .iter() + .map(|(contract_address, nonce)| { + Ok((alias_compressor.compress_address(contract_address)?, *nonce)) + }) + .collect::>()?; + let class_hashes = state_diff + .class_hashes + .iter() + .map(|(contract_address, class_hash)| { + Ok((alias_compressor.compress_address(contract_address)?, *class_hash)) + }) + .collect::>()?; + let storage = state_diff + .storage + .iter() + .map(|((contract_address, key), value)| { + Ok(( + ( + alias_compressor.compress_address(contract_address)?, + alias_compressor.compress_storage_key(key, contract_address)?, + ), + *value, + )) + }) + .collect::>()?; + + Ok(StateMaps { nonces, class_hashes, storage, ..state_diff.clone() }) +} + +/// Replaces contact addresses and storage keys with aliases. +struct AliasCompressor<'a, S: StateReader> { + state: &'a S, + alias_contract_address: ContractAddress, +} + +impl AliasCompressor<'_, S> { + fn compress_address( + &self, + contract_address: &ContractAddress, + ) -> CompressionResult { + if contract_address.0 >= MIN_VALUE_FOR_ALIAS_ALLOC { + Ok(self.get_alias(StorageKey(contract_address.0))?.try_into()?) + } else { + Ok(*contract_address) + } + } + + fn compress_storage_key( + &self, + storage_key: &StorageKey, + contract_address: &ContractAddress, + ) -> CompressionResult { + if storage_key.0 >= MIN_VALUE_FOR_ALIAS_ALLOC + && contract_address > &MAX_NON_COMPRESSED_CONTRACT_ADDRESS + { + Ok(self.get_alias(*storage_key)?.try_into()?) + } else { + Ok(*storage_key) + } + } + + fn get_alias(&self, alias_key: AliasKey) -> CompressionResult { + let alias = self.state.get_storage_at(self.alias_contract_address, alias_key)?; + if alias == Felt::ZERO { Err(CompressionError::MissedAlias(alias_key)) } else { Ok(alias) } + } +} diff --git a/crates/blockifier/src/state/stateful_compression_test.rs b/crates/blockifier/src/state/stateful_compression_test.rs new file mode 100644 index 00000000000..c6bc7ea4875 --- /dev/null +++ b/crates/blockifier/src/state/stateful_compression_test.rs @@ -0,0 +1,403 @@ +use std::collections::{HashMap, HashSet}; +use std::sync::LazyLock; + +use assert_matches::assert_matches; +use rstest::rstest; +use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce, PatriciaKey}; +use starknet_api::felt; +use starknet_api::state::StorageKey; +use starknet_types_core::felt::Felt; + +use super::{ + allocate_aliases_in_storage, + compress, + Alias, + AliasKey, + AliasUpdater, + ALIAS_COUNTER_STORAGE_KEY, + INITIAL_AVAILABLE_ALIAS, + MAX_NON_COMPRESSED_CONTRACT_ADDRESS, + MIN_VALUE_FOR_ALIAS_ALLOC, +}; +use crate::state::cached_state::{CachedState, StateMaps, StorageEntry}; +use crate::state::state_api::{State, StateReader}; +use crate::state::stateful_compression::{AliasCompressor, CompressionError}; +use crate::test_utils::dict_state_reader::DictStateReader; + +static ALIAS_CONTRACT_ADDRESS: LazyLock = + LazyLock::new(|| ContractAddress(PatriciaKey::try_from(Felt::TWO).unwrap())); + +/// Decompresses the state diff by replacing the aliases with addresses and storage keys. +fn decompress( + state_diff: &StateMaps, + state: &S, + alias_contract_address: ContractAddress, + alias_keys: HashSet, +) -> StateMaps { + let alias_decompressor = AliasDecompressorUtil::new(state, alias_contract_address, alias_keys); + + let mut nonces = HashMap::new(); + for (alias_contract_address, nonce) in state_diff.nonces.iter() { + nonces.insert(alias_decompressor.decompress_address(alias_contract_address), *nonce); + } + let mut class_hashes = HashMap::new(); + for (alias_contract_address, class_hash) in state_diff.class_hashes.iter() { + class_hashes + .insert(alias_decompressor.decompress_address(alias_contract_address), *class_hash); + } + let mut storage = HashMap::new(); + for ((alias_contract_address, alias_storage_key), value) in state_diff.storage.iter() { + let contract_address = alias_decompressor.decompress_address(alias_contract_address); + storage.insert( + ( + contract_address, + alias_decompressor.decompress_storage_key(alias_storage_key, &contract_address), + ), + *value, + ); + } + + StateMaps { nonces, class_hashes, storage, ..state_diff.clone() } +} + +/// Replaces aliases with the original contact addresses and storage keys. +struct AliasDecompressorUtil { + reversed_alias_mapping: HashMap, +} + +impl AliasDecompressorUtil { + fn new( + state: &S, + alias_contract_address: ContractAddress, + alias_keys: HashSet, + ) -> Self { + let mut reversed_alias_mapping = HashMap::new(); + for alias_key in alias_keys.into_iter() { + reversed_alias_mapping.insert( + state.get_storage_at(alias_contract_address, alias_key).unwrap(), + alias_key, + ); + } + Self { reversed_alias_mapping } + } + + fn decompress_address(&self, contract_address_alias: &ContractAddress) -> ContractAddress { + if contract_address_alias.0 >= MIN_VALUE_FOR_ALIAS_ALLOC { + ContractAddress::try_from( + *self.restore_alias_key(Felt::from(*contract_address_alias)).key(), + ) + .unwrap() + } else { + *contract_address_alias + } + } + + fn decompress_storage_key( + &self, + storage_key_alias: &StorageKey, + contact_address: &ContractAddress, + ) -> StorageKey { + if storage_key_alias.0 >= MIN_VALUE_FOR_ALIAS_ALLOC + && contact_address > &MAX_NON_COMPRESSED_CONTRACT_ADDRESS + { + self.restore_alias_key(*storage_key_alias.0) + } else { + *storage_key_alias + } + } + + fn restore_alias_key(&self, alias: Alias) -> AliasKey { + *self.reversed_alias_mapping.get(&alias).unwrap() + } +} + +fn insert_to_alias_contract( + storage: &mut HashMap, + key: StorageKey, + value: Felt, +) { + storage.insert((*ALIAS_CONTRACT_ADDRESS, key), value); +} + +fn initial_state(n_existing_aliases: u8) -> CachedState { + let mut state_reader = DictStateReader::default(); + if n_existing_aliases > 0 { + let high_alias_key = INITIAL_AVAILABLE_ALIAS * Felt::TWO; + insert_to_alias_contract( + &mut state_reader.storage_view, + ALIAS_COUNTER_STORAGE_KEY, + INITIAL_AVAILABLE_ALIAS + Felt::from(n_existing_aliases), + ); + for i in 0..n_existing_aliases { + insert_to_alias_contract( + &mut state_reader.storage_view, + (high_alias_key + Felt::from(i)).try_into().unwrap(), + INITIAL_AVAILABLE_ALIAS + Felt::from(i), + ); + } + } + + CachedState::new(state_reader) +} + +/// Tests the alias contract updater with an empty state. +#[rstest] +#[case::no_update(vec![], vec![])] +#[case::low_update(vec![INITIAL_AVAILABLE_ALIAS - 1], vec![])] +#[case::single_update(vec![INITIAL_AVAILABLE_ALIAS], vec![INITIAL_AVAILABLE_ALIAS])] +#[case::some_update( + vec![ + INITIAL_AVAILABLE_ALIAS + 1, + INITIAL_AVAILABLE_ALIAS - 1, + INITIAL_AVAILABLE_ALIAS, + INITIAL_AVAILABLE_ALIAS + 2, + INITIAL_AVAILABLE_ALIAS, + ], + vec![ + INITIAL_AVAILABLE_ALIAS + 1, + INITIAL_AVAILABLE_ALIAS, + INITIAL_AVAILABLE_ALIAS + 2, + ] +)] +fn test_alias_updater( + #[case] keys: Vec, + #[case] expected_alias_keys: Vec, + #[values(0, 2)] n_existing_aliases: u8, +) { + let mut state = initial_state(n_existing_aliases); + + // Insert the keys into the alias contract updater and finalize the updates. + let mut alias_contract_updater = + AliasUpdater::new(&mut state, *ALIAS_CONTRACT_ADDRESS).unwrap(); + for key in keys { + alias_contract_updater.insert_alias(&StorageKey::try_from(key).unwrap()).unwrap(); + } + alias_contract_updater.finalize_updates().unwrap(); + let storage_diff = state.to_state_diff().unwrap().state_maps.storage; + + // Test the new aliases. + let mut expected_storage_diff = HashMap::new(); + let mut expected_next_alias = INITIAL_AVAILABLE_ALIAS + Felt::from(n_existing_aliases); + for key in &expected_alias_keys { + insert_to_alias_contract( + &mut expected_storage_diff, + StorageKey::try_from(*key).unwrap(), + expected_next_alias, + ); + expected_next_alias += Felt::ONE; + } + if !expected_alias_keys.is_empty() || n_existing_aliases == 0 { + insert_to_alias_contract( + &mut expected_storage_diff, + ALIAS_COUNTER_STORAGE_KEY, + expected_next_alias, + ); + } + + assert_eq!(storage_diff, expected_storage_diff); +} + +#[test] +fn test_iterate_aliases() { + let mut state = initial_state(0); + state + .set_storage_at(ContractAddress::from(0x201_u16), StorageKey::from(0x307_u16), Felt::ONE) + .unwrap(); + state + .set_storage_at(ContractAddress::from(0x201_u16), StorageKey::from(0x309_u16), Felt::TWO) + .unwrap(); + state + .set_storage_at(ContractAddress::from(0x201_u16), StorageKey::from(0x304_u16), Felt::THREE) + .unwrap(); + state + .set_storage_at(MAX_NON_COMPRESSED_CONTRACT_ADDRESS, StorageKey::from(0x301_u16), Felt::ONE) + .unwrap(); + state.get_class_hash_at(ContractAddress::from(0x202_u16)).unwrap(); + state.set_class_hash_at(ContractAddress::from(0x202_u16), ClassHash(Felt::ONE)).unwrap(); + state.increment_nonce(ContractAddress::from(0x200_u16)).unwrap(); + + allocate_aliases_in_storage(&mut state, *ALIAS_CONTRACT_ADDRESS).unwrap(); + let storage_diff = state.to_state_diff().unwrap().state_maps.storage; + + assert_eq!( + storage_diff, + vec![ + ( + (*ALIAS_CONTRACT_ADDRESS, ALIAS_COUNTER_STORAGE_KEY), + INITIAL_AVAILABLE_ALIAS + Felt::from(6_u8) + ), + ((*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x200_u16)), INITIAL_AVAILABLE_ALIAS), + ( + (*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x304_u16)), + INITIAL_AVAILABLE_ALIAS + Felt::ONE + ), + ( + (*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x307_u16)), + INITIAL_AVAILABLE_ALIAS + Felt::TWO + ), + ( + (*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x309_u16)), + INITIAL_AVAILABLE_ALIAS + Felt::THREE + ), + ( + (*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x201_u16)), + INITIAL_AVAILABLE_ALIAS + Felt::from(4_u8) + ), + ( + (*ALIAS_CONTRACT_ADDRESS, StorageKey::from(0x202_u16)), + INITIAL_AVAILABLE_ALIAS + Felt::from(5_u8) + ), + ((ContractAddress::from(0x201_u16), StorageKey::from(0x304_u16)), Felt::THREE), + ((ContractAddress::from(0x201_u16), StorageKey::from(0x307_u16)), Felt::ONE), + ((ContractAddress::from(0x201_u16), StorageKey::from(0x309_u16)), Felt::TWO), + ((MAX_NON_COMPRESSED_CONTRACT_ADDRESS, StorageKey::from(0x301_u16)), Felt::ONE), + ] + .into_iter() + .collect() + ); +} + +#[rstest] +fn test_read_only_state(#[values(0, 2)] n_existing_aliases: u8) { + let mut state = initial_state(n_existing_aliases); + state + .set_storage_at(ContractAddress::from(0x200_u16), StorageKey::from(0x300_u16), Felt::ZERO) + .unwrap(); + state.get_nonce_at(ContractAddress::from(0x201_u16)).unwrap(); + state.get_class_hash_at(ContractAddress::from(0x202_u16)).unwrap(); + allocate_aliases_in_storage(&mut state, *ALIAS_CONTRACT_ADDRESS).unwrap(); + let storage_diff = state.to_state_diff().unwrap().state_maps.storage; + + let expected_storage_diff = if n_existing_aliases == 0 { + HashMap::from([( + (*ALIAS_CONTRACT_ADDRESS, ALIAS_COUNTER_STORAGE_KEY), + INITIAL_AVAILABLE_ALIAS, + )]) + } else { + HashMap::new() + }; + assert_eq!(storage_diff, expected_storage_diff); +} + +/// Tests the range of alias keys that should be compressed. +#[test] +fn test_alias_compressor() { + let alias = Felt::from(500_u16); + + let high_key = 200_u16; + let high_storage_key = StorageKey::from(high_key); + let high_contract_address = ContractAddress::from(high_key); + + let no_aliasing_key = 50_u16; + let no_aliasing_storage_key = StorageKey::from(no_aliasing_key); + let no_aliasing_contract_address = ContractAddress::from(no_aliasing_key); + + let no_compression_contract_address = ContractAddress::from(10_u16); + + let mut state_reader = DictStateReader::default(); + insert_to_alias_contract(&mut state_reader.storage_view, high_storage_key, alias); + let alias_compressor = + AliasCompressor { state: &state_reader, alias_contract_address: *ALIAS_CONTRACT_ADDRESS }; + + assert_eq!( + alias_compressor.compress_address(&high_contract_address).unwrap(), + ContractAddress::try_from(alias).unwrap(), + ); + assert_eq!( + alias_compressor.compress_address(&no_aliasing_contract_address).unwrap(), + no_aliasing_contract_address, + ); + + assert_eq!( + alias_compressor.compress_storage_key(&high_storage_key, &high_contract_address).unwrap(), + StorageKey::try_from(alias).unwrap(), + ); + assert_eq!( + alias_compressor + .compress_storage_key(&no_aliasing_storage_key, &high_contract_address) + .unwrap(), + no_aliasing_storage_key, + ); + assert_eq!( + alias_compressor + .compress_storage_key(&high_storage_key, &no_compression_contract_address) + .unwrap(), + high_storage_key, + ); + + let missed_key = 300_u16; + let err = alias_compressor.compress_address(&ContractAddress::from(missed_key)); + assert_matches!( + err, + Err(CompressionError::MissedAlias(key)) if key == missed_key.into() + ); +} + +#[test] +fn test_compression() { + let state_reader = DictStateReader { + storage_view: (200_u16..206) + .map(|x| ((*ALIAS_CONTRACT_ADDRESS, StorageKey::from(x)), Felt::from(x + 100))) + .collect(), + ..Default::default() + }; + + // State diff with values that should not be compressed. + let base_state_diff = StateMaps { + nonces: vec![(ContractAddress::from(30_u16), Nonce(Felt::ONE))].into_iter().collect(), + class_hashes: vec![(ContractAddress::from(31_u16), ClassHash(Felt::ONE))] + .into_iter() + .collect(), + storage: vec![((ContractAddress::from(10_u16), StorageKey::from(205_u16)), Felt::TWO)] + .into_iter() + .collect(), + compiled_class_hashes: vec![(ClassHash(felt!("0x400")), CompiledClassHash(felt!("0x401")))] + .into_iter() + .collect(), + declared_contracts: vec![(ClassHash(felt!("0x402")), true)].into_iter().collect(), + }; + + let compressed_base_state_diff = + compress(&base_state_diff, &state_reader, *ALIAS_CONTRACT_ADDRESS).unwrap(); + assert_eq!(compressed_base_state_diff, base_state_diff); + + // Add to the state diff values that should be compressed. + let mut state_diff = base_state_diff.clone(); + state_diff.extend(&StateMaps { + nonces: vec![(ContractAddress::from(200_u16), Nonce(Felt::ZERO))].into_iter().collect(), + class_hashes: vec![(ContractAddress::from(201_u16), ClassHash(Felt::ZERO))] + .into_iter() + .collect(), + storage: vec![ + ((ContractAddress::from(202_u16), StorageKey::from(203_u16)), Felt::ZERO), + ((ContractAddress::from(32_u16), StorageKey::from(204_u16)), Felt::ONE), + ] + .into_iter() + .collect(), + ..Default::default() + }); + + let mut expected_compressed_state_diff = base_state_diff.clone(); + expected_compressed_state_diff.extend(&StateMaps { + nonces: vec![(ContractAddress::from(300_u16), Nonce(Felt::ZERO))].into_iter().collect(), + class_hashes: vec![(ContractAddress::from(301_u16), ClassHash(Felt::ZERO))] + .into_iter() + .collect(), + storage: vec![ + ((ContractAddress::from(302_u16), StorageKey::from(303_u16)), Felt::ZERO), + ((ContractAddress::from(32_u16), StorageKey::from(304_u16)), Felt::ONE), + ] + .into_iter() + .collect(), + ..Default::default() + }); + + let compressed_state_diff = + compress(&state_diff, &state_reader, *ALIAS_CONTRACT_ADDRESS).unwrap(); + assert_eq!(compressed_state_diff, expected_compressed_state_diff); + + let alias_keys = state_reader.storage_view.keys().map(|(_, key)| *key).collect(); + let decompressed_state_diff = + decompress(&compressed_state_diff, &state_reader, *ALIAS_CONTRACT_ADDRESS, alias_keys); + assert_eq!(decompressed_state_diff, state_diff); +} diff --git a/crates/blockifier/src/test_utils.rs b/crates/blockifier/src/test_utils.rs index 95e461807fa..5d2e4a49eb0 100644 --- a/crates/blockifier/src/test_utils.rs +++ b/crates/blockifier/src/test_utils.rs @@ -6,6 +6,7 @@ pub mod l1_handler; pub mod prices; pub mod struct_impls; pub mod syscall; +pub mod test_templates; pub mod transfers_generator; use std::collections::HashMap; use std::fs; @@ -14,13 +15,22 @@ use std::slice::Iter; use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; -use infra_utils::compile_time_cargo_manifest_dir; use starknet_api::abi::abi_utils::{get_fee_token_var_address, selector_from_name}; -use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber, GasPrice, NonzeroGasPrice}; +use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber}; use starknet_api::core::{ClassHash, ContractAddress}; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::hash::StarkHash; use starknet_api::state::StorageKey; +use starknet_api::test_utils::{ + DEFAULT_L1_DATA_GAS_MAX_AMOUNT, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_L2_GAS_MAX_AMOUNT, + DEFAULT_STRK_L1_DATA_GAS_PRICE, + DEFAULT_STRK_L1_GAS_PRICE, + DEFAULT_STRK_L2_GAS_PRICE, + MAX_FEE, + TEST_SEQUENCER_ADDRESS, +}; use starknet_api::transaction::fields::{ Calldata, ContractAddressSalt, @@ -29,6 +39,7 @@ use starknet_api::transaction::fields::{ }; use starknet_api::transaction::TransactionVersion; use starknet_api::{contract_address, felt}; +use starknet_infra_utils::compile_time_cargo_manifest_dir; use starknet_types_core::felt::Felt; use strum::EnumCount; use strum_macros::EnumCount as EnumCountMacro; @@ -44,13 +55,6 @@ use crate::test_utils::contracts::FeatureContract; use crate::transaction::transaction_types::TransactionType; use crate::utils::{const_max, u64_from_usize}; use crate::versioned_constants::VersionedConstants; -// TODO(Dori, 1/2/2024): Remove these constants once all tests use the `contracts` and -// `initial_test_state` modules for testing. -// Addresses. -pub const TEST_SEQUENCER_ADDRESS: &str = "0x1000"; -pub const TEST_ERC20_CONTRACT_ADDRESS: &str = "0x1001"; -pub const TEST_ERC20_CONTRACT_ADDRESS2: &str = "0x1002"; - // Class hashes. // TODO(Adi, 15/01/2023): Remove and compute the class hash corresponding to the ERC20 contract in // starkgate once we use the real ERC20 contract. @@ -115,6 +119,15 @@ pub enum CompilerBasedVersion { OldCairo1, } +impl From for CairoVersion { + fn from(compiler_based_version: CompilerBasedVersion) -> Self { + match compiler_based_version { + CompilerBasedVersion::CairoVersion(version) => version, + CompilerBasedVersion::OldCairo1 => CairoVersion::Cairo1(RunnableCairo1::Casm), + } + } +} + impl CompilerBasedVersion { pub fn get_test_contract(&self) -> FeatureContract { match self { @@ -151,29 +164,6 @@ pub fn test_erc20_sequencer_balance_key() -> StorageKey { get_fee_token_var_address(contract_address!(TEST_SEQUENCER_ADDRESS)) } -// The max_fee / resource bounds used for txs in this test. -// V3 transactions: -pub const DEFAULT_L1_GAS_AMOUNT: GasAmount = GasAmount(u64::pow(10, 6)); -pub const DEFAULT_L1_DATA_GAS_MAX_AMOUNT: GasAmount = GasAmount(u64::pow(10, 6)); -pub const DEFAULT_L2_GAS_MAX_AMOUNT: GasAmount = GasAmount(u64::pow(10, 9)); -pub const MAX_L1_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L1_GAS_PRICE; -pub const MAX_L2_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L2_GAS_PRICE; -pub const MAX_L1_DATA_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L1_DATA_GAS_PRICE; - -pub const DEFAULT_ETH_L1_GAS_PRICE: NonzeroGasPrice = - NonzeroGasPrice::new_unchecked(GasPrice(100 * u128::pow(10, 9))); // Given in units of Wei. -pub const DEFAULT_STRK_L1_GAS_PRICE: NonzeroGasPrice = - NonzeroGasPrice::new_unchecked(GasPrice(100 * u128::pow(10, 9))); // Given in units of Fri. -pub const DEFAULT_ETH_L1_DATA_GAS_PRICE: NonzeroGasPrice = - NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 6))); // Given in units of Wei. -pub const DEFAULT_STRK_L1_DATA_GAS_PRICE: NonzeroGasPrice = - NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 9))); // Given in units of Fri. -pub const DEFAULT_STRK_L2_GAS_PRICE: NonzeroGasPrice = - NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 9))); - -// Deprecated transactions: -pub const MAX_FEE: Fee = DEFAULT_L1_GAS_AMOUNT.nonzero_saturating_mul(DEFAULT_ETH_L1_GAS_PRICE); - // Commitment fee bounds. const DEFAULT_L1_BOUNDS_COMMITTED_FEE: Fee = DEFAULT_L1_GAS_AMOUNT.nonzero_saturating_mul(DEFAULT_STRK_L1_GAS_PRICE); @@ -190,14 +180,6 @@ pub const BALANCE: Fee = Fee(10 MAX_FEE.0, )); -// The block number of the BlockContext being used for testing. -pub const CURRENT_BLOCK_NUMBER: u64 = 2001; -pub const CURRENT_BLOCK_NUMBER_FOR_VALIDATE: u64 = 2000; - -// The block timestamp of the BlockContext being used for testing. -pub const CURRENT_BLOCK_TIMESTAMP: u64 = 1072023; -pub const CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE: u64 = 1069200; - #[derive(Default)] pub struct SaltManager { next_salt: u8, @@ -419,7 +401,8 @@ pub fn calldata_for_deploy_test( } /// Creates the calldata for the "__execute__" entry point in the featured contracts -/// AccountWithLongValidate and AccountWithoutValidations. The format of the returned calldata is: +/// ([`FeatureContract`]) AccountWithLongValidate and AccountWithoutValidations. The format of the +/// returned calldata is: /// [ /// contract_address, /// entry_point_name, @@ -448,7 +431,10 @@ pub fn create_calldata( ) } -/// Calldata for a trivial entry point in the test contract. +/// Calldata for a trivial entry point in the [`FeatureContract`] TestContract. The calldata is +/// formatted for using the featured contracts AccountWithLongValidate or AccountWithoutValidations +/// as account contract. +/// The contract_address is the address of the called contract, an instance address of TestContract. pub fn create_trivial_calldata(test_contract_address: ContractAddress) -> Calldata { create_calldata( test_contract_address, diff --git a/crates/blockifier/src/test_utils/cairo_compile.rs b/crates/blockifier/src/test_utils/cairo_compile.rs index 5563f8bb1ef..aee94a9cd71 100644 --- a/crates/blockifier/src/test_utils/cairo_compile.rs +++ b/crates/blockifier/src/test_utils/cairo_compile.rs @@ -4,8 +4,8 @@ use std::process::{Command, Output}; use std::{env, fs}; use cached::proc_macro::cached; -use infra_utils::compile_time_cargo_manifest_dir; use serde::{Deserialize, Serialize}; +use starknet_infra_utils::compile_time_cargo_manifest_dir; use tempfile::NamedTempFile; use crate::test_utils::contracts::TagAndToolchain; diff --git a/crates/blockifier/src/test_utils/contracts.rs b/crates/blockifier/src/test_utils/contracts.rs index e4128f7b84d..6bec15ea0f1 100644 --- a/crates/blockifier/src/test_utils/contracts.rs +++ b/crates/blockifier/src/test_utils/contracts.rs @@ -5,7 +5,7 @@ use cairo_lang_starknet_classes::contract_class::ContractClass as CairoLangContr use itertools::Itertools; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::abi::constants::CONSTRUCTOR_ENTRY_POINT_NAME; -use starknet_api::contract_class::{ContractClass, EntryPointType}; +use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion}; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, EntryPointSelector}; use starknet_api::deprecated_contract_class::{ ContractClass as DeprecatedContractClass, @@ -80,6 +80,7 @@ const ERC20_CAIRO0_CONTRACT_SOURCE_PATH: &str = const ERC20_CAIRO0_CONTRACT_PATH: &str = "./ERC20/ERC20_Cairo0/ERC20_without_some_syscalls/ERC20/\ erc20_contract_without_some_syscalls_compiled.json"; const ERC20_CAIRO1_CONTRACT_SOURCE_PATH: &str = "./ERC20/ERC20_Cairo1/ERC20.cairo"; +const ERC20_SIERRA_CONTRACT_PATH: &str = "./ERC20/ERC20_Cairo1/erc20.sierra.json"; const ERC20_CAIRO1_CONTRACT_PATH: &str = "./ERC20/ERC20_Cairo1/erc20.casm.json"; // The following contracts are compiled with a fixed version of the compiler. This compiler version @@ -168,9 +169,10 @@ impl FeatureContract { CairoVersion::Cairo0 => { ContractClass::V0(DeprecatedContractClass::from_file(&self.get_compiled_path())) } - CairoVersion::Cairo1(RunnableCairo1::Casm) => { - ContractClass::V1(CasmContractClass::from_file(&self.get_compiled_path())) - } + CairoVersion::Cairo1(RunnableCairo1::Casm) => ContractClass::V1(( + CasmContractClass::from_file(&self.get_compiled_path()), + self.get_sierra_version(), + )), #[cfg(feature = "cairo_native")] CairoVersion::Cairo1(RunnableCairo1::Native) => { panic!("Native contracts are not supported by this function.") @@ -204,6 +206,10 @@ impl FeatureContract { SierraContractClass::from(cairo_contract_class) } + pub fn get_sierra_version(&self) -> SierraVersion { + SierraVersion::extract_from_program(&self.get_sierra().sierra_program).unwrap() + } + pub fn get_raw_class(&self) -> String { get_raw_contract_class(&self.get_compiled_path()) } @@ -290,8 +296,12 @@ impl FeatureContract { pub fn get_sierra_path(&self) -> String { assert_ne!(self.cairo_version(), CairoVersion::Cairo0); - // TODO (Meshi 01/01/2025): add a spacial case for ERC20 when ERC20 sierra is supported. - assert!(!matches!(self, &Self::ERC20(CairoVersion::Cairo1(_)))); + // This is not the compiled Sierra file of the existing ERC20 contract, + // but a file that was taken from the compiler repo of another ERC20 contract. + if matches!(self, &Self::ERC20(CairoVersion::Cairo1(_))) { + return ERC20_SIERRA_CONTRACT_PATH.to_string(); + } + format!( "{CAIRO1_FEATURE_CONTRACTS_DIR}/{SIERRA_CONTRACTS_SUBDIR}/{}.sierra.json", self.get_non_erc20_base_name() diff --git a/crates/blockifier/src/test_utils/l1_handler.rs b/crates/blockifier/src/test_utils/l1_handler.rs index a57d08b8b6a..20116839d64 100644 --- a/crates/blockifier/src/test_utils/l1_handler.rs +++ b/crates/blockifier/src/test_utils/l1_handler.rs @@ -4,7 +4,6 @@ use starknet_api::core::ContractAddress; use starknet_api::executable_transaction::L1HandlerTransaction; use starknet_api::test_utils::l1_handler::{executable_l1_handler_tx, L1HandlerTxArgs}; use starknet_api::transaction::fields::Fee; -use starknet_api::transaction::TransactionVersion; use starknet_types_core::felt::Felt; pub fn l1handler_tx(l1_fee: Fee, contract_address: ContractAddress) -> L1HandlerTransaction { @@ -15,7 +14,6 @@ pub fn l1handler_tx(l1_fee: Fee, contract_address: ContractAddress) -> L1Handler ]; executable_l1_handler_tx(L1HandlerTxArgs { - version: TransactionVersion::ZERO, contract_address, entry_point_selector: selector_from_name("l1_handler_set_value"), calldata, diff --git a/crates/blockifier/src/test_utils/prices.rs b/crates/blockifier/src/test_utils/prices.rs index 0184474f69a..91a6325b026 100644 --- a/crates/blockifier/src/test_utils/prices.rs +++ b/crates/blockifier/src/test_utils/prices.rs @@ -5,13 +5,18 @@ use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use starknet_api::abi::abi_utils::{get_fee_token_var_address, selector_from_name}; use starknet_api::block::FeeType; use starknet_api::core::ContractAddress; +use starknet_api::execution_resources::GasAmount; use starknet_api::test_utils::invoke::InvokeTxArgs; use starknet_api::transaction::constants; use starknet_api::{calldata, felt}; use crate::context::BlockContext; use crate::execution::common_hints::ExecutionMode; -use crate::execution::entry_point::{CallEntryPoint, EntryPointExecutionContext}; +use crate::execution::entry_point::{ + CallEntryPoint, + EntryPointExecutionContext, + SierraGasRevertTracker, +}; use crate::state::state_api::State; use crate::test_utils::initial_test_state::test_state; use crate::test_utils::BALANCE; @@ -77,10 +82,11 @@ fn fee_transfer_resources( ), ExecutionMode::Execute, false, + // No need to limit gas in fee transfer. + SierraGasRevertTracker::new(GasAmount::MAX), ), &mut remaining_gas, ) .unwrap() - .charged_resources - .vm_resources + .resources } diff --git a/crates/blockifier/src/test_utils/struct_impls.rs b/crates/blockifier/src/test_utils/struct_impls.rs index 242a1ad91fb..763060bdfb2 100644 --- a/crates/blockifier/src/test_utils/struct_impls.rs +++ b/crates/blockifier/src/test_utils/struct_impls.rs @@ -10,18 +10,15 @@ use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContract #[cfg(feature = "cairo_native")] use cairo_native::executor::AotContractExecutor; use serde_json::Value; -use starknet_api::block::{BlockInfo, BlockNumber, BlockTimestamp, NonzeroGasPrice}; +use starknet_api::block::BlockInfo; use starknet_api::contract_address; +#[cfg(feature = "cairo_native")] +use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ChainId, ClassHash}; use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; +use starknet_api::execution_resources::GasAmount; +use starknet_api::test_utils::{TEST_ERC20_CONTRACT_ADDRESS, TEST_ERC20_CONTRACT_ADDRESS2}; -use super::{ - update_json_value, - TEST_ERC20_CONTRACT_ADDRESS, - TEST_ERC20_CONTRACT_ADDRESS2, - TEST_SEQUENCER_ADDRESS, -}; -use crate::blockifier::block::validated_gas_prices; use crate::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; use crate::context::{BlockContext, ChainInfo, FeeTokenAddresses, TransactionContext}; use crate::execution::call_info::{CallExecution, CallInfo, Retdata}; @@ -32,19 +29,12 @@ use crate::execution::entry_point::{ CallEntryPoint, EntryPointExecutionContext, EntryPointExecutionResult, + SierraGasRevertTracker, }; #[cfg(feature = "cairo_native")] use crate::execution::native::contract_class::NativeCompiledClassV1; use crate::state::state_api::State; -use crate::test_utils::{ - get_raw_contract_class, - CURRENT_BLOCK_NUMBER, - CURRENT_BLOCK_TIMESTAMP, - DEFAULT_ETH_L1_DATA_GAS_PRICE, - DEFAULT_ETH_L1_GAS_PRICE, - DEFAULT_STRK_L1_DATA_GAS_PRICE, - DEFAULT_STRK_L1_GAS_PRICE, -}; +use crate::test_utils::{get_raw_contract_class, update_json_value}; use crate::transaction::objects::{ CurrentTransactionInfo, DeprecatedTransactionInfo, @@ -84,6 +74,7 @@ impl CallEntryPoint { Arc::new(tx_context), execution_mode, limit_steps_by_resources, + SierraGasRevertTracker::new(GasAmount(self.initial_gas)), ); let mut remaining_gas = self.initial_gas; self.execute(state, &mut context, &mut remaining_gas) @@ -146,42 +137,6 @@ impl ChainInfo { } } -pub trait BlockInfoExt { - fn create_for_testing() -> Self; - fn create_for_testing_with_kzg(use_kzg_da: bool) -> Self; -} - -impl BlockInfoExt for BlockInfo { - fn create_for_testing() -> Self { - Self { - block_number: BlockNumber(CURRENT_BLOCK_NUMBER), - block_timestamp: BlockTimestamp(CURRENT_BLOCK_TIMESTAMP), - sequencer_address: contract_address!(TEST_SEQUENCER_ADDRESS), - gas_prices: validated_gas_prices( - DEFAULT_ETH_L1_GAS_PRICE, - DEFAULT_STRK_L1_GAS_PRICE, - DEFAULT_ETH_L1_DATA_GAS_PRICE, - DEFAULT_STRK_L1_DATA_GAS_PRICE, - NonzeroGasPrice::new( - VersionedConstants::latest_constants() - .convert_l1_to_l2_gas_price_round_up(DEFAULT_ETH_L1_GAS_PRICE.into()), - ) - .unwrap(), - NonzeroGasPrice::new( - VersionedConstants::latest_constants() - .convert_l1_to_l2_gas_price_round_up(DEFAULT_STRK_L1_GAS_PRICE.into()), - ) - .unwrap(), - ), - use_kzg_da: false, - } - } - - fn create_for_testing_with_kzg(use_kzg_da: bool) -> Self { - Self { use_kzg_da, ..Self::create_for_testing() } - } -} - impl BlockContext { pub fn create_for_testing() -> Self { Self { @@ -262,6 +217,16 @@ impl NativeCompiledClassV1 { .extract_sierra_program() .expect("Cannot extract sierra program from sierra contract class"); + let sierra_version_values = sierra_contract_class + .sierra_program + .iter() + .take(3) + .map(|x| x.value.clone()) + .collect::>(); + + let sierra_version = SierraVersion::extract_from_program(&sierra_version_values) + .expect("Cannot extract sierra version from sierra program"); + let executor = AotContractExecutor::new( &sierra_program, &sierra_contract_class.entry_points_by_type, @@ -273,7 +238,7 @@ impl NativeCompiledClassV1 { let casm_contract_class = CasmContractClass::from_contract_class(sierra_contract_class, false, usize::MAX) .expect("Cannot compile sierra contract class into casm contract class"); - let casm = CompiledClassV1::try_from(casm_contract_class) + let casm = CompiledClassV1::try_from((casm_contract_class, sierra_version)) .expect("Cannot get CompiledClassV1 from CasmContractClass"); NativeCompiledClassV1::new(executor.into(), casm) diff --git a/crates/blockifier/src/test_utils/test_templates.rs b/crates/blockifier/src/test_utils/test_templates.rs new file mode 100644 index 00000000000..65f23fc78ca --- /dev/null +++ b/crates/blockifier/src/test_utils/test_templates.rs @@ -0,0 +1,71 @@ +use rstest::rstest; +use rstest_reuse::{apply, template}; + +#[cfg(test)] +use crate::test_utils::{CairoVersion, RunnableCairo1}; +#[cfg(not(feature = "cairo_native"))] +#[template] +#[rstest] +fn cairo_version( + #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] + cairo_version: CairoVersion, +) { +} + +#[cfg(feature = "cairo_native")] +#[template] +#[rstest] +fn cairo_version( + #[values( + CairoVersion::Cairo0, + CairoVersion::Cairo1(RunnableCairo1::Casm), + CairoVersion::Cairo1(RunnableCairo1::Native) + )] + cairo_version: CairoVersion, +) { +} + +#[cfg(not(feature = "cairo_native"))] +#[template] +#[rstest] +fn two_cairo_versions( + #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] + cairo_version1: CairoVersion, + #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] + cairo_version2: CairoVersion, +) { +} + +#[cfg(feature = "cairo_native")] +#[template] +#[rstest] +fn two_cairo_versions( + #[values( + CairoVersion::Cairo0, + CairoVersion::Cairo1(RunnableCairo1::Casm), + CairoVersion::Cairo1(RunnableCairo1::Native) + )] + cairo_version1: CairoVersion, + #[values( + CairoVersion::Cairo0, + CairoVersion::Cairo1(RunnableCairo1::Casm), + CairoVersion::Cairo1(RunnableCairo1::Native) + )] + cairo_version2: CairoVersion, +) { +} + +// When creating a function using a template, every function name is slightly different to avoid +// having multiple functions with the same name in the same scope. This means that the fact that we +// do not use the template in the file it's in makes the compiler think it is an unused macro. +// To avoid this we created a dummy test that uses the template. + +#[apply(cairo_version)] +fn test_cairo_version(cairo_version: CairoVersion) { + println!("test {:?}", cairo_version); +} + +#[apply(two_cairo_versions)] +fn test_two_cairo_version(cairo_version1: CairoVersion, cairo_version2: CairoVersion) { + println!("test {:?} {:?}", cairo_version1, cairo_version2); +} diff --git a/crates/blockifier/src/test_utils/transfers_generator.rs b/crates/blockifier/src/test_utils/transfers_generator.rs index 954caa75d0e..6286d5d573a 100644 --- a/crates/blockifier/src/test_utils/transfers_generator.rs +++ b/crates/blockifier/src/test_utils/transfers_generator.rs @@ -12,7 +12,7 @@ use starknet_api::{calldata, felt, invoke_tx_args}; use starknet_types_core::felt::Felt; use crate::blockifier::config::{ConcurrencyConfig, TransactionExecutorConfig}; -use crate::blockifier::transaction_executor::TransactionExecutor; +use crate::blockifier::transaction_executor::{TransactionExecutor, DEFAULT_STACK_SIZE}; use crate::context::{BlockContext, ChainInfo}; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::dict_state_reader::DictStateReader; @@ -37,6 +37,7 @@ pub struct TransfersGeneratorConfig { pub tx_version: TransactionVersion, pub recipient_generator_type: RecipientGeneratorType, pub concurrency_config: ConcurrencyConfig, + pub stack_size: usize, } impl Default for TransfersGeneratorConfig { @@ -51,6 +52,7 @@ impl Default for TransfersGeneratorConfig { tx_version: TRANSACTION_VERSION, recipient_generator_type: RECIPIENT_GENERATOR_TYPE, concurrency_config: ConcurrencyConfig::create_for_testing(false), + stack_size: DEFAULT_STACK_SIZE, } } } @@ -79,8 +81,10 @@ impl TransfersGenerator { let chain_info = block_context.chain_info().clone(); let state = test_state(&chain_info, config.balance, &[(account_contract, config.n_accounts)]); - let executor_config = - TransactionExecutorConfig { concurrency_config: config.concurrency_config.clone() }; + let executor_config = TransactionExecutorConfig { + concurrency_config: config.concurrency_config.clone(), + stack_size: config.stack_size, + }; let executor = TransactionExecutor::new(state, block_context, executor_config); let account_addresses = (0..config.n_accounts) .map(|instance_id| account_contract.get_instance_address(instance_id)) diff --git a/crates/blockifier/src/transaction/account_transaction.rs b/crates/blockifier/src/transaction/account_transaction.rs index 4261c41066c..fcc673c2789 100644 --- a/crates/blockifier/src/transaction/account_transaction.rs +++ b/crates/blockifier/src/transaction/account_transaction.rs @@ -7,6 +7,7 @@ use starknet_api::contract_class::EntryPointType; use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, Nonce}; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::executable_transaction::AccountTransaction as Transaction; +use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::Resource::{L1DataGas, L1Gas, L2Gas}; use starknet_api::transaction::fields::{ AccountDeploymentData, @@ -23,8 +24,14 @@ use starknet_types_core::felt::Felt; use crate::context::{BlockContext, GasCounter, TransactionContext}; use crate::execution::call_info::CallInfo; +use crate::execution::common_hints::ExecutionMode; use crate::execution::contract_class::RunnableCompiledClass; -use crate::execution::entry_point::{CallEntryPoint, CallType, EntryPointExecutionContext}; +use crate::execution::entry_point::{ + CallEntryPoint, + CallType, + EntryPointExecutionContext, + SierraGasRevertTracker, +}; use crate::execution::stack_trace::{ extract_trailing_cairo1_revert_trace, gen_tx_execution_error_trace, @@ -35,6 +42,7 @@ use crate::fee::fee_utils::{ get_fee_by_gas_vector, get_sequencer_balance_keys, verify_can_pay_committed_bounds, + GasVectorToL1GasForFee, }; use crate::fee::gas_usage::estimate_minimal_gas_vector; use crate::fee::receipt::TransactionReceipt; @@ -260,7 +268,6 @@ impl AccountTransaction { &self, tx_context: &TransactionContext, ) -> TransactionPreValidationResult<()> { - // TODO(Aner): seprate to cases based on context.resource_bounds type let minimal_gas_amount_vector = estimate_minimal_gas_vector( &tx_context.block_context, self, @@ -275,7 +282,10 @@ impl AccountTransaction { ValidResourceBounds::L1Gas(l1_gas_resource_bounds) => vec![( L1Gas, l1_gas_resource_bounds, - minimal_gas_amount_vector.to_discounted_l1_gas(tx_context.get_gas_prices()), + minimal_gas_amount_vector.to_l1_gas_for_fee( + tx_context.get_gas_prices(), + &tx_context.block_context.versioned_constants, + ), block_info.gas_prices.l1_gas_price(fee_type), )], ValidResourceBounds::AllResources(AllResourceBounds { @@ -376,13 +386,12 @@ impl AccountTransaction { ) -> TransactionExecutionResult> { if self.execution_flags.validate { let limit_steps_by_resources = self.execution_flags.charge_fee; - // TODO(Aner): cap the gas for validation. - let remaining_validation_gas = &mut remaining_gas - .limit_usage(tx_context.block_context.versioned_constants.validate_max_sierra_gas); + let remaining_validation_gas = &mut remaining_gas.limit_usage( + tx_context.block_context.versioned_constants.os_constants.validate_max_sierra_gas, + ); Ok(self .validate_tx(state, tx_context, remaining_validation_gas, limit_steps_by_resources)? .inspect(|call_info| { - // TODO(Aner): Update the gas counter. remaining_gas.subtract_used_gas(call_info); })) } else { @@ -468,7 +477,11 @@ impl AccountTransaction { initial_gas: remaining_gas_for_fee_transfer, }; - let mut context = EntryPointExecutionContext::new_invoke(tx_context, true); + let mut context = EntryPointExecutionContext::new_invoke( + tx_context, + true, + SierraGasRevertTracker::new(GasAmount(remaining_gas_for_fee_transfer)), + ); Ok(fee_transfer_call .execute(state, &mut context, &mut remaining_gas_for_fee_transfer) @@ -513,7 +526,6 @@ impl AccountTransaction { context: &mut EntryPointExecutionContext, remaining_gas: &mut GasCounter, ) -> TransactionExecutionResult> { - // TODO(Aner): cap the gas usage for execution. let remaining_execution_gas = &mut remaining_gas.limit_usage(context.mode_sierra_gas_limit()); Ok(match &self.tx { @@ -524,7 +536,6 @@ impl AccountTransaction { Transaction::Invoke(tx) => tx.run_execute(state, context, remaining_execution_gas), }? .inspect(|call_info| { - // TODO(Aner): Update the gas counter. remaining_gas.subtract_used_gas(call_info); })) } @@ -539,22 +550,44 @@ impl AccountTransaction { let execute_call_info: Option; if matches!(&self.tx, Transaction::DeployAccount(_)) { // Handle `DeployAccount` transactions separately, due to different order of things. - // Also, the execution context required form the `DeployAccount` execute phase is + // Also, the execution context required for the `DeployAccount` execute phase is // validation context. let mut execution_context = EntryPointExecutionContext::new_validate( tx_context.clone(), self.execution_flags.charge_fee, + // TODO: Reduce code dup (the gas usage limit is computed in run_execute). + // We initialize the revert gas tracker here for completeness - the value will not + // be used, as this tx is non-revertible. + SierraGasRevertTracker::new(GasAmount( + remaining_gas.limit_usage( + tx_context + .block_context + .versioned_constants + .sierra_gas_limit(&ExecutionMode::Validate), + ), + )), ); execute_call_info = self.run_execute(state, &mut execution_context, remaining_gas)?; validate_call_info = self.handle_validate_tx(state, tx_context.clone(), remaining_gas)?; } else { + validate_call_info = + self.handle_validate_tx(state, tx_context.clone(), remaining_gas)?; let mut execution_context = EntryPointExecutionContext::new_invoke( tx_context.clone(), self.execution_flags.charge_fee, + // TODO: Reduce code dup (the gas usage limit is computed in run_execute). + // We initialize the revert gas tracker here for completeness - the value will not + // be used, as this tx is non-revertible. + SierraGasRevertTracker::new(GasAmount( + remaining_gas.limit_usage( + tx_context + .block_context + .versioned_constants + .sierra_gas_limit(&ExecutionMode::Execute), + ), + )), ); - validate_call_info = - self.handle_validate_tx(state, tx_context.clone(), remaining_gas)?; execute_call_info = self.run_execute(state, &mut execution_context, remaining_gas)?; } @@ -567,6 +600,7 @@ impl AccountTransaction { &tx_context.block_context.versioned_constants, ), 0, + GasAmount(0), ); let post_execution_report = PostExecutionReport::new( @@ -591,14 +625,23 @@ impl AccountTransaction { tx_context: Arc, remaining_gas: &mut GasCounter, ) -> TransactionExecutionResult { - let mut execution_context = EntryPointExecutionContext::new_invoke( - tx_context.clone(), - self.execution_flags.charge_fee, - ); // Run the validation, and if execution later fails, only keep the validation diff. let validate_call_info = self.handle_validate_tx(state, tx_context.clone(), remaining_gas)?; + let mut execution_context = EntryPointExecutionContext::new_invoke( + tx_context.clone(), + self.execution_flags.charge_fee, + // TODO: Reduce code dup (the gas usage limit is computed in run_execute). + SierraGasRevertTracker::new(GasAmount( + remaining_gas.limit_usage( + tx_context + .block_context + .versioned_constants + .sierra_gas_limit(&ExecutionMode::Execute), + ), + )), + ); let n_allotted_execution_steps = execution_context.subtract_validation_and_overhead_steps( &validate_call_info, &self.tx_type(), @@ -617,7 +660,6 @@ impl AccountTransaction { self.run_execute(&mut execution_state, &mut execution_context, remaining_gas); // Pre-compute cost in case of revert. - // TODO(tzahi): add reverted_l2_gas to the receipt. let execution_steps_consumed = n_allotted_execution_steps - execution_context.n_remaining_steps(); // Get the receipt only in case of revert. @@ -631,6 +673,7 @@ impl AccountTransaction { &tx_context.block_context.versioned_constants, ), execution_steps_consumed, + execution_context.sierra_gas_revert_tracker.get_gas_consumed(), ) }; @@ -653,6 +696,7 @@ impl AccountTransaction { &tx_context.block_context.versioned_constants, ), 0, + GasAmount(0), ); // Post-execution checks. let post_execution_report = PostExecutionReport::new( @@ -842,8 +886,11 @@ impl ValidatableTransaction for AccountTransaction { remaining_gas: &mut u64, limit_steps_by_resources: bool, ) -> TransactionExecutionResult> { - let mut context = - EntryPointExecutionContext::new_validate(tx_context, limit_steps_by_resources); + let mut context = EntryPointExecutionContext::new_validate( + tx_context, + limit_steps_by_resources, + SierraGasRevertTracker::new(GasAmount(*remaining_gas)), + ); let tx_info = &context.tx_context.tx_info; if tx_info.is_v0() { return Ok(None); diff --git a/crates/blockifier/src/transaction/account_transactions_test.rs b/crates/blockifier/src/transaction/account_transactions_test.rs index 2deb9e53abe..20d94f9fbe4 100644 --- a/crates/blockifier/src/transaction/account_transactions_test.rs +++ b/crates/blockifier/src/transaction/account_transactions_test.rs @@ -6,6 +6,7 @@ use cairo_vm::vm::runners::cairo_runner::ResourceTracker; use num_traits::Inv; use pretty_assertions::{assert_eq, assert_ne}; use rstest::rstest; +use rstest_reuse::apply; use starknet_api::abi::abi_utils::{ get_fee_token_var_address, get_storage_var_address, @@ -23,7 +24,15 @@ use starknet_api::state::StorageKey; use starknet_api::test_utils::declare::executable_declare_tx; use starknet_api::test_utils::deploy_account::executable_deploy_account_tx; use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs}; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{ + NonceManager, + DEFAULT_L1_DATA_GAS_MAX_AMOUNT, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_L2_GAS_MAX_AMOUNT, + DEFAULT_STRK_L1_GAS_PRICE, + DEFAULT_STRK_L2_GAS_PRICE, + MAX_FEE, +}; use starknet_api::transaction::constants::TRANSFER_ENTRY_POINT_NAME; use starknet_api::transaction::fields::{ AllResourceBounds, @@ -58,15 +67,20 @@ use crate::check_tx_execution_error_for_invalid_scenario; use crate::context::{BlockContext, TransactionContext}; use crate::execution::call_info::CallInfo; use crate::execution::contract_class::TrackedResource; -use crate::execution::entry_point::EntryPointExecutionContext; +use crate::execution::entry_point::{EntryPointExecutionContext, SierraGasRevertTracker}; use crate::execution::syscalls::SyscallSelector; -use crate::fee::fee_utils::{get_fee_by_gas_vector, get_sequencer_balance_keys}; +use crate::fee::fee_utils::{ + get_fee_by_gas_vector, + get_sequencer_balance_keys, + GasVectorToL1GasForFee, +}; use crate::fee::gas_usage::estimate_minimal_gas_vector; use crate::state::cached_state::{StateChangesCount, StateChangesCountForFee, TransactionalState}; use crate::state::state_api::{State, StateReader}; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::initial_test_state::{fund_account, test_state}; use crate::test_utils::syscall::build_recurse_calldata; +use crate::test_utils::test_templates::cairo_version; use crate::test_utils::{ create_calldata, create_trivial_calldata, @@ -76,12 +90,6 @@ use crate::test_utils::{ CompilerBasedVersion, RunnableCairo1, BALANCE, - DEFAULT_L1_DATA_GAS_MAX_AMOUNT, - DEFAULT_L1_GAS_AMOUNT, - DEFAULT_L2_GAS_MAX_AMOUNT, - DEFAULT_STRK_L1_GAS_PRICE, - DEFAULT_STRK_L2_GAS_PRICE, - MAX_FEE, }; use crate::transaction::account_transaction::{ AccountTransaction, @@ -113,27 +121,24 @@ use crate::utils::u64_from_usize; #[rstest] fn test_circuit(block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds) { - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1), (account, 1)]); - let test_contract_address = test_contract.get_instance_address(0); - let account_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data( + &block_context.chain_info, + CairoVersion::Cairo1(RunnableCairo1::Casm), + ); // Invoke a function that changes the state and reverts. let tx_args = invoke_tx_args! { sender_address: account_address, calldata: create_calldata( - test_contract_address, + contract_address, "test_circuit", &[] ), nonce: nonce_manager.next(account_address) }; let tx_execution_info = run_invoke_tx( - state, + &mut state, &block_context, invoke_tx_args! { resource_bounds: default_all_resource_bounds, @@ -149,27 +154,24 @@ fn test_circuit(block_context: BlockContext, default_all_resource_bounds: ValidR #[case::vm(default_l1_resource_bounds())] #[case::gas(default_all_resource_bounds())] fn test_rc96_holes(block_context: BlockContext, #[case] resource_bounds: ValidResourceBounds) { - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1), (account, 1)]); - let test_contract_address = test_contract.get_instance_address(0); - let account_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data( + &block_context.chain_info, + CairoVersion::Cairo1(RunnableCairo1::Casm), + ); // Invoke a function that changes the state and reverts. let tx_args = invoke_tx_args! { sender_address: account_address, calldata: create_calldata( - test_contract_address, + contract_address, "test_rc96_holes", &[] ), nonce: nonce_manager.next(account_address) }; let tx_execution_info = run_invoke_tx( - state, + &mut state, &block_context, invoke_tx_args! { resource_bounds: resource_bounds, @@ -439,26 +441,23 @@ fn test_infinite_recursion( } } -/// Tests that validation fails on insufficient steps if max fee is too low. +/// Tests that validation fails on out-of-gas if L2 gas bound is too low. #[rstest] -#[case::v1(TransactionVersion::ONE, default_l1_resource_bounds())] -#[case::v3_l1_bounds_only(TransactionVersion::THREE, default_l1_resource_bounds())] -#[case::v3_all_bounds(TransactionVersion::THREE, default_all_resource_bounds())] fn test_max_fee_limit_validate( mut block_context: BlockContext, - #[case] version: TransactionVersion, - #[case] resource_bounds: ValidResourceBounds, + default_all_resource_bounds: ValidResourceBounds, #[values(true, false)] use_kzg_da: bool, ) { + let resource_bounds = default_all_resource_bounds; block_context.block_info.use_kzg_da = use_kzg_da; - let chain_info = &block_context.chain_info; + let chain_info = block_context.chain_info.clone(); let gas_computation_mode = resource_bounds.get_gas_vector_computation_mode(); let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = - create_test_init_data(chain_info, CairoVersion::Cairo1(RunnableCairo1::Casm)); + create_test_init_data(&chain_info, CairoVersion::Cairo1(RunnableCairo1::Casm)); let grindy_validate_account = FeatureContract::AccountWithLongValidate(CairoVersion::Cairo1(RunnableCairo1::Casm)); let grindy_class_hash = grindy_validate_account.get_class_hash(); - let block_info = &block_context.block_info; + let block_info = block_context.block_info.clone(); let class_info = calculate_class_info_for_testing(grindy_validate_account.get_class()); // Declare the grindy-validation account. @@ -476,15 +475,19 @@ fn test_max_fee_limit_validate( // Deploy grindy account with a lot of grind in the constructor. // Expect this to fail without bumping nonce, so pass a temporary nonce manager. - // We want to test the block step bounds here - so set them to something low. + // We want to test the block step / gas bounds here - so set them to something low. let old_validate_max_n_steps = block_context.versioned_constants.validate_max_n_steps; block_context.versioned_constants.validate_max_n_steps = 1000; + let old_validate_max_gas = + block_context.versioned_constants.os_constants.validate_max_sierra_gas; + block_context.set_sierra_gas_limits(None, Some(GasAmount(100000))); + let mut ctor_grind_arg = felt!(1_u8); // Grind in deploy phase. let ctor_storage_arg = felt!(1_u8); // Not relevant for this test. let (deploy_account_tx, _) = deploy_and_fund_account( &mut state, &mut NonceManager::default(), - chain_info, + &chain_info, deploy_account_tx_args! { class_hash: grindy_class_hash, resource_bounds, @@ -493,15 +496,16 @@ fn test_max_fee_limit_validate( ); let error_trace = deploy_account_tx.execute(&mut state, &block_context).unwrap_err().to_string(); - assert!(error_trace.contains("no remaining steps")); + assert!(error_trace.contains("Out of gas")); block_context.versioned_constants.validate_max_n_steps = old_validate_max_n_steps; + block_context.set_sierra_gas_limits(None, Some(old_validate_max_gas)); // Deploy grindy account successfully this time. ctor_grind_arg = felt!(0_u8); // Do not grind in deploy phase. let (deploy_account_tx, grindy_account_address) = deploy_and_fund_account( &mut state, &mut nonce_manager, - chain_info, + &chain_info, deploy_account_tx_args! { class_hash: grindy_class_hash, resource_bounds, @@ -519,7 +523,7 @@ fn test_max_fee_limit_validate( let tx_args = invoke_tx_args! { sender_address: grindy_account_address, calldata: create_calldata(contract_address, "return_result", &[1000_u32.into()]), - version, + version: TransactionVersion::THREE, nonce: nonce_manager.next(grindy_account_address) }; @@ -532,7 +536,7 @@ fn test_max_fee_limit_validate( let estimated_min_gas_usage_vector = estimate_minimal_gas_vector(&block_context, &account_tx, &gas_computation_mode); let estimated_min_fee = - get_fee_by_gas_vector(block_info, estimated_min_gas_usage_vector, &account_tx.fee_type()); + get_fee_by_gas_vector(&block_info, estimated_min_gas_usage_vector, &account_tx.fee_type()); // Make sure the resource bounds are the limiting factor by blowing up the block bounds. let old_validate_max_n_steps = block_context.versioned_constants.validate_max_n_steps; @@ -553,7 +557,9 @@ fn test_max_fee_limit_validate( }; let gas_prices = tx_context.get_gas_prices(); l1_resource_bounds( - estimated_min_gas_usage_vector.to_discounted_l1_gas(gas_prices), + estimated_min_gas_usage_vector.to_l1_gas_for_fee( + gas_prices, &tx_context.block_context.versioned_constants + ), gas_prices.l1_gas_price.into(), ) } @@ -578,13 +584,12 @@ fn test_max_fee_limit_validate( assert!(error_trace.contains("no remaining steps") | error_trace.contains("Out of gas")) } -#[rstest] +#[apply(cairo_version)] #[case::v1(TransactionVersion::ONE, default_all_resource_bounds())] #[case::l1_bounds(TransactionVersion::THREE, default_l1_resource_bounds())] #[case::all_bounds(TransactionVersion::THREE, default_all_resource_bounds())] fn test_recursion_depth_exceeded( #[case] tx_version: TransactionVersion, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] cairo_version: CairoVersion, block_context: BlockContext, max_fee: Fee, @@ -667,25 +672,20 @@ fn test_revert_invoke( #[case] transaction_version: TransactionVersion, #[case] fee_type: FeeType, ) { - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let account = FeatureContract::AccountWithoutValidations(CairoVersion::Cairo0); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1), (account, 1)]); - let test_contract_address = test_contract.get_instance_address(0); - let account_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data(&block_context.chain_info, CairoVersion::Cairo0); // Invoke a function that changes the state and reverts. let storage_key = felt!(9_u8); let tx_execution_info = run_invoke_tx( - state, + &mut state, &block_context, invoke_tx_args! { max_fee, resource_bounds: all_resource_bounds, sender_address: account_address, calldata: create_calldata( - test_contract_address, + contract_address, "write_and_revert", // Write some non-zero value. &[storage_key, felt!(99_u8)] @@ -705,7 +705,10 @@ fn test_revert_invoke( // Check that the nonce was increased and the fee was deducted. assert_eq!( state - .get_fee_token_balance(account_address, chain_info.fee_token_address(&fee_type)) + .get_fee_token_balance( + account_address, + block_context.chain_info.fee_token_address(&fee_type) + ) .unwrap(), (felt!(BALANCE.0 - tx_execution_info.receipt.fee.0), felt!(0_u8)) ); @@ -717,9 +720,7 @@ fn test_revert_invoke( // Check that execution state changes were reverted. assert_eq!( felt!(0_u8), - state - .get_storage_at(test_contract_address, StorageKey::try_from(storage_key).unwrap()) - .unwrap() + state.get_storage_at(contract_address, StorageKey::try_from(storage_key).unwrap()).unwrap() ); } @@ -837,19 +838,24 @@ fn recursive_function_calldata( #[case::v1(TransactionVersion::ONE, default_all_resource_bounds())] #[case::l1_bounds(TransactionVersion::THREE, default_l1_resource_bounds())] #[case::all_bounds(TransactionVersion::THREE, default_all_resource_bounds())] -fn test_reverted_reach_steps_limit( +fn test_reverted_reach_computation_limit( max_fee: Fee, mut block_context: BlockContext, #[case] version: TransactionVersion, #[case] resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[values( + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo0), + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)) + )] + cairo_version: CompilerBasedVersion, ) { let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = - create_test_init_data(&block_context.chain_info, cairo_version); + create_test_init_data(&block_context.chain_info, cairo_version.into()); + let tracked_resource = cairo_version.own_tracked_resource(); - // Limit the number of execution steps (so we quickly hit the limit). + // Limit the max amount of computation units (so we quickly hit the limit). block_context.versioned_constants.invoke_tx_max_n_steps = 6000; + block_context.set_sierra_gas_limits(Some(GasAmount(600000)), None); let recursion_base_args = invoke_tx_args! { max_fee, resource_bounds, @@ -868,8 +874,8 @@ fn test_reverted_reach_steps_limit( }, ) .unwrap(); - let n_steps_0 = result.receipt.resources.computation.total_charged_steps(); - let gas_0 = result.receipt.resources.computation.sierra_gas; + let n_units_0 = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_0 = result.receipt.fee.0; // Ensure the transaction was not reverted. @@ -886,35 +892,33 @@ fn test_reverted_reach_steps_limit( }, ) .unwrap(); - let n_steps_1 = result.receipt.resources.computation.total_charged_steps(); - let gas_1 = result.receipt.resources.computation.sierra_gas; + let n_units_1 = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_1 = result.receipt.fee.0; // Ensure the transaction was not reverted. assert!(!result.is_reverted()); - // Make sure that the n_steps and actual_fee are higher as the recursion depth increases. - let tracked_resource = result.validate_call_info.unwrap().tracked_resource; - match cairo_version { - CairoVersion::Cairo0 => { - assert_eq!(tracked_resource, TrackedResource::CairoSteps); - assert!(n_steps_1 > n_steps_0); - } - CairoVersion::Cairo1(_) => { - assert_eq!(tracked_resource, TrackedResource::SierraGas); - assert!(gas_1 > gas_0); - // TODO(Tzahi): adjust the steps in the test to gas for the SierraGas run (after a - // validate run gas limit is introduced to the code). - return; - } - } + // Make sure that the n_units and actual_fee are higher as the recursion depth increases. + let validate_tracked_resource = result.validate_call_info.unwrap().tracked_resource; + assert_eq!(tracked_resource, validate_tracked_resource); + assert!(n_units_1 > n_units_0); assert!(actual_fee_1 > actual_fee_0); // Calculate a recursion depth where the transaction will surely fail (not a minimal depth, as // base costs are neglected here). - let steps_diff = n_steps_1 - n_steps_0; + let units_diff = n_units_1 - n_units_0; // TODO(Ori, 1/2/2024): Write an indicative expect message explaining why the conversion works. - let steps_diff_as_u32: u32 = steps_diff.try_into().expect("Failed to convert usize to u32."); - let fail_depth = block_context.versioned_constants.invoke_tx_max_n_steps / steps_diff_as_u32; + let units_diff_as_u32: u32 = units_diff.try_into().expect("Failed to convert usize to u32."); + let fail_depth = match tracked_resource { + TrackedResource::CairoSteps => { + block_context.versioned_constants.invoke_tx_max_n_steps / units_diff_as_u32 + } + TrackedResource::SierraGas => { + u32::try_from(block_context.versioned_constants.os_constants.execute_max_sierra_gas.0) + .unwrap() + / units_diff_as_u32 + } + }; // Invoke the `recurse` function with `fail_depth` iterations. This call should fail. let result = run_invoke_tx( @@ -927,16 +931,19 @@ fn test_reverted_reach_steps_limit( }, ) .unwrap(); - let n_steps_fail = result.receipt.resources.computation.total_charged_steps(); + let n_units_fail = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_fail: u128 = result.receipt.fee.0; // Ensure the transaction was reverted. assert!(result.is_reverted()); - // Make sure that the failed transaction gets charged for the extra steps taken, compared with + // Make sure that the failed transaction gets charged for the extra computation, compared with // the smaller valid transaction. - // If this fail, try to increase the `invoke_tx_max_n_steps` above. - assert!(n_steps_fail > n_steps_1); + // If this assert fails, it may be due to the max computation limit being too low - i.e. this + // new failure cannot run long enough to consume more computation units than the "1" case. + // If this is the issue, try to increase the max computation limit on the block context above. + assert!(n_units_fail > n_units_1); assert!(actual_fee_fail > actual_fee_1); // Invoke the `recurse` function with `fail_depth`+1 iterations. This call should fail. @@ -950,33 +957,38 @@ fn test_reverted_reach_steps_limit( }, ) .unwrap(); - let n_steps_fail_next = result.receipt.resources.computation.total_charged_steps(); + let n_units_fail_next = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_fail_next: u128 = result.receipt.fee.0; // Ensure the transaction was reverted. assert!(result.is_reverted()); // Test that the two reverted transactions behave the same. - assert!(n_steps_fail == n_steps_fail_next); - assert!(actual_fee_fail == actual_fee_fail_next); + assert_eq!(n_units_fail, n_units_fail_next); + assert_eq!(actual_fee_fail, actual_fee_fail_next); } #[rstest] -/// Tests that n_steps and actual_fees of reverted transactions invocations are consistent. -/// In this test reverted transactions are recursive function invocations where the innermost call -/// asserts false. We test deltas between consecutive depths, and further depths. -fn test_n_reverted_steps( +/// Tests that n_steps / n_reverted_gas and actual_fees of reverted transactions invocations are +/// consistent. In this test reverted transactions are recursive function invocations where the +/// innermost call asserts false. We test deltas between consecutive depths, and further depths. +fn test_n_reverted_computation_units( block_context: BlockContext, #[values(default_l1_resource_bounds(), default_all_resource_bounds())] resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[values( + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo0), + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)) + )] + cairo_version: CompilerBasedVersion, ) { let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = - create_test_init_data(&block_context.chain_info, cairo_version); + create_test_init_data(&block_context.chain_info, cairo_version.into()); let recursion_base_args = invoke_tx_args! { resource_bounds, sender_address: account_address, }; + let tracked_resource = cairo_version.own_tracked_resource(); // Invoke the `recursive_fail` function with 0 iterations. This call should fail. let result = run_invoke_tx( @@ -992,7 +1004,8 @@ fn test_n_reverted_steps( // Ensure the transaction was reverted. assert!(result.is_reverted()); let mut actual_resources_0 = result.receipt.resources.computation.clone(); - let n_steps_0 = result.receipt.resources.computation.total_charged_steps(); + let n_units_0 = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_0 = result.receipt.fee.0; // Invoke the `recursive_fail` function with 1 iterations. This call should fail. @@ -1009,7 +1022,7 @@ fn test_n_reverted_steps( // Ensure the transaction was reverted. assert!(result.is_reverted()); let actual_resources_1 = result.receipt.resources.computation; - let n_steps_1 = actual_resources_1.total_charged_steps(); + let n_units_1 = actual_resources_1.total_charged_computation_units(tracked_resource); let actual_fee_1 = result.receipt.fee.0; // Invoke the `recursive_fail` function with 2 iterations. This call should fail. @@ -1023,26 +1036,51 @@ fn test_n_reverted_steps( }, ) .unwrap(); - let n_steps_2 = result.receipt.resources.computation.total_charged_steps(); + let n_units_2 = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_2 = result.receipt.fee.0; // Ensure the transaction was reverted. assert!(result.is_reverted()); - // Make sure that n_steps and actual_fee diffs are the same for two consecutive reverted calls. - assert!(n_steps_1 - n_steps_0 == n_steps_2 - n_steps_1); - assert!(actual_fee_1 - actual_fee_0 == actual_fee_2 - actual_fee_1); + // Make sure that n_units and actual_fee diffs are the same for two consecutive reverted calls. + assert_eq!(n_units_1 - n_units_0, n_units_2 - n_units_1); + match (tracked_resource, resource_bounds.get_gas_vector_computation_mode()) { + // If we are tracking sierra gas, but the user signed on L1 gas bounds only, we may have + // rounding differences in the number of L1 gas units the user is charged for. + // This rounding error can result in at most one unit of L1 gas difference, so the final fee + // can differ by at most the L1 gas price. + (TrackedResource::SierraGas, GasVectorComputationMode::NoL2Gas) => { + assert!( + (i128::try_from(actual_fee_1 - actual_fee_0).unwrap() + - i128::try_from(actual_fee_2 - actual_fee_1).unwrap()) + .unsigned_abs() + <= block_context.block_info.gas_prices.l1_gas_price(&FeeType::Strk).get().0 + ); + } + _ => { + assert_eq!(actual_fee_1 - actual_fee_0, actual_fee_2 - actual_fee_1); + } + } // Save the delta between two consecutive calls to be tested against a much larger recursion. - let single_call_steps_delta = n_steps_1 - n_steps_0; + let single_call_units_delta = n_units_1 - n_units_0; let single_call_fee_delta = actual_fee_1 - actual_fee_0; - assert!(single_call_steps_delta > 0); + assert!(single_call_units_delta > 0); assert!(single_call_fee_delta > 0); - // Make sure the resources in block of invocation 0 and 1 are the same, except for the number - // of cairo steps. - actual_resources_0.n_reverted_steps += single_call_steps_delta; - assert_eq!(actual_resources_0, actual_resources_1); - actual_resources_0.vm_resources.n_steps = n_steps_0; + // Make sure the resources in block of invocation 0 and 1 are the same, except for tracked + // resource count. + match tracked_resource { + TrackedResource::CairoSteps => { + actual_resources_0.n_reverted_steps += single_call_units_delta; + assert_eq!(actual_resources_0, actual_resources_1); + } + TrackedResource::SierraGas => { + actual_resources_0.reverted_sierra_gas.0 += + u64::try_from(single_call_units_delta).unwrap(); + assert_eq!(actual_resources_0, actual_resources_1); + } + }; // Invoke the `recursive_fail` function with 100 iterations. This call should fail. let result = run_invoke_tx( @@ -1055,14 +1093,31 @@ fn test_n_reverted_steps( }, ) .unwrap(); - let n_steps_100 = result.receipt.resources.computation.total_charged_steps(); + let n_units_100 = + result.receipt.resources.computation.total_charged_computation_units(tracked_resource); let actual_fee_100 = result.receipt.fee.0; // Ensure the transaction was reverted. assert!(result.is_reverted()); - // Make sure that n_steps and actual_fee grew as expected. - assert!(n_steps_100 - n_steps_0 == 100 * single_call_steps_delta); - assert!(actual_fee_100 - actual_fee_0 == 100 * single_call_fee_delta); + // Make sure that n_units and actual_fee grew as expected. + assert_eq!(n_units_100 - n_units_0, 100 * single_call_units_delta); + // When charging for sierra gas with no L2 gas user bound, due to rounding errors in converting + // L2 gas units to L1 gas, the fee may be a bit off. We may have an error of one L1 gas units + // per recursion, so the fee diff is at most 100 times the price of an L1 gas unit. + match (tracked_resource, resource_bounds.get_gas_vector_computation_mode()) { + (TrackedResource::SierraGas, GasVectorComputationMode::NoL2Gas) => { + assert!( + (i128::try_from(100 * single_call_fee_delta).unwrap() + - i128::try_from(actual_fee_100 - actual_fee_0).unwrap()) + .unsigned_abs() + < 100 + * block_context.block_info.gas_prices.l1_gas_price(&FeeType::Strk).get().0 + ); + } + _ => { + assert_eq!(actual_fee_100 - actual_fee_0, 100 * single_call_fee_delta); + } + } } #[rstest] @@ -1070,7 +1125,11 @@ fn test_max_fee_computation_from_tx_bounds(block_context: BlockContext) { macro_rules! assert_max_steps_as_expected { ($account_tx:expr, $expected_max_steps:expr $(,)?) => { let tx_context = Arc::new(block_context.to_tx_context(&$account_tx)); - let execution_context = EntryPointExecutionContext::new_invoke(tx_context, true); + let execution_context = EntryPointExecutionContext::new_invoke( + tx_context, + true, + SierraGasRevertTracker::new(GasAmount::MAX), + ); let max_steps = execution_context.vm_run_resources.get_n_steps().unwrap(); assert_eq!(u64::try_from(max_steps).unwrap(), $expected_max_steps); }; @@ -1158,7 +1217,11 @@ fn test_max_fee_to_max_steps_conversion( nonce: nonce_manager.next(account_address), }); let tx_context1 = Arc::new(block_context.to_tx_context(&account_tx1)); - let execution_context1 = EntryPointExecutionContext::new_invoke(tx_context1, true); + let execution_context1 = EntryPointExecutionContext::new_invoke( + tx_context1, + true, + SierraGasRevertTracker::new(GasAmount::MAX), + ); let max_steps_limit1 = execution_context1.vm_run_resources.get_n_steps(); let tx_execution_info1 = account_tx1.execute(&mut state, &block_context).unwrap(); let n_steps1 = tx_execution_info1.receipt.resources.computation.vm_resources.n_steps; @@ -1179,7 +1242,11 @@ fn test_max_fee_to_max_steps_conversion( nonce: nonce_manager.next(account_address), }); let tx_context2 = Arc::new(block_context.to_tx_context(&account_tx2)); - let execution_context2 = EntryPointExecutionContext::new_invoke(tx_context2, true); + let execution_context2 = EntryPointExecutionContext::new_invoke( + tx_context2, + true, + SierraGasRevertTracker::new(GasAmount::MAX), + ); let max_steps_limit2 = execution_context2.vm_run_resources.get_n_steps(); let tx_execution_info2 = account_tx2.execute(&mut state, &block_context).unwrap(); let n_steps2 = tx_execution_info2.receipt.resources.computation.vm_resources.n_steps; @@ -1293,9 +1360,47 @@ fn test_insufficient_max_fee_reverts( ) .unwrap(); assert!(tx_execution_info3.is_reverted()); + match (cairo_version, resource_used_depth1) { + (CairoVersion::Cairo0, _) => { + assert_eq!(tx_execution_info3.receipt.fee, tx_execution_info1.receipt.fee); + assert!( + tx_execution_info3.revert_error.unwrap().to_string().contains("no remaining steps") + ); + } + (CairoVersion::Cairo1(RunnableCairo1::Casm), ValidResourceBounds::AllResources(_)) => { + // There is no guarantee that out of gas errors result in maximal fee charge (as in - we + // do not always expect the max amount of L2 gas to be charged). Assert final fee is + // within a sane range. + assert!(tx_execution_info3.revert_error.unwrap().to_string().contains("Out of gas")); + assert!(Fee(2 * tx_execution_info3.receipt.fee.0) >= tx_execution_info1.receipt.fee); + assert!(tx_execution_info3.receipt.fee <= Fee(2 * tx_execution_info1.receipt.fee.0)); + } + (CairoVersion::Cairo1(RunnableCairo1::Casm), ValidResourceBounds::L1Gas(l1_bound)) => { + // If a user supplied L1 gas bounds only, sierra gas is not limited in proportion to the + // user bound; so we expect to revert in post-execution only. + assert!( + tx_execution_info3 + .revert_error + .unwrap() + .to_string() + .contains("Insufficient max L1Gas") + ); + assert_eq!( + tx_execution_info3.receipt.fee, + l1_bound + .max_amount + .checked_mul( + block_context.block_info.gas_prices.l1_gas_price(&FeeType::Strk).into() + ) + .unwrap() + ); + } + #[cfg(feature = "cairo_native")] + (CairoVersion::Cairo1(RunnableCairo1::Native), _) => { + panic!("Test not implemented for cairo native.") + } + } assert_eq!(tx_execution_info3.receipt.da_gas, tx_execution_info1.receipt.da_gas); - assert_eq!(tx_execution_info3.receipt.fee, tx_execution_info1.receipt.fee); - assert!(tx_execution_info3.revert_error.unwrap().to_string().contains("no remaining steps")); } #[rstest] @@ -1357,12 +1462,8 @@ fn test_count_actual_storage_changes( let fee_token_address = chain_info.fee_token_address(&fee_type); // Create initial state - let test_contract = FeatureContract::TestContract(cairo_version); - let account_contract = FeatureContract::AccountWithoutValidations(cairo_version); - let mut state = test_state(chain_info, BALANCE, &[(account_contract, 1), (test_contract, 1)]); - let account_address = account_contract.get_instance_address(0); - let contract_address = test_contract.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data(&block_context.chain_info, cairo_version); let sequencer_address = block_context.block_info.sequencer_address; let initial_sequencer_balance = @@ -1435,7 +1536,7 @@ fn test_count_actual_storage_changes( n_allocated_keys: 2, }; - assert_eq!(expected_modified_contracts, state_changes_1.state_maps.get_modified_contracts()); + assert_eq!(expected_modified_contracts, state_changes_1.state_maps.get_contract_addresses()); assert_eq!(expected_storage_updates_1, state_changes_1.state_maps.storage); assert_eq!(state_changes_count_1, expected_state_changes_count_1); @@ -1475,7 +1576,7 @@ fn test_count_actual_storage_changes( n_allocated_keys: 0, }; - assert_eq!(expected_modified_contracts_2, state_changes_2.state_maps.get_modified_contracts()); + assert_eq!(expected_modified_contracts_2, state_changes_2.state_maps.get_contract_addresses()); assert_eq!(expected_storage_updates_2, state_changes_2.state_maps.storage); assert_eq!(state_changes_count_2, expected_state_changes_count_2); @@ -1527,7 +1628,7 @@ fn test_count_actual_storage_changes( assert_eq!( expected_modified_contracts_transfer, - state_changes_transfer.state_maps.get_modified_contracts() + state_changes_transfer.state_maps.get_contract_addresses() ); assert_eq!(expected_storage_update_transfer, state_changes_transfer.state_maps.storage); assert_eq!(state_changes_count_3, expected_state_changes_count_3); @@ -1537,6 +1638,7 @@ fn test_count_actual_storage_changes( #[case::tx_version_1(TransactionVersion::ONE)] #[case::tx_version_3(TransactionVersion::THREE)] fn test_concurrency_execute_fee_transfer( + block_context: BlockContext, max_fee: Fee, default_all_resource_bounds: ValidResourceBounds, #[case] version: TransactionVersion, @@ -1546,27 +1648,24 @@ fn test_concurrency_execute_fee_transfer( const TRANSFER_AMOUNT: u128 = 100; const SEQUENCER_BALANCE_LOW_INITIAL: u128 = 50; - let block_context = BlockContext::create_for_account_testing(); - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(account, 1), (test_contract, 1)]); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(chain_info, CairoVersion::Cairo1(RunnableCairo1::Casm)); let (sequencer_balance_key_low, sequencer_balance_key_high) = get_sequencer_balance_keys(&block_context); let account_tx = invoke_tx_with_default_flags(invoke_tx_args! { - sender_address: account.get_instance_address(0), + sender_address: account_address, max_fee, - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + calldata: create_trivial_calldata(contract_address), resource_bounds: default_all_resource_bounds, version }); let fee_type = &account_tx.fee_type(); - let fee_token_address = block_context.chain_info.fee_token_address(fee_type); + let fee_token_address = chain_info.fee_token_address(fee_type); - // Case 1: The transaction did not read form/ write to the sequenser balance before executing + // Case 1: The transaction did not read from/ write to the sequencer balance before executing // fee transfer. - let mut transactional_state = TransactionalState::create_transactional(state); + let mut transactional_state = TransactionalState::create_transactional(&mut state); let concurrency_mode = true; let result = account_tx.execute_raw(&mut transactional_state, &block_context, concurrency_mode).unwrap(); @@ -1581,7 +1680,7 @@ fn test_concurrency_execute_fee_transfer( } } - // Case 2: The transaction read from and write to the sequenser balance before executing fee + // Case 2: The transaction read from and write to the sequencer balance before executing fee // transfer. let transfer_calldata = create_calldata( @@ -1597,11 +1696,11 @@ fn test_concurrency_execute_fee_transfer( Fee(SEQUENCER_BALANCE_LOW_INITIAL), &mut state.state, ); - let mut transactional_state = TransactionalState::create_transactional(state); + let mut transactional_state = TransactionalState::create_transactional(&mut state); // Invokes transfer to the sequencer. let account_tx = invoke_tx_with_default_flags(invoke_tx_args! { - sender_address: account.get_instance_address(0), + sender_address: account_address, calldata: transfer_calldata, max_fee, resource_bounds: default_all_resource_bounds, @@ -1615,7 +1714,7 @@ fn test_concurrency_execute_fee_transfer( let storage_writes = transactional_state.cache.borrow().writes.storage.clone(); let storage_initial_reads = transactional_state.cache.borrow().initial_reads.storage.clone(); - for (seq_write_val, expexted_write_val) in [ + for (seq_write_val, expected_write_val) in [ ( storage_writes.get(&(fee_token_address, sequencer_balance_key_low)), // Balance after `execute` and without the fee transfer. @@ -1628,7 +1727,7 @@ fn test_concurrency_execute_fee_transfer( (storage_writes.get(&(fee_token_address, sequencer_balance_key_high)), Felt::ZERO), (storage_initial_reads.get(&(fee_token_address, sequencer_balance_key_high)), Felt::ZERO), ] { - assert_eq!(*seq_write_val.unwrap(), expexted_write_val); + assert_eq!(*seq_write_val.unwrap(), expected_write_val); } } @@ -1637,32 +1736,29 @@ fn test_concurrency_execute_fee_transfer( #[case::tx_version_1(TransactionVersion::ONE)] #[case::tx_version_3(TransactionVersion::THREE)] fn test_concurrent_fee_transfer_when_sender_is_sequencer( + mut block_context: BlockContext, max_fee: Fee, default_all_resource_bounds: ValidResourceBounds, #[case] version: TransactionVersion, ) { - let mut block_context = BlockContext::create_for_account_testing(); - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let account_address = account.get_instance_address(0_u16); + let chain_info = &block_context.chain_info; + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(chain_info, CairoVersion::Cairo1(RunnableCairo1::Casm)); block_context.block_info.sequencer_address = account_address; - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); let sender_balance = BALANCE; - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, sender_balance, &[(account, 1), (test_contract, 1)]); let (sequencer_balance_key_low, sequencer_balance_key_high) = get_sequencer_balance_keys(&block_context); let account_tx = invoke_tx_with_default_flags(invoke_tx_args! { max_fee, sender_address: account_address, - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + calldata: create_trivial_calldata(contract_address), resource_bounds: default_all_resource_bounds, version }); let fee_type = &account_tx.fee_type(); - let fee_token_address = block_context.chain_info.fee_token_address(fee_type); + let fee_token_address = chain_info.fee_token_address(fee_type); - let mut transactional_state = TransactionalState::create_transactional(state); + let mut transactional_state = TransactionalState::create_transactional(&mut state); let concurrency_mode = true; let result = account_tx.execute_raw(&mut transactional_state, &block_context, concurrency_mode).unwrap(); @@ -1678,18 +1774,23 @@ fn test_concurrent_fee_transfer_when_sender_is_sequencer( /// Check initial gas is as expected according to the contract cairo+compiler version, and call /// history. #[rstest] -#[case(&[ +#[case::cairo0(&[ CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)), CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)), CompilerBasedVersion::CairoVersion(CairoVersion::Cairo0), CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)) ])] -// TODO(Tzahi, 1/12/2024): Add a case with OldCairo1 instead of Cairo0. +#[case::old_cairo1(&[ + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)), + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)), + CompilerBasedVersion::OldCairo1, + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo1(RunnableCairo1::Casm)) +])] fn test_initial_gas( + block_context: BlockContext, #[case] versions: &[CompilerBasedVersion], default_all_resource_bounds: ValidResourceBounds, ) { - let block_context = BlockContext::create_for_account_testing(); let account_version = CairoVersion::Cairo1(RunnableCairo1::Casm); let account = FeatureContract::AccountWithoutValidations(account_version); let account_address = account.get_instance_address(0_u16); @@ -1716,7 +1817,10 @@ fn test_initial_gas( let validate_call_info = &transaction_ex_info.validate_call_info.unwrap(); let validate_initial_gas = validate_call_info.call.initial_gas; - assert_eq!(validate_initial_gas, block_context.versioned_constants.validate_max_sierra_gas.0); + assert_eq!( + validate_initial_gas, + block_context.versioned_constants.os_constants.validate_max_sierra_gas.0 + ); let validate_gas_consumed = validate_call_info.execution.gas_consumed; assert!(validate_gas_consumed > 0, "New Cairo1 contract should consume gas."); @@ -1726,9 +1830,11 @@ fn test_initial_gas( // minus the gas consumed by validate. Need to add 1 as the check is strictly less than. let mut prev_initial_gas = block_context .versioned_constants + .os_constants .execute_max_sierra_gas .min(user_gas_bound - GasAmount(validate_gas_consumed) + GasAmount(1)) .0; + let mut curr_initial_gas; let mut started_vm_mode = false; // The __validate__ call of a the account contract. @@ -1738,7 +1844,12 @@ fn test_initial_gas( curr_initial_gas = execute_call_info.call.initial_gas; match (prev_version, version, started_vm_mode) { - (CompilerBasedVersion::CairoVersion(CairoVersion::Cairo0), _, _) => { + ( + CompilerBasedVersion::CairoVersion(CairoVersion::Cairo0) + | CompilerBasedVersion::OldCairo1, + _, + _, + ) => { assert_eq!(started_vm_mode, true); assert_eq!(curr_initial_gas, prev_initial_gas); } @@ -1755,12 +1866,12 @@ fn test_initial_gas( ); assert_eq!( curr_initial_gas, - block_context.versioned_constants.inifite_gas_for_vm_mode() + block_context.versioned_constants.infinite_gas_for_vm_mode() ); started_vm_mode = true; } _ => { - // prev_version is a non Cairo0 contract, thus it consumes gas from the initial + // prev_version is a non CairoStep contract, thus it consumes gas from the initial // gas. assert!(curr_initial_gas < prev_initial_gas); if version @@ -1789,12 +1900,10 @@ fn test_revert_in_execute( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, ) { - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(account, 1)]); - let account_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, mut nonce_manager, .. } = create_test_init_data( + &block_context.chain_info, + CairoVersion::Cairo1(RunnableCairo1::Casm), + ); // Invoke a function that changes the state and reverts. let tx_args = invoke_tx_args! { @@ -1811,7 +1920,7 @@ fn test_revert_in_execute( }); let execution_flags = AccountExecutionFlags { validate, ..AccountExecutionFlags::default() }; let account_tx = AccountTransaction { tx, execution_flags }; - let tx_execution_info = account_tx.execute(state, &block_context).unwrap(); + let tx_execution_info = account_tx.execute(&mut state, &block_context).unwrap(); assert!(tx_execution_info.is_reverted()); assert!( @@ -1835,40 +1944,32 @@ fn test_call_contract_that_panics( ) { // Override enable reverts. block_context.versioned_constants.enable_reverts = enable_reverts; - let test_contract = FeatureContract::TestContract(cairo_version); - // TODO(Yoni): use `class_version` here once the feature contract fully supports Native. - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1), (account, 1)]); - let test_contract_address = test_contract.get_instance_address(0); - let account_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data(&block_context.chain_info, cairo_version); - let new_class_hash = test_contract.get_class_hash(); + let new_class_hash = FeatureContract::TestContract(cairo_version).get_class_hash(); + let to_panic = true.into(); let calldata = [ - *FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)) - .get_instance_address(0) - .0 - .key(), + *contract_address.0.key(), selector_from_name(inner_selector).0, - felt!(1_u8), + felt!(2_u8), new_class_hash.0, + to_panic, ]; // Invoke a function that changes the state and reverts. let tx_args = invoke_tx_args! { sender_address: account_address, calldata: create_calldata( - test_contract_address, + contract_address, "test_call_contract_revert", &calldata ), nonce: nonce_manager.next(account_address) }; let tx_execution_info = run_invoke_tx( - state, + &mut state, &block_context, invoke_tx_args! { resource_bounds: default_all_resource_bounds, diff --git a/crates/blockifier/src/transaction/execution_flavors_test.rs b/crates/blockifier/src/transaction/execution_flavors_test.rs index e13abc1a1df..fecc882b325 100644 --- a/crates/blockifier/src/transaction/execution_flavors_test.rs +++ b/crates/blockifier/src/transaction/execution_flavors_test.rs @@ -5,7 +5,12 @@ use starknet_api::block::FeeType; use starknet_api::core::ContractAddress; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs}; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{ + NonceManager, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_STRK_L1_GAS_PRICE, + MAX_FEE, +}; use starknet_api::transaction::fields::{ Calldata, Fee, @@ -33,9 +38,6 @@ use crate::test_utils::{ get_tx_resources, CairoVersion, BALANCE, - DEFAULT_L1_GAS_AMOUNT, - DEFAULT_STRK_L1_GAS_PRICE, - MAX_FEE, }; use crate::transaction::account_transaction::{AccountTransaction, ExecutionFlags}; use crate::transaction::errors::{ diff --git a/crates/blockifier/src/transaction/objects_test.rs b/crates/blockifier/src/transaction/objects_test.rs index 29ef00aed66..ef38ea85253 100644 --- a/crates/blockifier/src/transaction/objects_test.rs +++ b/crates/blockifier/src/transaction/objects_test.rs @@ -22,7 +22,7 @@ use crate::versioned_constants::VersionedConstants; #[derive(Debug, Default)] pub struct TestExecutionSummary { - pub gas_for_fee: GasAmount, + pub gas_consumed: GasAmount, pub num_of_events: usize, pub num_of_messages: usize, pub class_hash: ClassHash, @@ -32,7 +32,7 @@ pub struct TestExecutionSummary { impl TestExecutionSummary { pub fn new( - gas_for_fee: u64, + gas_consumed: u64, num_of_events: usize, num_of_messages: usize, class_hash: ClassHash, @@ -40,7 +40,7 @@ impl TestExecutionSummary { storage_key: &str, ) -> Self { TestExecutionSummary { - gas_for_fee: GasAmount(gas_for_fee), + gas_consumed: GasAmount(gas_consumed), num_of_events, num_of_messages, class_hash, @@ -67,10 +67,7 @@ impl TestExecutionSummary { }, }) .collect(), - ..Default::default() - }, - charged_resources: ChargedResources { - gas_for_fee: self.gas_for_fee, + gas_consumed: self.gas_consumed.0, ..Default::default() }, accessed_storage_keys: vec![self.storage_key].into_iter().collect(), @@ -201,9 +198,9 @@ fn test_summarize( let expected_summary = ExecutionSummary { charged_resources: ChargedResources { - gas_for_fee: validate_params.gas_for_fee - + execute_params.gas_for_fee - + fee_transfer_params.gas_for_fee, + gas_consumed: validate_params.gas_consumed + + execute_params.gas_consumed + + fee_transfer_params.gas_consumed, ..Default::default() }, executed_class_hashes: vec![ diff --git a/crates/blockifier/src/transaction/post_execution_test.rs b/crates/blockifier/src/transaction/post_execution_test.rs index fe1a880e5e6..028444862a2 100644 --- a/crates/blockifier/src/transaction/post_execution_test.rs +++ b/crates/blockifier/src/transaction/post_execution_test.rs @@ -4,6 +4,7 @@ use starknet_api::block::FeeType; use starknet_api::core::ContractAddress; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::state::StorageKey; +use starknet_api::test_utils::DEFAULT_STRK_L1_GAS_PRICE; use starknet_api::transaction::fields::{ AllResourceBounds, Calldata, @@ -19,10 +20,11 @@ use starknet_types_core::felt::Felt; use crate::context::{BlockContext, ChainInfo}; use crate::fee::fee_checks::FeeCheckError; +use crate::fee::fee_utils::GasVectorToL1GasForFee; use crate::state::state_api::StateReader; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{create_calldata, CairoVersion, BALANCE, DEFAULT_STRK_L1_GAS_PRICE}; +use crate::test_utils::{create_calldata, CairoVersion, BALANCE}; use crate::transaction::account_transaction::AccountTransaction; use crate::transaction::errors::TransactionExecutionError; use crate::transaction::objects::{HasRelatedFeeType, TransactionInfoCreator}; @@ -309,7 +311,7 @@ fn test_revert_on_resource_overuse( // units for bounds check in post-execution. let tight_resource_bounds = match gas_mode { GasVectorComputationMode::NoL2Gas => l1_resource_bounds( - actual_gas_usage.to_discounted_l1_gas(gas_prices), + actual_gas_usage.to_l1_gas_for_fee(gas_prices, &block_context.versioned_constants), DEFAULT_STRK_L1_GAS_PRICE.into(), ), GasVectorComputationMode::All => { diff --git a/crates/blockifier/src/transaction/test_utils.rs b/crates/blockifier/src/transaction/test_utils.rs index bf3ed8ec25a..c4049ff8c9a 100644 --- a/crates/blockifier/src/transaction/test_utils.rs +++ b/crates/blockifier/src/transaction/test_utils.rs @@ -7,7 +7,16 @@ use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::test_utils::declare::executable_declare_tx; use starknet_api::test_utils::deploy_account::{executable_deploy_account_tx, DeployAccountTxArgs}; use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs}; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{ + NonceManager, + DEFAULT_L1_DATA_GAS_MAX_AMOUNT, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_L2_GAS_MAX_AMOUNT, + DEFAULT_STRK_L1_DATA_GAS_PRICE, + DEFAULT_STRK_L1_GAS_PRICE, + DEFAULT_STRK_L2_GAS_PRICE, + MAX_FEE, +}; use starknet_api::transaction::fields::{ AllResourceBounds, ContractAddressSalt, @@ -28,18 +37,7 @@ use crate::state::state_api::State; use crate::test_utils::contracts::FeatureContract; use crate::test_utils::dict_state_reader::DictStateReader; use crate::test_utils::initial_test_state::test_state; -use crate::test_utils::{ - create_calldata, - CairoVersion, - BALANCE, - DEFAULT_L1_DATA_GAS_MAX_AMOUNT, - DEFAULT_L1_GAS_AMOUNT, - DEFAULT_L2_GAS_MAX_AMOUNT, - DEFAULT_STRK_L1_DATA_GAS_PRICE, - DEFAULT_STRK_L1_GAS_PRICE, - DEFAULT_STRK_L2_GAS_PRICE, - MAX_FEE, -}; +use crate::test_utils::{create_calldata, CairoVersion, BALANCE}; use crate::transaction::account_transaction::{AccountTransaction, ExecutionFlags}; use crate::transaction::objects::{TransactionExecutionInfo, TransactionExecutionResult}; use crate::transaction::transaction_types::TransactionType; diff --git a/crates/blockifier/src/transaction/transaction_execution.rs b/crates/blockifier/src/transaction/transaction_execution.rs index e6bf862ba92..cb503b8b08e 100644 --- a/crates/blockifier/src/transaction/transaction_execution.rs +++ b/crates/blockifier/src/transaction/transaction_execution.rs @@ -9,13 +9,15 @@ use starknet_api::executable_transaction::{ InvokeTransaction, L1HandlerTransaction, }; +use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::fields::Fee; use starknet_api::transaction::{Transaction as StarknetApiTransaction, TransactionHash}; use crate::bouncer::verify_tx_weights_within_max_capacity; use crate::context::BlockContext; use crate::execution::call_info::CallInfo; -use crate::execution::entry_point::EntryPointExecutionContext; +use crate::execution::common_hints::ExecutionMode; +use crate::execution::entry_point::{EntryPointExecutionContext, SierraGasRevertTracker}; use crate::fee::receipt::TransactionReceipt; use crate::state::cached_state::TransactionalState; use crate::state::state_api::UpdatableState; @@ -142,9 +144,14 @@ impl ExecutableTransaction for L1HandlerTransaction { ) -> TransactionExecutionResult { let tx_context = Arc::new(block_context.to_tx_context(self)); let limit_steps_by_resources = false; - let mut context = - EntryPointExecutionContext::new_invoke(tx_context.clone(), limit_steps_by_resources); - let mut remaining_gas = tx_context.initial_sierra_gas().0; + // The Sierra gas limit for L1 handler transaction is set to max_execute_sierra_gas. + let mut remaining_gas = + block_context.versioned_constants.sierra_gas_limit(&ExecutionMode::Execute).0; + let mut context = EntryPointExecutionContext::new_invoke( + tx_context.clone(), + limit_steps_by_resources, + SierraGasRevertTracker::new(GasAmount(remaining_gas)), + ); let execute_call_info = self.run_execute(state, &mut context, &mut remaining_gas)?; let l1_handler_payload_size = self.payload_size(); let TransactionReceipt { diff --git a/crates/blockifier/src/transaction/transactions_test.rs b/crates/blockifier/src/transaction/transactions_test.rs index e6d34651724..f3680db6e65 100644 --- a/crates/blockifier/src/transaction/transactions_test.rs +++ b/crates/blockifier/src/transaction/transactions_test.rs @@ -7,6 +7,7 @@ use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_bigint::BigUint; use pretty_assertions::assert_eq; use rstest::{fixture, rstest}; +use rstest_reuse::apply; use starknet_api::abi::abi_utils::{ get_fee_token_var_address, get_storage_var_address, @@ -22,7 +23,21 @@ use starknet_api::state::StorageKey; use starknet_api::test_utils::declare::executable_declare_tx; use starknet_api::test_utils::deploy_account::{executable_deploy_account_tx, DeployAccountTxArgs}; use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs}; -use starknet_api::test_utils::NonceManager; +use starknet_api::test_utils::{ + NonceManager, + CURRENT_BLOCK_NUMBER, + CURRENT_BLOCK_NUMBER_FOR_VALIDATE, + CURRENT_BLOCK_TIMESTAMP, + CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, + DEFAULT_L1_DATA_GAS_MAX_AMOUNT, + DEFAULT_L1_GAS_AMOUNT, + DEFAULT_L2_GAS_MAX_AMOUNT, + DEFAULT_STRK_L1_DATA_GAS_PRICE, + DEFAULT_STRK_L1_GAS_PRICE, + DEFAULT_STRK_L2_GAS_PRICE, + MAX_FEE, + TEST_SEQUENCER_ADDRESS, +}; use starknet_api::transaction::fields::Resource::{L1DataGas, L1Gas, L2Gas}; use starknet_api::transaction::fields::{ AllResourceBounds, @@ -59,7 +74,6 @@ use crate::context::{BlockContext, ChainInfo, FeeTokenAddresses, TransactionCont use crate::execution::call_info::{ CallExecution, CallInfo, - ChargedResources, ExecutionSummary, MessageToL1, OrderedEvent, @@ -70,8 +84,10 @@ use crate::execution::contract_class::TrackedResource; use crate::execution::entry_point::{CallEntryPoint, CallType}; use crate::execution::errors::{ConstructorEntryPointExecutionError, EntryPointExecutionError}; use crate::execution::syscalls::hint_processor::EmitEventError; +#[cfg(feature = "cairo_native")] +use crate::execution::syscalls::hint_processor::SyscallExecutionError; use crate::execution::syscalls::SyscallSelector; -use crate::fee::fee_utils::{balance_to_big_uint, get_fee_by_gas_vector}; +use crate::fee::fee_utils::{balance_to_big_uint, get_fee_by_gas_vector, GasVectorToL1GasForFee}; use crate::fee::gas_usage::{ estimate_minimal_gas_vector, get_da_gas_cost, @@ -92,6 +108,7 @@ use crate::test_utils::dict_state_reader::DictStateReader; use crate::test_utils::initial_test_state::{fund_account, test_state}; use crate::test_utils::l1_handler::l1handler_tx; use crate::test_utils::prices::Prices; +use crate::test_utils::test_templates::{cairo_version, two_cairo_versions}; use crate::test_utils::{ create_calldata, create_trivial_calldata, @@ -102,18 +119,6 @@ use crate::test_utils::{ RunnableCairo1, SaltManager, BALANCE, - CURRENT_BLOCK_NUMBER, - CURRENT_BLOCK_NUMBER_FOR_VALIDATE, - CURRENT_BLOCK_TIMESTAMP, - CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE, - DEFAULT_L1_DATA_GAS_MAX_AMOUNT, - DEFAULT_L1_GAS_AMOUNT, - DEFAULT_L2_GAS_MAX_AMOUNT, - DEFAULT_STRK_L1_DATA_GAS_PRICE, - DEFAULT_STRK_L1_GAS_PRICE, - DEFAULT_STRK_L2_GAS_PRICE, - MAX_FEE, - TEST_SEQUENCER_ADDRESS, }; use crate::transaction::account_transaction::{AccountTransaction, ExecutionFlags}; use crate::transaction::errors::{ @@ -133,12 +138,14 @@ use crate::transaction::test_utils::{ create_account_tx_for_validate_test, create_account_tx_for_validate_test_nonce_0, create_gas_amount_bounds_with_default_price, + create_test_init_data, default_all_resource_bounds, default_l1_resource_bounds, invoke_tx_with_default_flags, l1_resource_bounds, versioned_constants, FaultyAccountTxCreatorArgs, + TestInitData, CALL_CONTRACT, GET_BLOCK_HASH, GET_BLOCK_NUMBER, @@ -156,13 +163,14 @@ use crate::{ check_tx_execution_error_for_invalid_scenario, retdata, }; - +const DECLARE_REDEPOSIT_AMOUNT: u64 = 6860; +const DEPLOY_ACCOUNT_REDEPOSIT_AMOUNT: u64 = 6360; static VERSIONED_CONSTANTS: LazyLock = LazyLock::new(VersionedConstants::create_for_testing); #[fixture] -fn inifite_gas_for_vm_mode() -> u64 { - VERSIONED_CONSTANTS.inifite_gas_for_vm_mode() +fn infinite_gas_for_vm_mode() -> u64 { + VERSIONED_CONSTANTS.infinite_gas_for_vm_mode() } #[fixture] @@ -209,11 +217,8 @@ fn expected_validate_call_info( CairoVersion::Cairo1(_) => retdata!(*constants::VALIDATE_RETDATA), }; // Extra range check in regular (invoke) validate call, due to passing the calldata as an array. - let charged_resources = match tracked_resource { - TrackedResource::SierraGas => ChargedResources { - vm_resources: ExecutionResources::default(), - gas_for_fee: GasAmount(gas_consumed), - }, + let vm_resources = match tracked_resource { + TrackedResource::SierraGas => ExecutionResources::default(), TrackedResource::CairoSteps => { let n_range_checks = match cairo_version { CairoVersion::Cairo0 => { @@ -245,7 +250,7 @@ fn expected_validate_call_info( ) => 100_usize, (selector, _) => panic!("Selector {selector} is not a known validate selector."), }; - let resources = ExecutionResources { + ExecutionResources { n_steps, n_memory_holes: 0, builtin_instance_counter: HashMap::from([( @@ -253,18 +258,17 @@ fn expected_validate_call_info( n_range_checks, )]), } - .filter_unused_builtins(); - ChargedResources::from_execution_resources(resources) + .filter_unused_builtins() } }; let initial_gas = match cairo_version { - CairoVersion::Cairo0 => inifite_gas_for_vm_mode(), + CairoVersion::Cairo0 => infinite_gas_for_vm_mode(), CairoVersion::Cairo1(_) => match tracked_resource { TrackedResource::CairoSteps => initial_gas_amount_from_block_context(None).0, TrackedResource::SierraGas => { user_initial_gas .unwrap_or(initial_gas_amount_from_block_context(None)) - .min(VERSIONED_CONSTANTS.validate_max_sierra_gas) + .min(VERSIONED_CONSTANTS.os_constants.validate_max_sierra_gas) .0 } }, @@ -283,7 +287,7 @@ fn expected_validate_call_info( initial_gas, }, // The account contract we use for testing has trivial `validate` functions. - charged_resources, + resources: vm_resources, execution: CallExecution { retdata, gas_consumed, ..Default::default() }, tracked_resource, ..Default::default() @@ -353,9 +357,7 @@ fn expected_fee_transfer_call_info( events: vec![expected_fee_transfer_event], ..Default::default() }, - charged_resources: ChargedResources::from_execution_resources( - Prices::FeeTransfer(account_address, *fee_type).into(), - ), + resources: Prices::FeeTransfer(account_address, *fee_type).into(), // We read sender and recipient balance - Uint256(BALANCE, 0) then Uint256(0, 0). storage_read_values: vec![felt!(BALANCE.0), felt!(0_u8), felt!(0_u8), felt!(0_u8)], accessed_storage_keys: HashSet::from_iter(vec![ @@ -378,7 +380,7 @@ fn get_expected_cairo_resources( versioned_constants.get_additional_os_tx_resources(tx_type, starknet_resources, false); for call_info in call_infos { if let Some(call_info) = &call_info { - expected_cairo_resources += &call_info.charged_resources.vm_resources + expected_cairo_resources += &call_info.resources }; } @@ -446,6 +448,7 @@ fn add_kzg_da_resources_to_resources_mapping( }); } +// TODO: Add a test case that test cairo1 contract that uses VM resources. #[rstest] #[case::with_cairo0_account( ExpectedResultTestInvokeTx{ @@ -460,16 +463,20 @@ fn add_kzg_da_resources_to_resources_mapping( CairoVersion::Cairo0)] #[case::with_cairo1_account( ExpectedResultTestInvokeTx{ - resources: &get_syscall_resources(SyscallSelector::CallContract) + &ExecutionResources { - n_steps: 207, - n_memory_holes: 0, - builtin_instance_counter: HashMap::from([(BuiltinName::range_check, 8)]), - }, - validate_gas_consumed: 4740, // The gas consumption results from parsing the input + resources: ExecutionResources::default(), + validate_gas_consumed: 11690, // The gas consumption results from parsing the input // arguments. - execute_gas_consumed: 112080, + execute_gas_consumed: 111740, }, CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr(feature = "cairo_native", case::with_cairo1_native_account( + ExpectedResultTestInvokeTx{ + resources: ExecutionResources::default(), + validate_gas_consumed: 11690, // The gas consumption results from parsing the input + // arguments. + execute_gas_consumed: 111740, + }, + CairoVersion::Cairo1(RunnableCairo1::Native)))] // TODO(Tzahi): Add calls to cairo1 test contracts (where gas flows to and from the inner call). fn test_invoke_tx( #[values(default_l1_resource_bounds(), default_all_resource_bounds())] @@ -518,7 +525,7 @@ fn test_invoke_tx( let tracked_resource = account_contract .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None); + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None); // Build expected validate call info. let expected_account_class_hash = account_contract.get_class_hash(); @@ -531,7 +538,7 @@ fn test_invoke_tx( sender_address, account_cairo_version, tracked_resource, - Some(initial_gas.min(versioned_constants.validate_max_sierra_gas)), + Some(initial_gas.min(versioned_constants.os_constants.validate_max_sierra_gas)), ); // Build expected execute call info. @@ -539,35 +546,21 @@ fn test_invoke_tx( let expected_validated_call = expected_validate_call_info.as_ref().unwrap().call.clone(); let expected_initial_execution_gas = versioned_constants + .os_constants .execute_max_sierra_gas .min(initial_gas - GasAmount(expected_arguments.validate_gas_consumed)) .0; let expected_execute_call = CallEntryPoint { entry_point_selector: selector_from_name(constants::EXECUTE_ENTRY_POINT_NAME), initial_gas: match account_cairo_version { - CairoVersion::Cairo0 => versioned_constants.inifite_gas_for_vm_mode(), + CairoVersion::Cairo0 => versioned_constants.infinite_gas_for_vm_mode(), CairoVersion::Cairo1(_) => expected_initial_execution_gas, }, ..expected_validated_call }; - let expected_inner_call_charged_resources = - ChargedResources::from_execution_resources(ExecutionResources { - n_steps: 23, - n_memory_holes: 0, - ..Default::default() - }); - let (expected_validate_gas_for_fee, expected_execute_gas_for_fee) = match tracked_resource { - TrackedResource::CairoSteps => (GasAmount::default(), GasAmount::default()), - TrackedResource::SierraGas => { - expected_arguments.resources = - expected_inner_call_charged_resources.vm_resources.clone(); - ( - expected_arguments.validate_gas_consumed.into(), - expected_arguments.execute_gas_consumed.into(), - ) - } - }; + let expected_inner_call_vm_resources = + ExecutionResources { n_steps: 23, n_memory_holes: 0, ..Default::default() }; let expected_return_result_call = CallEntryPoint { entry_point_selector: selector_from_name("return_result"), @@ -578,17 +571,26 @@ fn test_invoke_tx( storage_address: test_contract_address, caller_address: sender_address, call_type: CallType::Call, - initial_gas: versioned_constants.inifite_gas_for_vm_mode(), + initial_gas: versioned_constants.infinite_gas_for_vm_mode(), }; let expected_return_result_retdata = Retdata(expected_return_result_calldata); let expected_inner_calls = vec![CallInfo { call: expected_return_result_call, execution: CallExecution::from_retdata(expected_return_result_retdata.clone()), - charged_resources: expected_inner_call_charged_resources, + resources: expected_inner_call_vm_resources.clone(), ..Default::default() }]; - + let (expected_validate_gas_for_fee, expected_execute_gas_for_fee) = match tracked_resource { + TrackedResource::CairoSteps => (GasAmount::default(), GasAmount::default()), + TrackedResource::SierraGas => { + expected_arguments.resources = expected_inner_call_vm_resources; + ( + expected_arguments.validate_gas_consumed.into(), + expected_arguments.execute_gas_consumed.into(), + ) + } + }; let expected_execute_call_info = Some(CallInfo { call: expected_execute_call, execution: CallExecution { @@ -596,10 +598,7 @@ fn test_invoke_tx( gas_consumed: expected_arguments.execute_gas_consumed, ..Default::default() }, - charged_resources: ChargedResources { - vm_resources: expected_arguments.resources, - gas_for_fee: expected_execute_gas_for_fee, - }, + resources: expected_arguments.resources, inner_calls: expected_inner_calls, tracked_resource, ..Default::default() @@ -710,19 +709,20 @@ fn verify_storage_after_invoke_advanced_operations( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_invoke_tx_advanced_operations( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { let block_context = &block_context; - let account = FeatureContract::AccountWithoutValidations(cairo_version); - let test_contract = FeatureContract::TestContract(cairo_version); - let state = - &mut test_state(&block_context.chain_info, BALANCE, &[(account, 1), (test_contract, 1)]); - let account_address = account.get_instance_address(0); - let contract_address = test_contract.get_instance_address(0); + let TestInitData { mut state, account_address, contract_address, mut nonce_manager } = + create_test_init_data(&block_context.chain_info, cairo_version); let index = felt!(123_u32); let base_tx_args = invoke_tx_args! { resource_bounds: default_all_resource_bounds, @@ -730,7 +730,6 @@ fn test_invoke_tx_advanced_operations( }; // Invoke advance_counter function. - let mut nonce_manager = NonceManager::default(); let counter_diffs = [101_u32, 102_u32]; let initial_counters = [felt!(counter_diffs[0]), felt!(counter_diffs[1])]; let calldata_args = vec![index, initial_counters[0], initial_counters[1]]; @@ -741,12 +740,12 @@ fn test_invoke_tx_advanced_operations( create_calldata(contract_address, "advance_counter", &calldata_args), ..base_tx_args.clone() }); - account_tx.execute(state, block_context).unwrap(); + account_tx.execute(&mut state, block_context).unwrap(); let next_nonce = nonce_manager.next(account_address); let initial_ec_point = [Felt::ZERO, Felt::ZERO]; verify_storage_after_invoke_advanced_operations( - state, + &mut state, contract_address, account_address, index, @@ -766,13 +765,13 @@ fn test_invoke_tx_advanced_operations( create_calldata(contract_address, "call_xor_counters", &calldata_args), ..base_tx_args.clone() }); - account_tx.execute(state, block_context).unwrap(); + account_tx.execute(&mut state, block_context).unwrap(); let expected_counters = [felt!(counter_diffs[0] ^ xor_values[0]), felt!(counter_diffs[1] ^ xor_values[1])]; let next_nonce = nonce_manager.next(account_address); verify_storage_after_invoke_advanced_operations( - state, + &mut state, contract_address, account_address, index, @@ -788,7 +787,7 @@ fn test_invoke_tx_advanced_operations( create_calldata(contract_address, "test_ec_op", &[]), ..base_tx_args.clone() }); - account_tx.execute(state, block_context).unwrap(); + account_tx.execute(&mut state, block_context).unwrap(); let expected_ec_point = [ Felt::from_bytes_be(&[ @@ -806,7 +805,7 @@ fn test_invoke_tx_advanced_operations( ]; let next_nonce = nonce_manager.next(account_address); verify_storage_after_invoke_advanced_operations( - state, + &mut state, contract_address, account_address, index, @@ -826,7 +825,7 @@ fn test_invoke_tx_advanced_operations( create_calldata(contract_address, "add_signature_to_counters", &[index]), ..base_tx_args.clone() }); - account_tx.execute(state, block_context).unwrap(); + account_tx.execute(&mut state, block_context).unwrap(); let expected_counters = [ (expected_counters[0] + signature_values[0]), @@ -834,7 +833,7 @@ fn test_invoke_tx_advanced_operations( ]; let next_nonce = nonce_manager.next(account_address); verify_storage_after_invoke_advanced_operations( - state, + &mut state, contract_address, account_address, index, @@ -851,10 +850,10 @@ fn test_invoke_tx_advanced_operations( create_calldata(contract_address, "send_message", &[to_address]), ..base_tx_args }); - let execution_info = account_tx.execute(state, block_context).unwrap(); + let execution_info = account_tx.execute(&mut state, block_context).unwrap(); let next_nonce = nonce_manager.next(account_address); verify_storage_after_invoke_advanced_operations( - state, + &mut state, contract_address, account_address, index, @@ -875,26 +874,21 @@ fn test_invoke_tx_advanced_operations( ); } -#[rstest] +#[apply(cairo_version)] #[case(TransactionVersion::ONE, FeeType::Eth)] #[case(TransactionVersion::THREE, FeeType::Strk)] fn test_state_get_fee_token_balance( block_context: BlockContext, #[case] tx_version: TransactionVersion, #[case] fee_type: FeeType, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_version: CairoVersion, + cairo_version: CairoVersion, ) { - let block_context = &block_context; - let chain_info = &block_context.chain_info; - let account = FeatureContract::AccountWithoutValidations(account_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let state = &mut test_state(chain_info, BALANCE, &[(account, 1), (test_contract, 1)]); - let account_address = account.get_instance_address(0); + let TestInitData { mut state, account_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let (mint_high, mint_low) = (felt!(54_u8), felt!(39_u8)); let recipient_int = 10_u8; let recipient = felt!(recipient_int); - let fee_token_address = chain_info.fee_token_address(&fee_type); + let fee_token_address = block_context.chain_info.fee_token_address(&fee_type); // Give the account mint privileges. state @@ -916,7 +910,7 @@ fn test_state_get_fee_token_balance( version: tx_version, nonce: Nonce::default(), }); - account_tx.execute(state, block_context).unwrap(); + account_tx.execute(&mut state, &block_context).unwrap(); // Get balance from state, and validate. let (low, high) = @@ -974,29 +968,33 @@ fn assert_resource_bounds_exceed_balance_failure( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_estimate_minimal_gas_vector( mut block_context: BlockContext, #[values(true, false)] use_kzg_da: bool, #[values(GasVectorComputationMode::NoL2Gas, GasVectorComputationMode::All)] gas_vector_computation_mode: GasVectorComputationMode, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { block_context.block_info.use_kzg_da = use_kzg_da; - let block_context = &block_context; - let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); + let TestInitData { account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let valid_invoke_tx_args = invoke_tx_args! { - sender_address: account_contract.get_instance_address(0), - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + sender_address: account_address, + calldata: create_trivial_calldata(contract_address), max_fee: MAX_FEE }; // The minimal gas estimate does not depend on tx version. let tx = &invoke_tx_with_default_flags(valid_invoke_tx_args); let minimal_gas_vector = - estimate_minimal_gas_vector(block_context, tx, &gas_vector_computation_mode); + estimate_minimal_gas_vector(&block_context, tx, &gas_vector_computation_mode); let minimal_l1_gas = minimal_gas_vector.l1_gas; let minimal_l2_gas = minimal_gas_vector.l2_gas; let minimal_l1_data_gas = minimal_gas_vector.l1_data_gas; @@ -1011,38 +1009,36 @@ fn test_estimate_minimal_gas_vector( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_max_fee_exceeds_balance( mut block_context: BlockContext, #[values(default_l1_resource_bounds(), default_all_resource_bounds())] resource_bounds: ValidResourceBounds, #[values(true, false)] use_kzg_da: bool, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { block_context.block_info.use_kzg_da = use_kzg_da; - let block_context = &block_context; - let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let state = &mut test_state( - &block_context.chain_info, - BALANCE, - &[(account_contract, 1), (test_contract, 1)], - ); - let sender_address = account_contract.get_instance_address(0); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let default_invoke_args = invoke_tx_args! { - sender_address, - calldata: create_trivial_calldata(test_contract.get_instance_address(0) - )}; + sender_address: account_address, + calldata: create_trivial_calldata(contract_address) + }; // Deploy. let invalid_tx = AccountTransaction::new_with_default_flags(executable_deploy_account_tx( deploy_account_tx_args! { resource_bounds, - class_hash: test_contract.get_class_hash() + class_hash: FeatureContract::TestContract(cairo_version).get_class_hash() }, &mut NonceManager::default(), )); - assert_resource_bounds_exceed_balance_failure(state, block_context, invalid_tx); + assert_resource_bounds_exceed_balance_failure(&mut state, &block_context, invalid_tx); // V1 Invoke. let invalid_max_fee = Fee(BALANCE.0 + 1); @@ -1051,7 +1047,7 @@ fn test_max_fee_exceeds_balance( version: TransactionVersion::ONE, ..default_invoke_args.clone() }); - assert_resource_bounds_exceed_balance_failure(state, block_context, invalid_tx); + assert_resource_bounds_exceed_balance_failure(&mut state, &block_context, invalid_tx); // V3 txs. macro_rules! assert_resource_overdraft { @@ -1061,7 +1057,7 @@ fn test_max_fee_exceeds_balance( resource_bounds: $invalid_resource_bounds, ..default_invoke_args.clone() }); - assert_resource_bounds_exceed_balance_failure(state, block_context, invalid_tx); + assert_resource_bounds_exceed_balance_failure(&mut state, &block_context, invalid_tx); // Declare. let contract_to_declare = FeatureContract::Empty(CairoVersion::Cairo1(RunnableCairo1::Casm)); @@ -1070,12 +1066,12 @@ fn test_max_fee_exceeds_balance( declare_tx_args! { class_hash: contract_to_declare.get_class_hash(), compiled_class_hash: contract_to_declare.get_compiled_class_hash(), - sender_address, + sender_address: account_address, resource_bounds: $invalid_resource_bounds, }, class_info, )); - assert_resource_bounds_exceed_balance_failure(state, block_context, invalid_tx); + assert_resource_bounds_exceed_balance_failure(&mut state, &block_context, invalid_tx); }; } @@ -1122,24 +1118,24 @@ fn test_max_fee_exceeds_balance( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_insufficient_new_resource_bounds_pre_validation( mut block_context: BlockContext, #[values(true, false)] use_kzg_da: bool, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { block_context.block_info.use_kzg_da = use_kzg_da; - let block_context = &block_context; - let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let state = &mut test_state( - &block_context.chain_info, - BALANCE, - &[(account_contract, 1), (test_contract, 1)], - ); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); + let valid_invoke_tx_args = invoke_tx_args! { - sender_address: account_contract.get_instance_address(0), - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + sender_address: account_address, + calldata: create_trivial_calldata(contract_address), max_fee: MAX_FEE }; let tx = &invoke_tx_with_default_flags(valid_invoke_tx_args.clone()); @@ -1152,7 +1148,7 @@ fn test_insufficient_new_resource_bounds_pre_validation( } = block_context.block_info.gas_prices.strk_gas_prices; let minimal_gas_vector = - estimate_minimal_gas_vector(block_context, tx, &GasVectorComputationMode::All); + estimate_minimal_gas_vector(&block_context, tx, &GasVectorComputationMode::All); let default_resource_bounds = AllResourceBounds { l1_gas: ResourceBounds { @@ -1174,7 +1170,7 @@ fn test_insufficient_new_resource_bounds_pre_validation( resource_bounds: ValidResourceBounds::AllResources(default_resource_bounds), ..valid_invoke_tx_args.clone() }) - .execute(state, block_context); + .execute(&mut state, &block_context); let next_nonce = match valid_resources_tx { Ok(_) => 1, @@ -1216,7 +1212,7 @@ fn test_insufficient_new_resource_bounds_pre_validation( nonce: nonce!(next_nonce), ..valid_invoke_tx_args.clone() }); - let execution_error = invalid_v3_tx.execute(state, block_context).unwrap_err(); + let execution_error = invalid_v3_tx.execute(&mut state, &block_context).unwrap_err(); assert_matches!( execution_error, TransactionExecutionError::TransactionPreValidationError( @@ -1242,7 +1238,7 @@ fn test_insufficient_new_resource_bounds_pre_validation( nonce: nonce!(next_nonce), ..valid_invoke_tx_args.clone() }); - let execution_error = invalid_v3_tx.execute(state, block_context).unwrap_err(); + let execution_error = invalid_v3_tx.execute(&mut state, &block_context).unwrap_err(); assert_matches!( execution_error, TransactionExecutionError::TransactionPreValidationError( @@ -1256,29 +1252,28 @@ fn test_insufficient_new_resource_bounds_pre_validation( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_insufficient_deprecated_resource_bounds_pre_validation( block_context: BlockContext, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { - let block_context = &block_context; - let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let state = &mut test_state( - &block_context.chain_info, - BALANCE, - &[(account_contract, 1), (test_contract, 1)], - ); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let valid_invoke_tx_args = invoke_tx_args! { - sender_address: account_contract.get_instance_address(0), - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + sender_address: account_address, + calldata: create_trivial_calldata(contract_address), max_fee: MAX_FEE }; // The minimal gas estimate does not depend on tx version. let tx = &invoke_tx_with_default_flags(valid_invoke_tx_args.clone()); let minimal_l1_gas = - estimate_minimal_gas_vector(block_context, tx, &GasVectorComputationMode::NoL2Gas).l1_gas; + estimate_minimal_gas_vector(&block_context, tx, &GasVectorComputationMode::NoL2Gas).l1_gas; // Test V1 transaction. @@ -1291,7 +1286,7 @@ fn test_insufficient_deprecated_resource_bounds_pre_validation( let invalid_v1_tx = invoke_tx_with_default_flags( invoke_tx_args! { max_fee: invalid_max_fee, version: TransactionVersion::ONE, ..valid_invoke_tx_args.clone() }, ); - let execution_error = invalid_v1_tx.execute(state, block_context).unwrap_err(); + let execution_error = invalid_v1_tx.execute(&mut state, &block_context).unwrap_err(); // Test error. assert_matches!( @@ -1312,7 +1307,7 @@ fn test_insufficient_deprecated_resource_bounds_pre_validation( resource_bounds: l1_resource_bounds(insufficient_max_l1_gas_amount, actual_strk_l1_gas_price.into()), ..valid_invoke_tx_args.clone() }); - let execution_error = invalid_v3_tx.execute(state, block_context).unwrap_err(); + let execution_error = invalid_v3_tx.execute(&mut state, &block_context).unwrap_err(); assert_matches!( execution_error, TransactionExecutionError::TransactionPreValidationError( @@ -1331,7 +1326,7 @@ fn test_insufficient_deprecated_resource_bounds_pre_validation( resource_bounds: l1_resource_bounds(minimal_l1_gas, insufficient_max_l1_gas_price), ..valid_invoke_tx_args.clone() }); - let execution_error = invalid_v3_tx.execute(state, block_context).unwrap_err(); + let execution_error = invalid_v3_tx.execute(&mut state, &block_context).unwrap_err(); assert_matches!( execution_error, TransactionExecutionError::TransactionPreValidationError( @@ -1342,7 +1337,7 @@ fn test_insufficient_deprecated_resource_bounds_pre_validation( ); } -#[rstest] +#[apply(cairo_version)] #[case::l1_bounds(default_l1_resource_bounds(), Resource::L1Gas)] #[case::all_bounds_l1_gas_overdraft(default_all_resource_bounds(), Resource::L1Gas)] #[case::all_bounds_l2_gas_overdraft(default_all_resource_bounds(), Resource::L2Gas)] @@ -1351,9 +1346,9 @@ fn test_actual_fee_gt_resource_bounds( mut block_context: BlockContext, #[case] resource_bounds: ValidResourceBounds, #[case] overdraft_resource: Resource, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + cairo_version: CairoVersion, ) { + let account_cairo_version = cairo_version; let block_context = &mut block_context; block_context.versioned_constants.allocation_cost = AllocationCost::ZERO; block_context.block_info.use_kzg_da = true; @@ -1386,7 +1381,9 @@ fn test_actual_fee_gt_resource_bounds( // Create new gas bounds that are lower than the actual gas. let (expected_fee, overdraft_resource_bounds) = match gas_mode { GasVectorComputationMode::NoL2Gas => { - let l1_gas_bound = GasAmount(actual_gas.to_discounted_l1_gas(gas_prices).0 - 1); + let l1_gas_bound = GasAmount( + actual_gas.to_l1_gas_for_fee(gas_prices, &block_context.versioned_constants).0 - 1, + ); ( GasVector::from_l1_gas(l1_gas_bound).cost(gas_prices), l1_resource_bounds(l1_gas_bound, gas_prices.l1_gas_price.into()), @@ -1425,25 +1422,25 @@ fn test_actual_fee_gt_resource_bounds( } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0)] +#[case::with_cairo1_account(CairoVersion::Cairo1(RunnableCairo1::Casm))] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account(CairoVersion::Cairo1(RunnableCairo1::Native)) +)] fn test_invalid_nonce( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, ) { - let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo0); - let state = &mut test_state( - &block_context.chain_info, - BALANCE, - &[(account_contract, 1), (test_contract, 1)], - ); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let valid_invoke_tx_args = invoke_tx_args! { - sender_address: account_contract.get_instance_address(0), - calldata: create_trivial_calldata(test_contract.get_instance_address(0)), + sender_address: account_address, + calldata: create_trivial_calldata(contract_address), resource_bounds: default_all_resource_bounds, }; - let mut transactional_state = TransactionalState::create_transactional(state); + let mut transactional_state = TransactionalState::create_transactional(&mut state); // Strict, negative flow: account nonce = 0, incoming tx nonce = 1. let invalid_nonce = nonce!(1_u8); @@ -1509,10 +1506,21 @@ fn declare_validate_callinfo( if version == TransactionVersion::ZERO { None } else { + let gas_consumed = match declared_contract_version { + CairoVersion::Cairo0 => 0, + CairoVersion::Cairo1(_) => { + VersionedConstants::create_for_testing() + .os_constants + .gas_costs + .base + .entry_point_initial_budget + - DECLARE_REDEPOSIT_AMOUNT + } + }; expected_validate_call_info( account_class_hash, constants::VALIDATE_DECLARE_ENTRY_POINT_NAME, - 0, + gas_consumed, calldata![declared_class_hash.0], account_address, declared_contract_version, @@ -1549,19 +1557,19 @@ fn declare_expected_state_changes_count(version: TransactionVersion) -> StateCha } } -#[rstest] +#[apply(cairo_version)] #[case(TransactionVersion::ZERO, CairoVersion::Cairo0)] #[case(TransactionVersion::ONE, CairoVersion::Cairo0)] #[case(TransactionVersion::TWO, CairoVersion::Cairo1(RunnableCairo1::Casm))] #[case(TransactionVersion::THREE, CairoVersion::Cairo1(RunnableCairo1::Casm))] fn test_declare_tx( default_all_resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, + cairo_version: CairoVersion, #[case] tx_version: TransactionVersion, #[case] empty_contract_version: CairoVersion, #[values(false, true)] use_kzg_da: bool, ) { + let account_cairo_version = cairo_version; let block_context = &BlockContext::create_for_account_testing_with_kzg(use_kzg_da); let versioned_constants = &block_context.versioned_constants; let empty_contract = FeatureContract::Empty(empty_contract_version); @@ -1615,7 +1623,7 @@ fn test_declare_tx( sender_address, account .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None), + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None), if tx_version >= TransactionVersion::THREE { Some(user_initial_gas_from_bounds(default_all_resource_bounds, Some(block_context))) } else { @@ -1644,10 +1652,28 @@ fn test_declare_tx( &starknet_resources, vec![&expected_validate_call_info], ); + let initial_gas = VersionedConstants::create_for_testing() + .os_constants + .gas_costs + .base + .entry_point_initial_budget; + let expected_gas_consumed = match account_cairo_version { + CairoVersion::Cairo0 => GasAmount(0), + CairoVersion::Cairo1(_) => { + // V0 transactions do not handle fee. + if tx_version == TransactionVersion::ZERO { + GasAmount(0) + } else { + GasAmount(initial_gas - DECLARE_REDEPOSIT_AMOUNT) + } + } + }; + let mut expected_actual_resources = TransactionResources { starknet_resources, computation: ComputationResources { vm_resources: expected_cairo_resources, + sierra_gas: expected_gas_consumed, ..Default::default() }, }; @@ -1723,29 +1749,28 @@ fn test_declare_tx( } #[rstest] -fn test_declare_tx_v0(default_l1_resource_bounds: ValidResourceBounds) { - let tx_version = TransactionVersion::ZERO; - let block_context = &BlockContext::create_for_account_testing(); +fn test_declare_tx_v0( + block_context: BlockContext, + default_l1_resource_bounds: ValidResourceBounds, +) { + let TestInitData { mut state, account_address, mut nonce_manager, .. } = create_test_init_data( + &block_context.chain_info, + CairoVersion::Cairo1(RunnableCairo1::Casm), + ); let empty_contract = FeatureContract::Empty(CairoVersion::Cairo0); - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &block_context.chain_info; - let state = &mut test_state(chain_info, BALANCE, &[(account, 1)]); let class_hash = empty_contract.get_class_hash(); let compiled_class_hash = empty_contract.get_compiled_class_hash(); let class_info = calculate_class_info_for_testing(empty_contract.get_class()); - let sender_address = account.get_instance_address(0); - let mut nonce_manager = NonceManager::default(); let tx = executable_declare_tx( declare_tx_args! { max_fee: Fee(0), - sender_address, - version: tx_version, + sender_address: account_address, + version: TransactionVersion::ZERO, resource_bounds: default_l1_resource_bounds, class_hash, compiled_class_hash, - nonce: nonce_manager.next(sender_address), + nonce: nonce_manager.next(account_address), }, class_info.clone(), ); @@ -1754,17 +1779,30 @@ fn test_declare_tx_v0(default_l1_resource_bounds: ValidResourceBounds) { execution_flags: ExecutionFlags { charge_fee: false, ..ExecutionFlags::default() }, }; - let actual_execution_info = account_tx.execute(state, block_context).unwrap(); // fee not charged for declare v0. + // fee not charged for declare v0. + let actual_execution_info = account_tx.execute(&mut state, &block_context).unwrap(); assert_eq!(actual_execution_info.fee_transfer_call_info, None, "not none"); assert_eq!(actual_execution_info.receipt.fee, Fee(0)); } #[rstest] +#[case::with_cairo0_account(CairoVersion::Cairo0, 0)] +#[case::with_cairo1_account( + CairoVersion::Cairo1(RunnableCairo1::Casm), + VersionedConstants::create_for_testing().os_constants.gas_costs.base.entry_point_initial_budget - DEPLOY_ACCOUNT_REDEPOSIT_AMOUNT +)] +#[cfg_attr( + feature = "cairo_native", + case::with_cairo1_native_account( + CairoVersion::Cairo1(RunnableCairo1::Native), + VersionedConstants::create_for_testing().os_constants.gas_costs.base.entry_point_initial_budget - DEPLOY_ACCOUNT_REDEPOSIT_AMOUNT + ) +)] fn test_deploy_account_tx( - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - cairo_version: CairoVersion, + #[case] cairo_version: CairoVersion, #[values(false, true)] use_kzg_da: bool, + #[case] expected_gas_consumed: u64, default_all_resource_bounds: ValidResourceBounds, ) { let block_context = &BlockContext::create_for_account_testing_with_kzg(use_kzg_da); @@ -1814,7 +1852,9 @@ fn test_deploy_account_tx( panic!("Expected DeployAccount transaction.") }; - let expected_gas_consumed = 0; + let tracked_resource = account + .get_runnable_class() + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None); let expected_validate_call_info = expected_validate_call_info( account_class_hash, constants::VALIDATE_DEPLOY_ENTRY_POINT_NAME, @@ -1822,17 +1862,20 @@ fn test_deploy_account_tx( validate_calldata, deployed_account_address, cairo_version, - account - .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None), + tracked_resource, Some(user_initial_gas), ); // Build expected execute call info. - let expected_execute_initial_gas = user_initial_gas + let expected_execute_initial_gas = match tracked_resource { + TrackedResource::CairoSteps => versioned_constants.infinite_gas_for_vm_mode(), + TrackedResource::SierraGas => { + user_initial_gas // Note that in the case of deploy account, the initial gas in "execute" is limited by // max_validation_sierra_gas. - .min(versioned_constants.validate_max_sierra_gas); + .min(versioned_constants.os_constants.validate_max_sierra_gas).0 + } + }; let expected_execute_call_info = Some(CallInfo { call: CallEntryPoint { class_hash: Some(account_class_hash), @@ -1840,9 +1883,10 @@ fn test_deploy_account_tx( entry_point_type: EntryPointType::Constructor, entry_point_selector: selector_from_name(CONSTRUCTOR_ENTRY_POINT_NAME), storage_address: deployed_account_address, - initial_gas: expected_execute_initial_gas.0, + initial_gas: expected_execute_initial_gas, ..Default::default() }, + tracked_resource, ..Default::default() }); @@ -1874,6 +1918,7 @@ fn test_deploy_account_tx( starknet_resources, computation: ComputationResources { vm_resources: expected_cairo_resources, + sierra_gas: expected_gas_consumed.into(), ..Default::default() }, }; @@ -1992,9 +2037,37 @@ fn test_fail_deploy_account_undeclared_class_hash( ); } +#[cfg(feature = "cairo_native")] +fn check_native_validate_error( + error: TransactionExecutionError, + error_msg: &str, + validate_constructor: bool, +) { + let syscall_error = match error { + TransactionExecutionError::ValidateTransactionError { + error: EntryPointExecutionError::NativeUnrecoverableError(boxed_syscall_error), + .. + } => { + assert!(!validate_constructor); + *boxed_syscall_error + } + TransactionExecutionError::ContractConstructorExecutionFailed( + ConstructorEntryPointExecutionError::ExecutionError { + error: EntryPointExecutionError::NativeUnrecoverableError(boxed_syscall_error), + .. + }, + ) => { + assert!(validate_constructor); + *boxed_syscall_error + } + _ => panic!("Unexpected error: {:?}", error), + }; + assert_matches!(syscall_error, SyscallExecutionError::InvalidSyscallInExecutionMode { .. }); + assert!(syscall_error.to_string().contains(error_msg)); +} // TODO(Arni, 1/5/2024): Cover other versions of declare transaction. // TODO(Arni, 1/5/2024): Consider version 0 invoke. -#[rstest] +#[apply(cairo_version)] #[case::validate_version_1(TransactionType::InvokeFunction, false, TransactionVersion::ONE)] #[case::validate_version_3(TransactionType::InvokeFunction, false, TransactionVersion::THREE)] #[case::validate_declare_version_1(TransactionType::Declare, false, TransactionVersion::ONE)] @@ -2009,7 +2082,6 @@ fn test_validate_accounts_tx( #[case] tx_type: TransactionType, #[case] validate_constructor: bool, #[case] tx_version: TransactionVersion, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] cairo_version: CairoVersion, ) { let block_context = &block_context; @@ -2055,13 +2127,25 @@ fn test_validate_accounts_tx( ..default_args }); let error = account_tx.execute(state, block_context).unwrap_err(); - check_tx_execution_error_for_custom_hint!( - &error, - "Unauthorized syscall call_contract in execution mode Validate.", - validate_constructor, - ); + match cairo_version { + CairoVersion::Cairo0 | CairoVersion::Cairo1(RunnableCairo1::Casm) => { + check_tx_execution_error_for_custom_hint!( + &error, + "Unauthorized syscall call_contract in execution mode Validate.", + validate_constructor, + ); + } + #[cfg(feature = "cairo_native")] + CairoVersion::Cairo1(RunnableCairo1::Native) => { + check_native_validate_error( + error, + "Unauthorized syscall call_contract in execution mode Validate.", + validate_constructor, + ); + } + } - if let CairoVersion::Cairo1(RunnableCairo1::Casm) = cairo_version { + if let CairoVersion::Cairo1(runnable_cairo1) = cairo_version { // Try to use the syscall get_block_hash (forbidden). let account_tx = create_account_tx_for_validate_test_nonce_0(FaultyAccountTxCreatorArgs { scenario: GET_BLOCK_HASH, @@ -2071,11 +2155,25 @@ fn test_validate_accounts_tx( ..default_args }); let error = account_tx.execute(state, block_context).unwrap_err(); - check_tx_execution_error_for_custom_hint!( - &error, - "Unauthorized syscall get_block_hash in execution mode Validate.", - validate_constructor, - ); + match runnable_cairo1 { + RunnableCairo1::Casm => { + check_tx_execution_error_for_custom_hint!( + &error, + "Unauthorized syscall get_block_hash on recent blocks in execution mode \ + Validate.", + validate_constructor, + ); + } + #[cfg(feature = "cairo_native")] + RunnableCairo1::Native => { + check_native_validate_error( + error, + "Unauthorized syscall get_block_hash on recent blocks in execution mode \ + Validate.", + validate_constructor, + ); + } + } } if let CairoVersion::Cairo0 = cairo_version { // Try to use the syscall get_sequencer_address (forbidden). @@ -2189,15 +2287,15 @@ fn test_validate_accounts_tx( } } -#[rstest] +#[apply(two_cairo_versions)] fn test_valid_flag( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - test_contract_cairo_version: CairoVersion, + cairo_version1: CairoVersion, + cairo_version2: CairoVersion, ) { + let account_cairo_version = cairo_version1; + let test_contract_cairo_version = cairo_version2; let block_context = &block_context; let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); let test_contract = FeatureContract::TestContract(test_contract_cairo_version); @@ -2229,25 +2327,17 @@ fn test_only_query_flag( default_all_resource_bounds: ValidResourceBounds, #[values(true, false)] only_query: bool, ) { - let account_balance = BALANCE; - let block_context = &block_context; - let account = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let state = &mut test_state( + let TestInitData { mut state, account_address, contract_address, .. } = create_test_init_data( &block_context.chain_info, - account_balance, - &[(account, 1), (test_contract, 1)], + CairoVersion::Cairo1(RunnableCairo1::Casm), ); let mut version = Felt::from(3_u8); if only_query { version += *QUERY_VERSION_BASE; } - let sender_address = account.get_instance_address(0); - let test_contract_address = test_contract.get_instance_address(0); let expected_tx_info = vec![ version, // Transaction version. - *sender_address.0.key(), // Account address. + *account_address.0.key(), // Account address. Felt::ZERO, // Max fee. Felt::ZERO, // Signature. Felt::ZERO, // Transaction hash. @@ -2278,9 +2368,9 @@ fn test_only_query_flag( let entry_point_selector = selector_from_name("test_get_execution_info"); let expected_call_info = vec![ - *sender_address.0.key(), // Caller address. - *test_contract_address.0.key(), // Storage address. - entry_point_selector.0, // Entry point selector. + *account_address.0.key(), // Caller address. + *contract_address.0.key(), // Storage address. + entry_point_selector.0, // Entry point selector. ]; let expected_block_info = [ felt!(CURRENT_BLOCK_NUMBER), // Block number. @@ -2293,8 +2383,8 @@ fn test_only_query_flag( + expected_unsupported_fields.len() + expected_call_info.len(); let execute_calldata = vec![ - *test_contract_address.0.key(), // Contract address. - entry_point_selector.0, // EP selector. + *contract_address.0.key(), // Contract address. + entry_point_selector.0, // EP selector. // TODO(Ori, 1/2/2024): Write an indicative expect message explaining why the conversion // works. felt!(u64::try_from(calldata_len).expect("Failed to convert usize to u64.")), /* Calldata length. */ @@ -2314,12 +2404,12 @@ fn test_only_query_flag( let tx = executable_invoke_tx(invoke_tx_args! { calldata: execute_calldata, resource_bounds: default_all_resource_bounds, - sender_address, + sender_address: account_address, }); let execution_flags = ExecutionFlags { only_query, ..Default::default() }; let invoke_tx = AccountTransaction { tx, execution_flags }; - let tx_execution_info = invoke_tx.execute(state, block_context).unwrap(); + let tx_execution_info = invoke_tx.execute(&mut state, &block_context).unwrap(); assert_eq!(tx_execution_info.revert_error, None); } @@ -2327,9 +2417,9 @@ fn test_only_query_flag( fn test_l1_handler(#[values(false, true)] use_kzg_da: bool) { let gas_mode = GasVectorComputationMode::NoL2Gas; let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let chain_info = &ChainInfo::create_for_testing(); - let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1)]); let block_context = &BlockContext::create_for_account_testing_with_kzg(use_kzg_da); + let chain_info = &block_context.chain_info; + let state = &mut test_state(chain_info, BALANCE, &[(test_contract, 1)]); let contract_address = test_contract.get_instance_address(0); let versioned_constants = &block_context.versioned_constants; let tx = l1handler_tx(Fee(1), contract_address); @@ -2341,7 +2431,7 @@ fn test_l1_handler(#[values(false, true)] use_kzg_da: bool) { // Build the expected call info. let accessed_storage_key = StorageKey::try_from(key).unwrap(); - let gas_consumed = GasAmount(6120); + let gas_consumed = GasAmount(16950); let expected_call_info = CallInfo { call: CallEntryPoint { class_hash: Some(test_contract.get_class_hash()), @@ -2352,18 +2442,17 @@ fn test_l1_handler(#[values(false, true)] use_kzg_da: bool) { storage_address: contract_address, caller_address: ContractAddress::default(), call_type: CallType::Call, - initial_gas: initial_gas_amount_from_block_context(Some(block_context)).0, + initial_gas: block_context.versioned_constants.os_constants.execute_max_sierra_gas.0, }, execution: CallExecution { retdata: Retdata(vec![value]), gas_consumed: gas_consumed.0, ..Default::default() }, - charged_resources: ChargedResources::from_gas(gas_consumed), accessed_storage_keys: HashSet::from_iter(vec![accessed_storage_key]), tracked_resource: test_contract .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None), + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None), ..Default::default() }; @@ -2373,11 +2462,11 @@ fn test_l1_handler(#[values(false, true)] use_kzg_da: bool) { // (currently matches only starknet resources). let expected_gas = match use_kzg_da { true => GasVector { - l1_gas: 17899_u32.into(), + l1_gas: 18007_u32.into(), l1_data_gas: 160_u32.into(), l2_gas: 0_u32.into(), }, - false => GasVector::from_l1_gas(19593_u32.into()), + false => GasVector::from_l1_gas(19701_u32.into()), }; let expected_da_gas = match use_kzg_da { @@ -2485,25 +2574,17 @@ fn test_execute_tx_with_invalid_tx_version( block_context: BlockContext, default_all_resource_bounds: ValidResourceBounds, ) { - let cairo_version = CairoVersion::Cairo0; - let account = FeatureContract::AccountWithoutValidations(cairo_version); - let test_contract = FeatureContract::TestContract(cairo_version); - let block_context = &block_context; - let state = - &mut test_state(&block_context.chain_info, BALANCE, &[(account, 1), (test_contract, 1)]); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, CairoVersion::Cairo0); let invalid_version = 12345_u64; - let calldata = create_calldata( - test_contract.get_instance_address(0), - "test_tx_version", - &[felt!(invalid_version)], - ); + let calldata = create_calldata(contract_address, "test_tx_version", &[felt!(invalid_version)]); let account_tx = invoke_tx_with_default_flags(invoke_tx_args! { resource_bounds: default_all_resource_bounds, - sender_address: account.get_instance_address(0), + sender_address: account_address, calldata, }); - let execution_info = account_tx.execute(state, block_context).unwrap(); + let execution_info = account_tx.execute(&mut state, &block_context).unwrap(); assert!( execution_info .revert_error @@ -2525,7 +2606,7 @@ fn max_event_data() -> usize { VERSIONED_CONSTANTS.tx_event_limits.max_data_length } -#[rstest] +#[apply(cairo_version)] #[case::positive_flow( vec![felt!(1_u16); max_event_keys()], vec![felt!(2_u16); max_event_data()], @@ -2562,18 +2643,10 @@ fn test_emit_event_exceeds_limit( #[case] event_data: Vec, #[case] n_emitted_events: usize, #[case] expected_error: Option, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] cairo_version: CairoVersion, ) { - let test_contract = FeatureContract::TestContract(cairo_version); - let account_contract = - FeatureContract::AccountWithoutValidations(CairoVersion::Cairo1(RunnableCairo1::Casm)); - let block_context = &block_context; - let state = &mut test_state( - &block_context.chain_info, - BALANCE, - &[(test_contract, 1), (account_contract, 1)], - ); + let TestInitData { mut state, account_address, contract_address, .. } = + create_test_init_data(&block_context.chain_info, cairo_version); let calldata = [ vec![felt!(u16::try_from(n_emitted_events).expect("Failed to convert usize to u16."))] @@ -2586,7 +2659,7 @@ fn test_emit_event_exceeds_limit( .concat(); let execute_calldata = Calldata( [ - vec![test_contract.get_instance_address(0).into()], + vec![contract_address.into()], vec![selector_from_name("test_emit_events").0], vec![felt!(u16::try_from(calldata.len()).expect("Failed to convert usize to u16."))], calldata.clone(), @@ -2596,12 +2669,12 @@ fn test_emit_event_exceeds_limit( ); let account_tx = invoke_tx_with_default_flags(invoke_tx_args! { - sender_address: account_contract.get_instance_address(0), + sender_address: account_address, calldata: execute_calldata, resource_bounds: default_all_resource_bounds, nonce: nonce!(0_u8), }); - let execution_info = account_tx.execute(state, block_context).unwrap(); + let execution_info = account_tx.execute(&mut state, &block_context).unwrap(); match &expected_error { Some(expected_error) => { let error_string = execution_info.revert_error.unwrap().to_string(); @@ -2619,7 +2692,7 @@ fn test_balance_print() { assert!(format!("{}", int) == (BigUint::from(u128::MAX) + BigUint::from(17_u128)).to_string()); } -#[rstest] +#[apply(two_cairo_versions)] #[case::small_user_bounds(invoke_tx_args! { version: TransactionVersion::THREE, resource_bounds: create_gas_amount_bounds_with_default_price( @@ -2631,7 +2704,7 @@ fn test_balance_print() { resource_bounds: create_gas_amount_bounds_with_default_price( GasVector{ l1_gas: GasAmount(1652), - l2_gas: versioned_constants.validate_max_sierra_gas + GasAmount(1234567), + l2_gas: versioned_constants.os_constants.validate_max_sierra_gas + GasAmount(1234567), l1_data_gas: GasAmount(0), } ), @@ -2652,11 +2725,11 @@ fn test_invoke_max_sierra_gas_validate_execute( block_context: BlockContext, versioned_constants: VersionedConstants, #[case] tx_args: InvokeTxArgs, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - account_cairo_version: CairoVersion, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] - contract_cairo_version: CairoVersion, + cairo_version1: CairoVersion, + cairo_version2: CairoVersion, ) { + let account_cairo_version = cairo_version1; + let contract_cairo_version = cairo_version2; let account_contract = FeatureContract::AccountWithoutValidations(account_cairo_version); let test_contract = FeatureContract::TestContract(contract_cairo_version); let chain_info = &block_context.chain_info; @@ -2677,19 +2750,19 @@ fn test_invoke_max_sierra_gas_validate_execute( let account_tracked_resource = account_contract .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None); + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None); let contract_tracked_resource = test_contract.get_runnable_class().tracked_resource( - &versioned_constants.min_compiler_version_for_sierra_gas, + &versioned_constants.min_sierra_version_for_sierra_gas, Some(&account_tracked_resource), ); let actual_validate_initial_gas = actual_execution_info.validate_call_info.as_ref().unwrap().call.initial_gas; let expected_validate_initial_gas = match account_tracked_resource { - TrackedResource::CairoSteps => VERSIONED_CONSTANTS.inifite_gas_for_vm_mode(), + TrackedResource::CairoSteps => VERSIONED_CONSTANTS.infinite_gas_for_vm_mode(), TrackedResource::SierraGas => { - versioned_constants.validate_max_sierra_gas.min(user_initial_gas).0 + versioned_constants.os_constants.validate_max_sierra_gas.min(user_initial_gas).0 } }; @@ -2698,9 +2771,10 @@ fn test_invoke_max_sierra_gas_validate_execute( let actual_execute_initial_gas = actual_execution_info.execute_call_info.as_ref().unwrap().call.initial_gas; let expected_execute_initial_gas = match account_tracked_resource { - TrackedResource::CairoSteps => VERSIONED_CONSTANTS.inifite_gas_for_vm_mode(), + TrackedResource::CairoSteps => VERSIONED_CONSTANTS.infinite_gas_for_vm_mode(), TrackedResource::SierraGas => { versioned_constants + .os_constants .execute_max_sierra_gas .min( user_initial_gas @@ -2733,11 +2807,11 @@ fn test_invoke_max_sierra_gas_validate_execute( .gas_consumed ); } else { - assert_eq!(actual_inner_call_initial_gas, versioned_constants.inifite_gas_for_vm_mode()); + assert_eq!(actual_inner_call_initial_gas, versioned_constants.infinite_gas_for_vm_mode()); }; } -#[rstest] +#[apply(cairo_version)] #[case::small_user_bounds(deploy_account_tx_args! { version: TransactionVersion::THREE, resource_bounds: create_gas_amount_bounds_with_default_price( @@ -2749,7 +2823,7 @@ fn test_invoke_max_sierra_gas_validate_execute( resource_bounds: create_gas_amount_bounds_with_default_price( GasVector{ l1_gas: GasAmount(2203), - l2_gas: versioned_constants.validate_max_sierra_gas + GasAmount(1234567), + l2_gas: versioned_constants.os_constants.validate_max_sierra_gas + GasAmount(1234567), l1_data_gas: GasAmount(0), } ), @@ -2769,7 +2843,6 @@ fn test_invoke_max_sierra_gas_validate_execute( fn test_deploy_max_sierra_gas_validate_execute( block_context: BlockContext, versioned_constants: VersionedConstants, - #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] cairo_version: CairoVersion, #[case] tx_args: DeployAccountTxArgs, ) { @@ -2800,22 +2873,27 @@ fn test_deploy_max_sierra_gas_validate_execute( let account_tracked_resource = account .get_runnable_class() - .tracked_resource(&versioned_constants.min_compiler_version_for_sierra_gas, None); + .tracked_resource(&versioned_constants.min_sierra_version_for_sierra_gas, None); let actual_execution_info = deploy_account.execute(state, &block_context).unwrap(); let actual_execute_initial_gas = actual_execution_info.execute_call_info.as_ref().unwrap().call.initial_gas; - let expected_execute_initial_gas = - versioned_constants.validate_max_sierra_gas.min(user_initial_gas).0; + let expected_execute_initial_gas = match account_tracked_resource { + TrackedResource::CairoSteps => VERSIONED_CONSTANTS.infinite_gas_for_vm_mode(), + TrackedResource::SierraGas => { + versioned_constants.os_constants.validate_max_sierra_gas.min(user_initial_gas).0 + } + }; assert_eq!(actual_execute_initial_gas, expected_execute_initial_gas); let actual_validate_initial_gas = actual_execution_info.validate_call_info.as_ref().unwrap().call.initial_gas; let expected_validate_initial_gas = match account_tracked_resource { - TrackedResource::CairoSteps => VERSIONED_CONSTANTS.inifite_gas_for_vm_mode(), + TrackedResource::CairoSteps => VERSIONED_CONSTANTS.infinite_gas_for_vm_mode(), TrackedResource::SierraGas => { versioned_constants + .os_constants .validate_max_sierra_gas .min( user_initial_gas diff --git a/crates/blockifier/src/versioned_constants.rs b/crates/blockifier/src/versioned_constants.rs index 9e46492fa80..b375b413e7f 100644 --- a/crates/blockifier/src/versioned_constants.rs +++ b/crates/blockifier/src/versioned_constants.rs @@ -6,7 +6,6 @@ use std::{fs, io}; use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use indexmap::{IndexMap, IndexSet}; -use infra_utils::compile_time_cargo_manifest_dir; use num_rational::Ratio; use num_traits::Inv; use papyrus_config::dumping::{ser_param, SerializeConfig}; @@ -17,9 +16,11 @@ use serde::de::Error as DeserializationError; use serde::{Deserialize, Deserializer, Serialize}; use serde_json::{Map, Number, Value}; use starknet_api::block::{GasPrice, StarknetVersion}; +use starknet_api::contract_class::SierraVersion; use starknet_api::core::ContractAddress; use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::transaction::fields::GasVectorComputationMode; +use starknet_infra_utils::compile_time_cargo_manifest_dir; use strum::IntoEnumIterator; use thiserror::Error; @@ -175,17 +176,16 @@ fn builtin_map_from_string_map<'de, D: Deserializer<'de>>( /// Instances of this struct for specific Starknet versions can be selected by using the above enum. #[derive(Clone, Debug, Default, Deserialize)] #[serde(deny_unknown_fields)] +#[serde(remote = "Self")] pub struct VersionedConstants { // Limits. pub tx_event_limits: EventLimits, pub invoke_tx_max_n_steps: u32, - pub execute_max_sierra_gas: GasAmount, pub deprecated_l2_resource_gas_costs: ArchivalDataGasCosts, pub archival_data_gas_costs: ArchivalDataGasCosts, pub max_recursion_depth: usize, pub validate_max_n_steps: u32, - pub validate_max_sierra_gas: GasAmount, - pub min_compiler_version_for_sierra_gas: CompilerVersion, + pub min_sierra_version_for_sierra_gas: SierraVersion, // BACKWARD COMPATIBILITY: If true, the segment_arena builtin instance counter will be // multiplied by 3. This offsets a bug in the old vm where the counter counted the number of // cells used by instances of the builtin, instead of the number of instances. @@ -252,20 +252,23 @@ impl VersionedConstants { /// Default initial gas amount when L2 gas is not provided. pub fn initial_gas_no_user_l2_bound(&self) -> GasAmount { - (self.execute_max_sierra_gas.checked_add(self.validate_max_sierra_gas)) - .expect("The default initial gas cost should be less than the maximum gas amount.") + (self + .os_constants + .execute_max_sierra_gas + .checked_add(self.os_constants.validate_max_sierra_gas)) + .expect("The default initial gas cost should be less than the maximum gas amount.") } /// Returns the maximum gas amount according to the given mode. pub fn sierra_gas_limit(&self, mode: &ExecutionMode) -> GasAmount { match mode { - ExecutionMode::Validate => self.validate_max_sierra_gas, - ExecutionMode::Execute => self.execute_max_sierra_gas, + ExecutionMode::Validate => self.os_constants.validate_max_sierra_gas, + ExecutionMode::Execute => self.os_constants.execute_max_sierra_gas, } } /// Returns the default initial gas for VM mode transactions. - pub fn inifite_gas_for_vm_mode(&self) -> u64 { + pub fn infinite_gas_for_vm_mode(&self) -> u64 { self.os_constants.gas_costs.base.default_initial_gas_cost } @@ -386,6 +389,7 @@ impl VersionedConstants { .iter() .map(|(builtin, amount)| { let builtin_cost = gas_costs + .builtins .get_builtin_gas_cost(builtin) .unwrap_or_else(|err| panic!("Failed to get gas cost: {}", err)); builtin_cost * u64_from_usize(*amount) @@ -401,6 +405,73 @@ impl VersionedConstants { } } +impl<'de> Deserialize<'de> for VersionedConstants { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let mut versioned_constants = Self::deserialize(deserializer)?; + + let syscall_gas_costs = &(versioned_constants.os_constants.gas_costs.syscalls); + if syscall_gas_costs == &SyscallGasCosts::default() { + let syscalls = SyscallGasCosts { + call_contract: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::CallContract), + deploy: versioned_constants.get_syscall_gas_cost(&SyscallSelector::Deploy), + get_block_hash: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::GetBlockHash), + get_execution_info: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::GetExecutionInfo), + library_call: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::LibraryCall), + replace_class: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::ReplaceClass), + storage_read: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::StorageRead), + storage_write: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::StorageWrite), + get_class_hash_at: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::GetClassHashAt), + emit_event: versioned_constants.get_syscall_gas_cost(&SyscallSelector::EmitEvent), + send_message_to_l1: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::SendMessageToL1), + secp256k1_add: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256k1Add), + secp256k1_get_point_from_x: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256k1GetPointFromX), + secp256k1_get_xy: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256k1GetXy), + secp256k1_mul: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256k1Mul), + secp256k1_new: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256k1New), + secp256r1_add: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256r1Add), + secp256r1_get_point_from_x: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256r1GetPointFromX), + secp256r1_get_xy: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256r1GetXy), + secp256r1_mul: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256r1Mul), + secp256r1_new: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Secp256r1New), + keccak: versioned_constants.get_syscall_gas_cost(&SyscallSelector::Keccak), + keccak_round_cost: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::KeccakRound), + sha256_process_block: versioned_constants + .get_syscall_gas_cost(&SyscallSelector::Sha256ProcessBlock), + }; + + Arc::get_mut(&mut versioned_constants.os_constants) + .expect("Failed to get mutable reference") + .gas_costs + .syscalls = syscalls; + } + + Ok(versioned_constants) + } +} + #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] pub struct ArchivalDataGasCosts { // TODO(barak, 18/03/2024): Once we start charging per byte change to milligas_per_data_byte, @@ -413,6 +484,37 @@ pub struct ArchivalDataGasCosts { pub gas_per_code_byte: ResourceCost, } +pub struct CairoNativeStackConfig { + pub gas_to_stack_ratio: Ratio, + pub max_stack_size: u64, + pub min_stack_red_zone: u64, + pub buffer_size: u64, +} + +impl CairoNativeStackConfig { + /// Rounds up the given size to the nearest multiple of MB. + pub fn round_up_to_mb(size: u64) -> u64 { + const MB: u64 = 1024 * 1024; + size.div_ceil(MB) * MB + } + + /// Returns the stack size sufficient for running Cairo Native. + /// Rounds up to the nearest multiple of MB. + pub fn get_stack_size_red_zone(&self, remaining_gas: u64) -> u64 { + let stack_size_based_on_gas = + (self.gas_to_stack_ratio * Ratio::new(remaining_gas, 1)).to_integer(); + // Ensure the computed stack size is within the allowed range. + CairoNativeStackConfig::round_up_to_mb( + stack_size_based_on_gas.clamp(self.min_stack_red_zone, self.max_stack_size), + ) + } + + pub fn get_target_stack_size(&self, red_zone: u64) -> u64 { + // Stack size should be a multiple of page size, since `stacker::grow` works with this unit. + CairoNativeStackConfig::round_up_to_mb(red_zone + self.buffer_size) + } +} + #[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq)] pub struct EventLimits { pub max_data_length: usize, @@ -529,6 +631,18 @@ impl OsResources { ) -> ExecutionResources { let mut os_additional_resources = ExecutionResources::default(); for (syscall_selector, count) in syscall_counter { + if syscall_selector == &SyscallSelector::Keccak { + let keccak_base_resources = + self.execute_syscalls.get(syscall_selector).unwrap_or_else(|| { + panic!("OS resources of syscall '{syscall_selector:?}' are unknown.") + }); + os_additional_resources += keccak_base_resources; + } + let syscall_selector = if syscall_selector == &SyscallSelector::Keccak { + &SyscallSelector::KeccakRound + } else { + syscall_selector + }; let syscall_resources = self.execute_syscalls.get(syscall_selector).unwrap_or_else(|| { panic!("OS resources of syscall '{syscall_selector:?}' are unknown.") @@ -584,7 +698,8 @@ impl<'de> Deserialize<'de> for OsResources { } } -#[derive(Debug, Default, Deserialize)] +#[cfg_attr(any(test, feature = "testing"), derive(Clone, Copy))] +#[derive(Debug, Default, Deserialize, PartialEq)] pub struct SyscallGasCosts { pub call_contract: u64, pub deploy: u64, @@ -621,6 +736,7 @@ impl SyscallGasCosts { SyscallSelector::GetBlockHash => self.get_block_hash, SyscallSelector::GetExecutionInfo => self.get_execution_info, SyscallSelector::GetClassHashAt => self.get_class_hash_at, + SyscallSelector::KeccakRound => self.keccak_round_cost, SyscallSelector::Keccak => self.keccak, SyscallSelector::Sha256ProcessBlock => self.sha256_process_block, SyscallSelector::LibraryCall => self.library_call, @@ -656,52 +772,49 @@ impl SyscallGasCosts { } } +#[cfg_attr(any(test, feature = "testing"), derive(Clone, Copy))] #[derive(Debug, Default, Deserialize)] pub struct BaseGasCosts { pub step_gas_cost: u64, pub memory_hole_gas_cost: u64, - // Range check has a hard-coded cost higher than its proof percentage to avoid the overhead of - // retrieving its price from the table. - pub range_check_gas_cost: u64, - // Priced builtins. - pub keccak_builtin_gas_cost: u64, - pub pedersen_gas_cost: u64, - pub bitwise_builtin_gas_cost: u64, - pub ecop_gas_cost: u64, - pub poseidon_gas_cost: u64, - pub add_mod_gas_cost: u64, - pub mul_mod_gas_cost: u64, - pub ecdsa_gas_cost: u64, // An estimation of the initial gas for a transaction to run with. This solution is // temporary and this value will be deduced from the transaction's fields. pub default_initial_gas_cost: u64, // Compiler gas costs. pub entry_point_initial_budget: u64, pub syscall_base_gas_cost: u64, - // OS gas costs. - pub transaction_gas_cost: u64, } -/// Gas cost constants. For more documentation see in core/os/constants.cairo. +#[cfg_attr(any(test, feature = "testing"), derive(Clone, Copy))] #[derive(Debug, Default, Deserialize)] -pub struct GasCosts { - pub base: BaseGasCosts, - pub syscalls: SyscallGasCosts, +pub struct BuiltinGasCosts { + // Range check has a hard-coded cost higher than its proof percentage to avoid the overhead of + // retrieving its price from the table. + pub range_check: u64, + // Priced builtins. + pub keccak: u64, + pub pedersen: u64, + pub bitwise: u64, + pub ecop: u64, + pub poseidon: u64, + pub add_mod: u64, + pub mul_mod: u64, + pub ecdsa: u64, } -impl GasCosts { +impl BuiltinGasCosts { pub fn get_builtin_gas_cost(&self, builtin: &BuiltinName) -> Result { let gas_cost = match *builtin { - BuiltinName::range_check => self.base.range_check_gas_cost, - BuiltinName::pedersen => self.base.pedersen_gas_cost, - BuiltinName::bitwise => self.base.bitwise_builtin_gas_cost, - BuiltinName::ec_op => self.base.ecop_gas_cost, - BuiltinName::keccak => self.base.keccak_builtin_gas_cost, - BuiltinName::poseidon => self.base.poseidon_gas_cost, - BuiltinName::range_check96 => self.base.range_check_gas_cost, - BuiltinName::add_mod => self.base.add_mod_gas_cost, - BuiltinName::mul_mod => self.base.mul_mod_gas_cost, - BuiltinName::ecdsa => self.base.ecdsa_gas_cost, + BuiltinName::range_check => self.range_check, + BuiltinName::pedersen => self.pedersen, + BuiltinName::bitwise => self.bitwise, + BuiltinName::ec_op => self.ecop, + BuiltinName::keccak => self.keccak, + BuiltinName::poseidon => self.poseidon, + BuiltinName::range_check96 => self.range_check, + BuiltinName::add_mod => self.add_mod, + BuiltinName::mul_mod => self.mul_mod, + BuiltinName::ecdsa => self.ecdsa, BuiltinName::segment_arena => return Err(GasCostsError::VirtualBuiltin), BuiltinName::output => { return Err(GasCostsError::UnsupportedBuiltinInCairo1 { builtin: *builtin }); @@ -712,26 +825,37 @@ impl GasCosts { } } +/// Gas cost constants. For more documentation see in core/os/constants.cairo. +#[cfg_attr(any(test, feature = "testing"), derive(Clone, Copy))] +#[derive(Debug, Default, Deserialize)] +pub struct GasCosts { + pub base: BaseGasCosts, + pub builtins: BuiltinGasCosts, + pub syscalls: SyscallGasCosts, +} + // Below, serde first deserializes the json into a regular IndexMap wrapped by the newtype // `OsConstantsRawJson`, then calls the `try_from` of the newtype, which handles the // conversion into actual values. // TODO: consider encoding the * and + operations inside the json file, instead of hardcoded below // in the `try_from`. +#[cfg_attr(any(test, feature = "testing"), derive(Clone, Copy))] #[derive(Debug, Default, Deserialize)] #[serde(try_from = "OsConstantsRawJson")] pub struct OsConstants { pub gas_costs: GasCosts, pub validate_rounding_consts: ValidateRoundingConsts, pub os_contract_addresses: OsContractAddresses, + pub validate_max_sierra_gas: GasAmount, + pub execute_max_sierra_gas: GasAmount, } impl OsConstants { - // List of additinal os constants, beside the gas cost and validate rounding constants, that are - // not used by the blockifier but included for transparency. These constanst will be ignored - // during the creation of the struct containing the gas costs. + // List of os constants to be ignored + // during the creation of the struct containing the base gas costs. - const ADDITIONAL_FIELDS: [&'static str; 30] = [ - "block_hash_contract_address", + const ADDITIONAL_FIELDS: [&'static str; 32] = [ + "builtin_gas_costs", "constructor_entry_point_selector", "default_entry_point_selector", "entry_point_type_constructor", @@ -744,6 +868,7 @@ impl OsConstants { "error_entry_point_not_found", "error_out_of_gas", "execute_entry_point_selector", + "execute_max_sierra_gas", "l1_gas", "l1_gas_index", "l1_handler_version", @@ -754,13 +879,14 @@ impl OsConstants { "nop_entry_point_offset", "sierra_array_len_bound", "stored_block_hash_buffer", + "syscall_gas_costs", "transfer_entry_point_selector", "validate_declare_entry_point_selector", "validate_deploy_entry_point_selector", "validate_entry_point_selector", + "validate_max_sierra_gas", "validate_rounding_consts", "validated", - "syscall_gas_costs", ]; } @@ -770,9 +896,16 @@ impl TryFrom<&OsConstantsRawJson> for GasCosts { fn try_from(raw_json_data: &OsConstantsRawJson) -> Result { let base_value: Value = serde_json::to_value(&raw_json_data.parse_base()?)?; let base: BaseGasCosts = serde_json::from_value(base_value)?; - let syscalls_value: Value = serde_json::to_value(&raw_json_data.parse_syscalls(&base)?)?; - let syscalls: SyscallGasCosts = serde_json::from_value(syscalls_value)?; - Ok(GasCosts { base, syscalls }) + let builtins_value: Value = serde_json::to_value(&raw_json_data.parse_builtin()?)?; + let builtins: BuiltinGasCosts = serde_json::from_value(builtins_value)?; + if (raw_json_data.raw_json_file_as_dict).contains_key("syscall_gas_costs") { + let syscalls_value: Value = + serde_json::to_value(&raw_json_data.parse_syscalls(&base, &builtins)?)?; + let syscalls: SyscallGasCosts = serde_json::from_value(syscalls_value)?; + Ok(GasCosts { base, builtins, syscalls }) + } else { + Ok(GasCosts { base, builtins, syscalls: SyscallGasCosts::default() }) + } } } @@ -783,8 +916,29 @@ impl TryFrom for OsConstants { let gas_costs = GasCosts::try_from(&raw_json_data)?; let validate_rounding_consts = raw_json_data.validate_rounding_consts; let os_contract_addresses = raw_json_data.os_contract_addresses; - let os_constants = - OsConstants { gas_costs, validate_rounding_consts, os_contract_addresses }; + let key = "validate_max_sierra_gas"; + let validate_max_sierra_gas = GasAmount(serde_json::from_value( + raw_json_data + .raw_json_file_as_dict + .get(key) + .ok_or_else(|| OsConstantsSerdeError::KeyNotFoundInFile(key.to_string()))? + .clone(), + )?); + let key = "execute_max_sierra_gas"; + let execute_max_sierra_gas = GasAmount(serde_json::from_value( + raw_json_data + .raw_json_file_as_dict + .get(key) + .ok_or_else(|| OsConstantsSerdeError::KeyNotFoundInFile(key.to_string()))? + .clone(), + )?); + let os_constants = OsConstants { + gas_costs, + validate_rounding_consts, + os_contract_addresses, + validate_max_sierra_gas, + execute_max_sierra_gas, + }; Ok(os_constants) } } @@ -846,13 +1000,44 @@ impl OsConstantsRawJson { fn parse_syscalls( &self, base: &BaseGasCosts, + builtins: &BuiltinGasCosts, ) -> Result, OsConstantsSerdeError> { let mut gas_costs = IndexMap::new(); + let key = "syscall_gas_costs"; let syscalls: IndexMap = serde_json::from_value( - (self.raw_json_file_as_dict.get("syscall_gas_costs").unwrap()).clone(), + (self + .raw_json_file_as_dict + .get(key) + .ok_or_else(|| OsConstantsSerdeError::KeyNotFoundInFile(key.to_string()))?) + .clone(), )?; for (key, value) in syscalls { - self.add_to_syscalls(&key, &value, &mut gas_costs, base)?; + self.add_to_syscalls(&key, &value, &mut gas_costs, base, builtins)?; + } + Ok(gas_costs) + } + + fn parse_builtin(&self) -> Result, OsConstantsSerdeError> { + let mut gas_costs = IndexMap::new(); + let key = "builtin_gas_costs"; + let builtins: IndexMap = serde_json::from_value( + (self + .raw_json_file_as_dict + .get(key) + .ok_or_else(|| OsConstantsSerdeError::KeyNotFoundInFile(key.to_string()))?) + .clone(), + )?; + for (key, value) in builtins { + match value { + Value::Number(n) => { + let cost = n.as_u64().ok_or_else(|| OsConstantsSerdeError::OutOfRange { + key: key.to_string(), + value: n.clone(), + })?; + gas_costs.insert(key.to_string(), cost); + } + _ => return Err(OsConstantsSerdeError::UnhandledValueType(value.clone())), + } } Ok(gas_costs) } @@ -925,6 +1110,7 @@ impl OsConstantsRawJson { value: &Value, syscalls: &mut IndexMap, base: &BaseGasCosts, + builtins: &BuiltinGasCosts, ) -> Result<(), OsConstantsSerdeError> { let mut cost = 0; match value { @@ -933,19 +1119,18 @@ impl OsConstantsRawJson { let inner_value = match inner_key.as_str() { "step_gas_cost" => base.step_gas_cost, "memory_hole_gas_cost" => base.memory_hole_gas_cost, - "range_check_gas_cost" => base.range_check_gas_cost, - "keccak_builtin_gas_cost" => base.keccak_builtin_gas_cost, - "pedersen_gas_cost" => base.pedersen_gas_cost, - "bitwise_builtin_gas_cost" => base.bitwise_builtin_gas_cost, - "ecop_gas_cost" => base.ecop_gas_cost, - "poseidon_gas_cost" => base.poseidon_gas_cost, - "add_mod_gas_cost" => base.add_mod_gas_cost, - "mul_mod_gas_cost" => base.mul_mod_gas_cost, - "ecdsa_gas_cost" => base.ecdsa_gas_cost, "default_initial_gas_cost" => base.default_initial_gas_cost, "entry_point_initial_budget" => base.entry_point_initial_budget, "syscall_base_gas_cost" => base.syscall_base_gas_cost, - "transaction_gas_cost" => base.transaction_gas_cost, + "range_check" => builtins.range_check, + "keccak" => builtins.keccak, + "pedersen" => builtins.pedersen, + "bitwise" => builtins.bitwise, + "ecop" => builtins.ecop, + "poseidon" => builtins.poseidon, + "add_mod" => builtins.add_mod, + "mul_mod" => builtins.mul_mod, + "ecdsa" => builtins.ecdsa, _ => { return Err(OsConstantsSerdeError::KeyNotFound { key: key.to_string(), @@ -995,6 +1180,8 @@ pub enum OsConstantsSerdeError { InvalidFactorFormat(Value), #[error("Unknown key '{inner_key}' used to create value for '{key}'")] KeyNotFound { key: String, inner_key: String }, + #[error("Key'{0}' is not found")] + KeyNotFoundInFile(String), #[error("Value {value} for key '{key}' is out of range and cannot be cast into u64")] OutOfRange { key: String, value: Number }, #[error( @@ -1062,6 +1249,7 @@ impl TryFrom for ResourcesParams { } } +#[cfg_attr(any(test, feature = "testing"), derive(Copy))] #[derive(Clone, Debug, Deserialize)] pub struct ValidateRoundingConsts { // Flooring factor for block number in validate mode. diff --git a/crates/blockifier/src/versioned_constants_test.rs b/crates/blockifier/src/versioned_constants_test.rs index 4f9b96c16fb..2a569111273 100644 --- a/crates/blockifier/src/versioned_constants_test.rs +++ b/crates/blockifier/src/versioned_constants_test.rs @@ -19,7 +19,7 @@ fn test_successful_gas_costs_parsing() { "entry_point_initial_budget": { "step_gas_cost": 3 }, - "transaction_gas_cost": { + "syscall_base_gas_cost": { "entry_point_initial_budget": 4, "step_gas_cost": 5 }, @@ -33,7 +33,10 @@ fn test_successful_gas_costs_parsing() { assert_eq!(versioned_constants.os_constants.gas_costs.base.entry_point_initial_budget, 2 * 3); // step_gas_cost * 3. // entry_point_initial_budget * 4 + step_gas_cost * 5. - assert_eq!(versioned_constants.os_constants.gas_costs.base.transaction_gas_cost, 6 * 4 + 2 * 5); + assert_eq!( + versioned_constants.os_constants.gas_costs.base.syscall_base_gas_cost, + 6 * 4 + 2 * 5 + ); } /// Assert versioned constants overrides are used when provided. diff --git a/crates/blockifier/tests/feature_contracts_compatibility_test.rs b/crates/blockifier/tests/feature_contracts_compatibility_test.rs index c8ec6f41eb8..a0d104c3bf6 100644 --- a/crates/blockifier/tests/feature_contracts_compatibility_test.rs +++ b/crates/blockifier/tests/feature_contracts_compatibility_test.rs @@ -135,22 +135,25 @@ fn compare_compilation_data(contract: &FeatureContract) { ); } CompilationArtifacts::Cairo1 { casm, sierra } => { - check_compilation( - casm, - &existing_compiled_contents, - &existing_compiled_path, - contract.get_source_path(), - ); + // TODO(Aviv): Remove this if after fixing sierra file of cairo steps contract. + if !matches!(contract, FeatureContract::CairoStepsTestContract) { + check_compilation( + casm, + &existing_compiled_contents, + &existing_compiled_path, + contract.get_source_path(), + ); - let sierra_compiled_path = contract.get_sierra_path(); - let existing_sierra_contents = fs::read_to_string(&sierra_compiled_path) - .unwrap_or_else(|_| panic!("Cannot read {sierra_compiled_path}.")); - check_compilation( - sierra, - &existing_sierra_contents, - &sierra_compiled_path, - contract.get_source_path(), - ); + let sierra_compiled_path = contract.get_sierra_path(); + let existing_sierra_contents = fs::read_to_string(&sierra_compiled_path) + .unwrap_or_else(|_| panic!("Cannot read {sierra_compiled_path}.")); + check_compilation( + sierra, + &existing_sierra_contents, + &sierra_compiled_path, + contract.get_source_path(), + ); + } } } } diff --git a/crates/blockifier_reexecution/README.md b/crates/blockifier_reexecution/README.md index fcaeec04af9..3be6ca4e292 100644 --- a/crates/blockifier_reexecution/README.md +++ b/crates/blockifier_reexecution/README.md @@ -24,9 +24,9 @@ cargo run --bin blockifier_reexecution write-to-file -n -d -d -b ... +cargo run --release --bin blockifier_reexecution reexecute -d -b ... ``` ### Downloading Offline Reexecution Files from the GC Bucket diff --git a/crates/blockifier_reexecution/src/main.rs b/crates/blockifier_reexecution/src/main.rs index f016101d4eb..20afdc6af0f 100644 --- a/crates/blockifier_reexecution/src/main.rs +++ b/crates/blockifier_reexecution/src/main.rs @@ -145,7 +145,7 @@ enum Command { fn parse_block_numbers_args(block_numbers: Option>) -> Vec { block_numbers .map(|block_numbers| block_numbers.into_iter().map(BlockNumber).collect()) - .unwrap_or_else(get_block_numbers_for_reexecution) + .unwrap_or_else(|| get_block_numbers_for_reexecution(None)) } #[derive(Debug, Args)] diff --git a/crates/blockifier_reexecution/src/state_reader/compile.rs b/crates/blockifier_reexecution/src/state_reader/compile.rs index 4088dcea60f..74ea4d12c9f 100644 --- a/crates/blockifier_reexecution/src/state_reader/compile.rs +++ b/crates/blockifier_reexecution/src/state_reader/compile.rs @@ -10,7 +10,7 @@ use cairo_lang_starknet_classes::contract_class::ContractEntryPoints; use cairo_lang_utils::bigint::BigUintAsHex; use flate2::bufread; use serde::Deserialize; -use starknet_api::contract_class::{ContractClass, EntryPointType}; +use starknet_api::contract_class::{ContractClass, EntryPointType, SierraVersion}; use starknet_api::core::EntryPointSelector; use starknet_api::deprecated_contract_class::{ ContractClass as DeprecatedContractClass, @@ -72,8 +72,11 @@ pub fn decode_reader(bytes: Vec) -> io::Result { Ok(s) } -/// Compile a FlattenedSierraClass to a ContractClass V1 (casm) using cairo_lang_starknet_classes. -pub fn sierra_to_contact_class_v1(sierra: FlattenedSierraClass) -> StateResult { +/// Compile a FlattenedSierraClass to a versioned ContractClass V1 (casm) using +/// cairo_lang_starknet_classes. +pub fn sierra_to_versioned_contract_class_v1( + sierra: FlattenedSierraClass, +) -> StateResult<(ContractClass, SierraVersion)> { let middle_sierra: MiddleSierraContractClass = { let v = serde_json::to_value(sierra).map_err(serde_err_to_state_err); serde_json::from_value(v?).map_err(serde_err_to_state_err)? @@ -86,6 +89,11 @@ pub fn sierra_to_contact_class_v1(sierra: FlattenedSierraClass) -> StateResult>(); + + let sierra_version = SierraVersion::extract_from_program(&sierra_program_values).unwrap(); + let casm = cairo_lang_starknet_classes::casm_contract_class::CasmContractClass::from_contract_class( sierra, @@ -94,7 +102,8 @@ pub fn sierra_to_contact_class_v1(sierra: FlattenedSierraClass) -> StateResult for OfflineReexecutionData { } } -#[derive(Default)] +#[derive(Clone, Default)] pub struct OfflineStateReader { pub state_maps: StateMaps, pub contract_class_mapping: StarknetContractClassMapping, @@ -157,7 +160,8 @@ impl StateReader for OfflineStateReader { fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { match self.get_contract_class(&class_hash)? { StarknetContractClass::Sierra(sierra) => { - Ok(sierra_to_contact_class_v1(sierra).unwrap().try_into().unwrap()) + let (casm, _) = sierra_to_versioned_contract_class_v1(sierra).unwrap(); + Ok(casm.try_into().unwrap()) } StarknetContractClass::Legacy(legacy) => { Ok(legacy_to_contract_class_v0(legacy).unwrap().try_into().unwrap()) diff --git a/crates/blockifier_reexecution/src/state_reader/reexecution_state_reader.rs b/crates/blockifier_reexecution/src/state_reader/reexecution_state_reader.rs index d6bd84f237b..19b52b66a49 100644 --- a/crates/blockifier_reexecution/src/state_reader/reexecution_state_reader.rs +++ b/crates/blockifier_reexecution/src/state_reader/reexecution_state_reader.rs @@ -2,17 +2,20 @@ use blockifier::blockifier::config::TransactionExecutorConfig; use blockifier::blockifier::transaction_executor::TransactionExecutor; use blockifier::state::cached_state::CommitmentStateDiff; use blockifier::state::state_api::{StateReader, StateResult}; -use blockifier::test_utils::MAX_FEE; use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::transaction_execution::Transaction as BlockifierTransaction; use papyrus_execution::DEPRECATED_CONTRACT_SIERRA_SIZE; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::contract_class::{ClassInfo, SierraVersion}; use starknet_api::core::ClassHash; +use starknet_api::test_utils::MAX_FEE; use starknet_api::transaction::{Transaction, TransactionHash}; use starknet_core::types::ContractClass as StarknetContractClass; -use crate::state_reader::compile::{legacy_to_contract_class_v0, sierra_to_contact_class_v1}; +use crate::state_reader::compile::{ + legacy_to_contract_class_v0, + sierra_to_versioned_contract_class_v1, +}; use crate::state_reader::errors::{ReexecutionError, ReexecutionResult}; pub trait ReexecutionStateReader { @@ -24,14 +27,10 @@ pub trait ReexecutionStateReader { let abi_length = sierra.abi.len(); let sierra_length = sierra.sierra_program.len(); - let sierra_version = SierraVersion::extract_from_program(&sierra.sierra_program)?; + let (contract_class, sierra_version) = + sierra_to_versioned_contract_class_v1(sierra)?; - Ok(ClassInfo::new( - &sierra_to_contact_class_v1(sierra)?, - sierra_length, - abi_length, - sierra_version, - )?) + Ok(ClassInfo::new(&contract_class, sierra_length, abi_length, sierra_version)?) } StarknetContractClass::Legacy(legacy) => { let abi_length = diff --git a/crates/blockifier_reexecution/src/state_reader/reexecution_test.rs b/crates/blockifier_reexecution/src/state_reader/reexecution_test.rs index ac9e97a7861..13b9fb7935e 100644 --- a/crates/blockifier_reexecution/src/state_reader/reexecution_test.rs +++ b/crates/blockifier_reexecution/src/state_reader/reexecution_test.rs @@ -1,6 +1,7 @@ use rstest::rstest; +use starknet_api::block::BlockNumber; -use crate::state_reader::utils::reexecute_block_for_testing; +use crate::state_reader::utils::{get_block_numbers_for_reexecution, reexecute_block_for_testing}; #[rstest] #[case::v_0_13_0(600001)] @@ -18,5 +19,10 @@ use crate::state_reader::utils::reexecute_block_for_testing; #[case::example_l1_handler(868429)] #[ignore = "Requires downloading JSON files prior to running; Long test, run with --release flag."] fn test_block_reexecution(#[case] block_number: u64) { + // Assert that the block number exists in the json file. + assert!( + get_block_numbers_for_reexecution(Some("../../".to_owned())) + .contains(&BlockNumber(block_number)) + ); reexecute_block_for_testing(block_number); } diff --git a/crates/blockifier_reexecution/src/state_reader/test_state_reader.rs b/crates/blockifier_reexecution/src/state_reader/test_state_reader.rs index a17432379ae..2c22083ba15 100644 --- a/crates/blockifier_reexecution/src/state_reader/test_state_reader.rs +++ b/crates/blockifier_reexecution/src/state_reader/test_state_reader.rs @@ -32,7 +32,10 @@ use starknet_gateway::rpc_state_reader::RpcStateReader; use starknet_types_core::felt::Felt; use crate::retry_request; -use crate::state_reader::compile::{legacy_to_contract_class_v0, sierra_to_contact_class_v1}; +use crate::state_reader::compile::{ + legacy_to_contract_class_v0, + sierra_to_versioned_contract_class_v1, +}; use crate::state_reader::errors::ReexecutionResult; use crate::state_reader::offline_state_reader::SerializableDataNextBlock; use crate::state_reader::reexecution_state_reader::{ @@ -65,6 +68,7 @@ pub struct GetTransactionByHashParams { pub transaction_hash: String, } +#[derive(Clone)] pub struct RetryConfig { pub(crate) n_retries: usize, pub(crate) retry_interval_milliseconds: u64, @@ -83,6 +87,7 @@ impl Default for RetryConfig { } } +#[derive(Clone)] pub struct TestStateReader { pub(crate) rpc_state_reader: RpcStateReader, pub(crate) retry_config: RetryConfig, @@ -131,7 +136,8 @@ impl StateReader for TestStateReader { match contract_class { StarknetContractClass::Sierra(sierra) => { - Ok(sierra_to_contact_class_v1(sierra).unwrap().try_into().unwrap()) + let (casm, _) = sierra_to_versioned_contract_class_v1(sierra).unwrap(); + Ok(RunnableCompiledClass::try_from(casm).unwrap()) } StarknetContractClass::Legacy(legacy) => { Ok(legacy_to_contract_class_v0(legacy).unwrap().try_into().unwrap()) diff --git a/crates/blockifier_reexecution/src/state_reader/utils.rs b/crates/blockifier_reexecution/src/state_reader/utils.rs index 4e9bde49bc8..6c4da4e816d 100644 --- a/crates/blockifier_reexecution/src/state_reader/utils.rs +++ b/crates/blockifier_reexecution/src/state_reader/utils.rs @@ -214,7 +214,7 @@ impl From for ComparableStateDiff { } pub fn reexecute_and_verify_correctness< - S: StateReader + Send + Sync, + S: StateReader + Send + Sync + Clone, T: ConsecutiveReexecutionStateReaders, >( consecutive_state_readers: T, @@ -232,9 +232,10 @@ pub fn reexecute_and_verify_correctness< assert_matches!(res, Ok(_)); } - // Finalize block and read actual statediff. - let (actual_state_diff, _, _) = - transaction_executor.finalize().expect("Couldn't finalize block"); + // Finalize block and read actual statediff; using non_consuming_finalize to keep the + // block_state. + let actual_state_diff = + transaction_executor.non_consuming_finalize().expect("Couldn't finalize block").state_diff; assert_eq_state_diff!(expected_state_diff, actual_state_diff); @@ -305,10 +306,11 @@ macro_rules! assert_eq_state_diff { } /// Returns the block numbers for re-execution. -/// There is block number for each Starknet Version (starting v0.13) -/// And some additional block with specific transactions. -pub fn get_block_numbers_for_reexecution() -> Vec { - let file_path = FULL_RESOURCES_DIR.to_string() + "/block_numbers_for_reexecution.json"; +/// There is a block number for each Starknet Version (starting v0.13) +/// And some additional blocks with specific transactions. +pub fn get_block_numbers_for_reexecution(relative_path: Option) -> Vec { + let file_path = relative_path.unwrap_or_default() + + &(FULL_RESOURCES_DIR.to_string() + "/block_numbers_for_reexecution.json"); let block_numbers_examples: HashMap = serde_json::from_str(&read_to_string(file_path.clone()).expect( &("Failed to read the block_numbers_for_reexecution file at ".to_string() + &file_path), diff --git a/crates/mempool_test_utils/Cargo.toml b/crates/mempool_test_utils/Cargo.toml index ef49716460b..2fce0090e55 100644 --- a/crates/mempool_test_utils/Cargo.toml +++ b/crates/mempool_test_utils/Cargo.toml @@ -11,8 +11,8 @@ workspace = true [dependencies] assert_matches.workspace = true blockifier = { workspace = true, features = ["testing"] } -infra_utils.workspace = true pretty_assertions.workspace = true serde_json.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true +starknet_infra_utils.workspace = true diff --git a/crates/mempool_test_utils/src/starknet_api_test_utils.rs b/crates/mempool_test_utils/src/starknet_api_test_utils.rs index ba46f766ccc..b999a812307 100644 --- a/crates/mempool_test_utils/src/starknet_api_test_utils.rs +++ b/crates/mempool_test_utils/src/starknet_api_test_utils.rs @@ -8,7 +8,6 @@ use std::sync::LazyLock; use assert_matches::assert_matches; use blockifier::test_utils::contracts::FeatureContract; use blockifier::test_utils::{create_trivial_calldata, CairoVersion, RunnableCairo1}; -use infra_utils::path::resolve_project_relative_path; use pretty_assertions::assert_ne; use starknet_api::block::GasPrice; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; @@ -29,6 +28,7 @@ use starknet_api::transaction::fields::{ ValidResourceBounds, }; use starknet_api::{declare_tx_args, deploy_account_tx_args, felt, invoke_tx_args, nonce}; +use starknet_infra_utils::path::resolve_project_relative_path; use starknet_types_core::felt::Felt; use crate::{COMPILED_CLASS_HASH_OF_CONTRACT_CLASS, CONTRACT_CLASS_FILE, TEST_FILES_FOLDER}; diff --git a/crates/native_blockifier/Cargo.toml b/crates/native_blockifier/Cargo.toml index e8227d110be..a31df4e7af1 100644 --- a/crates/native_blockifier/Cargo.toml +++ b/crates/native_blockifier/Cargo.toml @@ -7,7 +7,11 @@ license-file.workspace = true description = "A Bridge between the Rust blockifier crate and Python." [features] -cairo_native = ["blockifier/cairo_native"] +cairo_native = [ + "blockifier/cairo_native", + "papyrus_state_reader/cairo_native", + "starknet_sierra_multicompile/cairo_native", +] # Required for `cargo test` to work with Pyo3. # On Python, make sure to compile this with the extension-module feature enabled. # https://pyo3.rs/v0.19.1/faq#i-cant-run-cargo-test-or-i-cant-build-in-a-cargo-workspace-im-having-linker-issues-like-symbol-not-found-or-undefined-reference-to-_pyexc_systemerror @@ -42,12 +46,13 @@ serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, features = ["arbitrary_precision"] } starknet-types-core.workspace = true starknet_api.workspace = true +starknet_sierra_multicompile.workspace = true thiserror.workspace = true [dev-dependencies] -blockifier = { workspace = true, features = ["native_blockifier", "testing"] } +blockifier = { path = "../blockifier", features = ["native_blockifier", "testing"] } cached.workspace = true -papyrus_storage = { workspace = true, features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } pretty_assertions.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } tempfile.workspace = true diff --git a/crates/native_blockifier/src/errors.rs b/crates/native_blockifier/src/errors.rs index 2128f417484..77d4c032487 100644 --- a/crates/native_blockifier/src/errors.rs +++ b/crates/native_blockifier/src/errors.rs @@ -89,6 +89,8 @@ pub enum NativeBlockifierInputError { ProgramError(#[from] ProgramError), #[error(transparent)] PyFeltParseError(#[from] FromStrError), + #[error("Sierra version is missing.")] + MissingSierraVersion, #[error(transparent)] StarknetApiError(#[from] StarknetApiError), #[error("Unknown builtin: {0}.")] diff --git a/crates/native_blockifier/src/lib.rs b/crates/native_blockifier/src/lib.rs index 0524d52fa3e..5d18e3dafb4 100644 --- a/crates/native_blockifier/src/lib.rs +++ b/crates/native_blockifier/src/lib.rs @@ -20,6 +20,11 @@ pub mod state_readers; pub mod storage; pub mod test_utils; +use blockifier::state::stateful_compression::{ + ALIAS_COUNTER_STORAGE_KEY, + MAX_NON_COMPRESSED_CONTRACT_ADDRESS, + MIN_VALUE_FOR_ALIAS_ALLOC, +}; use errors::{add_py_exceptions, UndeclaredClassHashError}; use py_block_executor::PyBlockExecutor; use py_objects::PyExecutionResources; @@ -64,6 +69,12 @@ fn native_blockifier(py: Python<'_>, py_module: &PyModule) -> PyResult<()> { estimate_casm_hash_computation_resources_for_testing_single, py )?)?; + py_module.add("ALIAS_COUNTER_STORAGE_KEY", ALIAS_COUNTER_STORAGE_KEY.to_string())?; + py_module.add( + "MAX_NON_COMPRESSED_CONTRACT_ADDRESS", + MAX_NON_COMPRESSED_CONTRACT_ADDRESS.to_string(), + )?; + py_module.add("INITIAL_AVAILABLE_ALIAS", MIN_VALUE_FOR_ALIAS_ALLOC.to_string())?; Ok(()) } diff --git a/crates/native_blockifier/src/py_block_executor.rs b/crates/native_blockifier/src/py_block_executor.rs index 57a92a16d1f..9b50a8480d6 100644 --- a/crates/native_blockifier/src/py_block_executor.rs +++ b/crates/native_blockifier/src/py_block_executor.rs @@ -4,16 +4,18 @@ use std::collections::HashMap; use blockifier::abi::constants as abi_constants; use blockifier::blockifier::config::{ContractClassManagerConfig, TransactionExecutorConfig}; -use blockifier::blockifier::transaction_executor::{TransactionExecutor, TransactionExecutorError}; +use blockifier::blockifier::transaction_executor::{ + BlockExecutionSummary, + TransactionExecutor, + TransactionExecutorError, +}; use blockifier::bouncer::BouncerConfig; use blockifier::context::{BlockContext, ChainInfo, FeeTokenAddresses}; use blockifier::execution::call_info::CallInfo; -use blockifier::execution::contract_class::VersionedRunnableCompiledClass; use blockifier::fee::receipt::TransactionReceipt; -use blockifier::state::global_cache::GlobalContractCache; +use blockifier::state::contract_class_manager::ContractClassManager; use blockifier::transaction::objects::{ExecutionResourcesTraits, TransactionExecutionInfo}; use blockifier::transaction::transaction_execution::Transaction; -use blockifier::utils::usize_from_u64; use blockifier::versioned_constants::VersionedConstants; use papyrus_state_reader::papyrus_state::PapyrusReader; use pyo3::prelude::*; @@ -45,7 +47,6 @@ use crate::storage::{ }; pub(crate) type RawTransactionExecutionResult = Vec; -pub(crate) type PyVisitedSegmentsMapping = Vec<(PyFelt, Vec)>; #[cfg(test)] #[path = "py_block_executor_test.rs"] @@ -91,11 +92,10 @@ impl ThinTransactionExecutionInfo { } pub fn receipt_to_resources_mapping(receipt: &TransactionReceipt) -> ResourcesMapping { - let GasVector { l1_gas, l1_data_gas, l2_gas } = receipt.gas; let vm_resources = &receipt.resources.computation.vm_resources; let mut resources = HashMap::from([( abi_constants::N_STEPS_RESOURCE.to_string(), - vm_resources.total_n_steps(), + vm_resources.total_n_steps() + receipt.resources.computation.n_reverted_steps, )]); resources.extend( vm_resources @@ -103,26 +103,6 @@ impl ThinTransactionExecutionInfo { .iter() .map(|(builtin, value)| (builtin.to_str_with_suffix().to_string(), *value)), ); - // TODO(Yoni) remove these since we pass the gas vector in separate. - resources.extend(HashMap::from([ - ( - abi_constants::L1_GAS_USAGE.to_string(), - usize_from_u64(l1_gas.0) - .expect("This conversion should not fail as the value is a converted usize."), - ), - ( - abi_constants::BLOB_GAS_USAGE.to_string(), - usize_from_u64(l1_data_gas.0) - .expect("This conversion should not fail as the value is a converted usize."), - ), - ( - abi_constants::L2_GAS_USAGE.to_string(), - usize_from_u64(l2_gas.0) - .expect("This conversion should not fail as the value is a converted usize."), - ), - ])); - *resources.get_mut(abi_constants::N_STEPS_RESOURCE).unwrap_or(&mut 0) += - receipt.resources.computation.n_reverted_steps; ResourcesMapping(resources) } @@ -137,14 +117,13 @@ pub struct PyBlockExecutor { pub tx_executor: Option>, /// `Send` trait is required for `pyclass` compatibility as Python objects must be threadsafe. pub storage: Box, - pub contract_class_manager_config: ContractClassManagerConfig, - pub global_contract_cache: GlobalContractCache, + pub contract_class_manager: ContractClassManager, } #[pymethods] impl PyBlockExecutor { #[new] - #[pyo3(signature = (bouncer_config, concurrency_config, contract_class_manager_config, os_config, target_storage_config, py_versioned_constants_overrides))] + #[pyo3(signature = (bouncer_config, concurrency_config, contract_class_manager_config, os_config, target_storage_config, py_versioned_constants_overrides, stack_size))] pub fn create( bouncer_config: PyBouncerConfig, concurrency_config: PyConcurrencyConfig, @@ -152,6 +131,7 @@ impl PyBlockExecutor { os_config: PyOsConfig, target_storage_config: StorageConfig, py_versioned_constants_overrides: PyVersionedConstantsOverrides, + stack_size: usize, ) -> Self { log::debug!("Initializing Block Executor..."); let storage = @@ -164,14 +144,14 @@ impl PyBlockExecutor { bouncer_config: bouncer_config.try_into().expect("Failed to parse bouncer config."), tx_executor_config: TransactionExecutorConfig { concurrency_config: concurrency_config.into(), + stack_size, }, chain_info: os_config.into_chain_info(), versioned_constants, tx_executor: None, storage: Box::new(storage), - contract_class_manager_config: contract_class_manager_config.into(), - global_contract_cache: GlobalContractCache::new( - contract_class_manager_config.contract_cache_size, + contract_class_manager: ContractClassManager::start( + contract_class_manager_config.into(), ), } } @@ -279,29 +259,24 @@ impl PyBlockExecutor { }) } - /// Returns the state diff, a list of contract class hash with the corresponding list of - /// visited segment values and the block weights. + /// Returns the state diff, the stateful-compressed state diff and the block weights. pub fn finalize( &mut self, - ) -> NativeBlockifierResult<(PyStateDiff, PyVisitedSegmentsMapping, Py)> { + ) -> NativeBlockifierResult<(PyStateDiff, Option, Py)> { log::debug!("Finalizing execution..."); - let (commitment_state_diff, visited_pcs, block_weights) = self.tx_executor().finalize()?; - let visited_pcs = visited_pcs - .into_iter() - .map(|(class_hash, class_visited_pcs_vec)| { - (PyFelt::from(class_hash), class_visited_pcs_vec) - }) - .collect(); - let py_state_diff = PyStateDiff::from(commitment_state_diff); + let BlockExecutionSummary { state_diff, compressed_state_diff, bouncer_weights } = + self.tx_executor().finalize()?; + let py_state_diff = PyStateDiff::from(state_diff); + let py_compressed_state_diff = compressed_state_diff.map(PyStateDiff::from); let serialized_block_weights = - serde_json::to_vec(&block_weights).expect("Failed serializing bouncer weights."); + serde_json::to_vec(&bouncer_weights).expect("Failed serializing bouncer weights."); let raw_block_weights = Python::with_gil(|py| PyBytes::new(py, &serialized_block_weights).into()); log::debug!("Finalized execution."); - Ok((py_state_diff, visited_pcs, raw_block_weights)) + Ok((py_state_diff, py_compressed_state_diff, raw_block_weights)) } // Storage Alignment API. @@ -365,8 +340,8 @@ impl PyBlockExecutor { /// (this is true for every partial existence of information at tables). #[pyo3(signature = (block_number))] pub fn revert_block(&mut self, block_number: u64) -> NativeBlockifierResult<()> { - // Clear global class cache, to peroperly revert classes declared in the reverted block. - self.global_contract_cache.clear(); + // Clear global class cache, to properly revert classes declared in the reverted block. + self.contract_class_manager.clear(); self.storage.revert_block(block_number) } @@ -379,7 +354,7 @@ impl PyBlockExecutor { self.storage.close(); } - #[pyo3(signature = (concurrency_config, contract_class_manager_config, os_config, path, max_state_diff_size))] + #[pyo3(signature = (concurrency_config, contract_class_manager_config, os_config, path, max_state_diff_size, stack_size))] #[staticmethod] fn create_for_testing( concurrency_config: PyConcurrencyConfig, @@ -387,6 +362,7 @@ impl PyBlockExecutor { os_config: PyOsConfig, path: std::path::PathBuf, max_state_diff_size: usize, + stack_size: usize, ) -> Self { use blockifier::bouncer::BouncerWeights; // TODO(Meshi, 01/01/2025): Remove this once we fix all python tests that re-declare cairo0 @@ -402,14 +378,14 @@ impl PyBlockExecutor { }, tx_executor_config: TransactionExecutorConfig { concurrency_config: concurrency_config.into(), + stack_size, }, storage: Box::new(PapyrusStorage::new_for_testing(path, &os_config.chain_id)), chain_info: os_config.into_chain_info(), versioned_constants, tx_executor: None, - contract_class_manager_config: contract_class_manager_config.into(), - global_contract_cache: GlobalContractCache::new( - contract_class_manager_config.contract_cache_size, + contract_class_manager: ContractClassManager::start( + contract_class_manager_config.into(), ), } } @@ -426,12 +402,11 @@ impl PyBlockExecutor { PapyrusReader::new( self.storage.reader().clone(), next_block_number, - self.global_contract_cache.clone(), + self.contract_class_manager.clone(), ) } pub fn create_for_testing_with_storage(storage: impl Storage + Send + 'static) -> Self { - use blockifier::state::global_cache::GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST; Self { bouncer_config: BouncerConfig::max(), tx_executor_config: TransactionExecutorConfig::create_for_testing(true), @@ -439,12 +414,9 @@ impl PyBlockExecutor { chain_info: ChainInfo::default(), versioned_constants: VersionedConstants::latest_constants().clone(), tx_executor: None, - contract_class_manager_config: ContractClassManagerConfig { - run_cairo_native: false, - wait_on_native_compilation: false, - contract_cache_size: GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST, - }, - global_contract_cache: GlobalContractCache::new(GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST), + contract_class_manager: ContractClassManager::start( + ContractClassManagerConfig::default(), + ), } } @@ -455,6 +427,7 @@ impl PyBlockExecutor { os_config: PyOsConfig, path: std::path::PathBuf, max_state_diff_size: usize, + stack_size: usize, ) -> Self { Self::create_for_testing( concurrency_config, @@ -462,6 +435,7 @@ impl PyBlockExecutor { os_config, path, max_state_diff_size, + stack_size, ) } } diff --git a/crates/native_blockifier/src/py_block_executor_test.rs b/crates/native_blockifier/src/py_block_executor_test.rs index d223df4657a..d8ac772cbef 100644 --- a/crates/native_blockifier/src/py_block_executor_test.rs +++ b/crates/native_blockifier/src/py_block_executor_test.rs @@ -1,12 +1,12 @@ use std::collections::HashMap; -use blockifier::blockifier::transaction_executor::BLOCK_STATE_ACCESS_ERR; +use blockifier::blockifier::transaction_executor::{BLOCK_STATE_ACCESS_ERR, DEFAULT_STACK_SIZE}; use blockifier::execution::contract_class::{CompiledClassV1, RunnableCompiledClass}; use blockifier::state::state_api::StateReader; -use cached::Cached; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use pretty_assertions::assert_eq; use starknet_api::class_hash; +use starknet_api::contract_class::SierraVersion; use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; use starknet_api::state::SierraContractClass; use starknet_types_core::felt::Felt; @@ -32,8 +32,13 @@ fn global_contract_cache_update() { entry_points_by_type: Default::default(), }; let sierra = SierraContractClass::default(); - let contract_class = - RunnableCompiledClass::V1(CompiledClassV1::try_from(casm.clone()).unwrap()); + let contract_class = RunnableCompiledClass::V1( + CompiledClassV1::try_from(( + casm.clone(), + SierraVersion::extract_from_program(&sierra.sierra_program).unwrap(), + )) + .unwrap(), + ); let class_hash = class_hash!("0x1"); let temp_storage_path = tempfile::tempdir().unwrap().into_path(); @@ -43,6 +48,7 @@ fn global_contract_cache_update() { PyOsConfig::default(), temp_storage_path, 4000, + DEFAULT_STACK_SIZE, ); block_executor .append_block( @@ -69,7 +75,7 @@ fn global_contract_cache_update() { ) .unwrap(); - assert_eq!(block_executor.global_contract_cache.lock().cache_size(), 0); + assert_eq!(block_executor.contract_class_manager.get_casm_cache_size(), 0); let queried_contract_class = block_executor .tx_executor() @@ -80,7 +86,7 @@ fn global_contract_cache_update() { .unwrap(); assert_eq!(queried_contract_class, contract_class); - assert_eq!(block_executor.global_contract_cache.lock().cache_size(), 1); + assert_eq!(block_executor.contract_class_manager.get_casm_cache_size(), 1); } #[test] @@ -124,6 +130,7 @@ fn global_contract_cache_update_large_contract() { Default::default(), temp_storage_path, 4000, + DEFAULT_STACK_SIZE, ); block_executor .append_block( diff --git a/crates/native_blockifier/src/py_l1_handler.rs b/crates/native_blockifier/src/py_l1_handler.rs index df90b9642ed..1816e42a7ce 100644 --- a/crates/native_blockifier/src/py_l1_handler.rs +++ b/crates/native_blockifier/src/py_l1_handler.rs @@ -1,6 +1,5 @@ use std::sync::Arc; -use blockifier::abi::constants; use pyo3::prelude::*; use starknet_api::core::{ContractAddress, EntryPointSelector, Nonce}; use starknet_api::executable_transaction::L1HandlerTransaction; @@ -22,7 +21,7 @@ impl TryFrom for starknet_api::transaction::L1HandlerTra type Error = NativeBlockifierInputError; fn try_from(tx: PyL1HandlerTransaction) -> Result { Ok(Self { - version: constants::L1_HANDLER_VERSION, + version: starknet_api::transaction::L1HandlerTransaction::VERSION, nonce: Nonce(tx.nonce.0), contract_address: ContractAddress::try_from(tx.contract_address.0)?, entry_point_selector: EntryPointSelector(tx.entry_point_selector.0), diff --git a/crates/native_blockifier/src/py_objects.rs b/crates/native_blockifier/src/py_objects.rs index d2390eeaec3..65c82a110b5 100644 --- a/crates/native_blockifier/src/py_objects.rs +++ b/crates/native_blockifier/src/py_objects.rs @@ -1,16 +1,23 @@ #![allow(non_local_definitions)] use std::collections::HashMap; +use std::path::PathBuf; use blockifier::abi::constants; -use blockifier::blockifier::config::{ConcurrencyConfig, ContractClassManagerConfig}; +use blockifier::blockifier::config::{ + CairoNativeRunConfig, + ConcurrencyConfig, + ContractClassManagerConfig, +}; use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount, HashMapWrapper}; +use blockifier::state::contract_class_manager::DEFAULT_COMPILATION_REQUEST_CHANNEL_SIZE; use blockifier::state::global_cache::GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST; use blockifier::versioned_constants::VersionedConstantsOverrides; use cairo_vm::types::builtin_name::BuiltinName; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use pyo3::prelude::*; use starknet_api::execution_resources::GasAmount; +use starknet_sierra_multicompile::config::SierraCompilationConfig; use crate::errors::{ InvalidNativeBlockifierInputError, @@ -159,20 +166,82 @@ impl From for ConcurrencyConfig { } } } +#[derive(Clone, Debug, Default, FromPyObject)] +pub struct PySierraCompilationConfig { + pub sierra_to_native_compiler_path: String, + pub libcairo_native_runtime_path: String, + pub max_native_bytecode_size: u64, + pub max_cpu_time: u64, + pub max_memory_usage: u64, +} -#[derive(Debug, Clone, Copy, FromPyObject)] -pub struct PyContractClassManagerConfig { +impl From for SierraCompilationConfig { + fn from(py_sierra_compilation_config: PySierraCompilationConfig) -> Self { + SierraCompilationConfig { + sierra_to_native_compiler_path: if py_sierra_compilation_config + .sierra_to_native_compiler_path + .is_empty() + { + None + } else { + Some(PathBuf::from(py_sierra_compilation_config.sierra_to_native_compiler_path)) + }, + libcairo_native_runtime_path: if py_sierra_compilation_config + .libcairo_native_runtime_path + .is_empty() + { + None + } else { + Some(PathBuf::from(py_sierra_compilation_config.libcairo_native_runtime_path)) + }, + max_native_bytecode_size: py_sierra_compilation_config.max_native_bytecode_size, + max_cpu_time: py_sierra_compilation_config.max_cpu_time, + max_memory_usage: py_sierra_compilation_config.max_memory_usage, + ..Default::default() + } + } +} + +#[derive(Clone, Debug, FromPyObject)] +pub struct PyCairoNativeRunConfig { pub run_cairo_native: bool, pub wait_on_native_compilation: bool, - pub contract_cache_size: usize, + pub channel_size: usize, } -impl Default for PyContractClassManagerConfig { +impl Default for PyCairoNativeRunConfig { fn default() -> Self { Self { run_cairo_native: false, wait_on_native_compilation: false, + channel_size: DEFAULT_COMPILATION_REQUEST_CHANNEL_SIZE, + } + } +} + +impl From for CairoNativeRunConfig { + fn from(py_cairo_native_run_config: PyCairoNativeRunConfig) -> Self { + CairoNativeRunConfig { + run_cairo_native: py_cairo_native_run_config.run_cairo_native, + wait_on_native_compilation: py_cairo_native_run_config.wait_on_native_compilation, + channel_size: py_cairo_native_run_config.channel_size, + } + } +} + +#[derive(Debug, Clone, FromPyObject)] +pub struct PyContractClassManagerConfig { + pub contract_cache_size: usize, + pub cairo_native_run_config: PyCairoNativeRunConfig, + pub native_compiler_config: PySierraCompilationConfig, +} + +impl Default for PyContractClassManagerConfig { + fn default() -> Self { + Self { contract_cache_size: GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST, + cairo_native_run_config: PyCairoNativeRunConfig::default(), + native_compiler_config: PySierraCompilationConfig::default(), } } } @@ -180,9 +249,11 @@ impl Default for PyContractClassManagerConfig { impl From for ContractClassManagerConfig { fn from(py_contract_class_manager_config: PyContractClassManagerConfig) -> Self { ContractClassManagerConfig { - run_cairo_native: py_contract_class_manager_config.run_cairo_native, - wait_on_native_compilation: py_contract_class_manager_config.wait_on_native_compilation, contract_cache_size: py_contract_class_manager_config.contract_cache_size, + cairo_native_run_config: py_contract_class_manager_config + .cairo_native_run_config + .into(), + native_compiler_config: py_contract_class_manager_config.native_compiler_config.into(), } } } diff --git a/crates/native_blockifier/src/py_state_diff.rs b/crates/native_blockifier/src/py_state_diff.rs index b6e6647ff16..af6353fa6f0 100644 --- a/crates/native_blockifier/src/py_state_diff.rs +++ b/crates/native_blockifier/src/py_state_diff.rs @@ -19,6 +19,7 @@ use crate::errors::{ }; use crate::py_utils::PyFelt; +// TODO(Arni): consider moving to starknet api. const DEFAULT_ETH_L1_GAS_PRICE: GasPrice = GasPrice(100 * u128::pow(10, 9)); const DEFAULT_STRK_L1_GAS_PRICE: GasPrice = GasPrice(100 * u128::pow(10, 9)); const DEFAULT_ETH_L1_DATA_GAS_PRICE: GasPrice = GasPrice(u128::pow(10, 6)); diff --git a/crates/native_blockifier/src/py_transaction.rs b/crates/native_blockifier/src/py_transaction.rs index 10fc32a1d1c..6d7bf55ce75 100644 --- a/crates/native_blockifier/src/py_transaction.rs +++ b/crates/native_blockifier/src/py_transaction.rs @@ -179,9 +179,10 @@ impl PyClassInfo { ContractClass::V0(serde_json::from_str(&py_class_info.raw_contract_class)?) } starknet_api::transaction::DeclareTransaction::V2(_) - | starknet_api::transaction::DeclareTransaction::V3(_) => { - ContractClass::V1(serde_json::from_str(&py_class_info.raw_contract_class)?) - } + | starknet_api::transaction::DeclareTransaction::V3(_) => ContractClass::V1(( + serde_json::from_str(&py_class_info.raw_contract_class)?, + SierraVersion::from(py_class_info.sierra_version), + )), }; let (major, minor, patch) = py_class_info.sierra_version; diff --git a/crates/native_blockifier/src/state_readers/py_state_reader.rs b/crates/native_blockifier/src/state_readers/py_state_reader.rs index 35cdde1d914..037a6f4b72f 100644 --- a/crates/native_blockifier/src/state_readers/py_state_reader.rs +++ b/crates/native_blockifier/src/state_readers/py_state_reader.rs @@ -5,7 +5,9 @@ use blockifier::execution::contract_class::{ }; use blockifier::state::errors::StateError; use blockifier::state::state_api::{StateReader, StateResult}; +use pyo3::types::PyTuple; use pyo3::{FromPyObject, PyAny, PyErr, PyObject, PyResult, Python}; +use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; use starknet_api::state::StorageKey; use starknet_types_core::felt::Felt; @@ -71,13 +73,30 @@ impl StateReader for PyStateReader { fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { Python::with_gil(|py| -> Result { let args = (PyFelt::from(class_hash),); - let py_raw_compiled_class: PyRawCompiledClass = self + let py_versioned_raw_compiled_class: &PyTuple = self .state_reader_proxy .as_ref(py) - .call_method1("get_raw_compiled_class", args)? - .extract()?; + .call_method1("get_versioned_raw_compiled_class", args)? + .downcast()?; - Ok(RunnableCompiledClass::try_from(py_raw_compiled_class)?) + // Extract the raw compiled class + let py_raw_compiled_class: PyRawCompiledClass = + py_versioned_raw_compiled_class.get_item(0)?.extract()?; + + // Extract and process the Sierra version + let (minor, major, patch): (u64, u64, u64) = + py_versioned_raw_compiled_class.get_item(1)?.extract()?; + + let sierra_version = SierraVersion::new(major, minor, patch); + + let versioned_py_raw_compiled_class = VersionedPyRawClass { + raw_compiled_class: py_raw_compiled_class, + optional_sierra_version: Some(sierra_version), + }; + + let runnable_compiled_class = + RunnableCompiledClass::try_from(versioned_py_raw_compiled_class)?; + Ok(runnable_compiled_class) }) .map_err(|err| { if Python::with_gil(|py| err.is_instance_of::(py)) { @@ -107,15 +126,30 @@ pub struct PyRawCompiledClass { pub version: usize, } -impl TryFrom for RunnableCompiledClass { +pub struct VersionedPyRawClass { + raw_compiled_class: PyRawCompiledClass, + optional_sierra_version: Option, +} + +impl TryFrom for RunnableCompiledClass { type Error = NativeBlockifierError; - fn try_from(raw_compiled_class: PyRawCompiledClass) -> NativeBlockifierResult { + fn try_from(versioned_raw_compiled_class: VersionedPyRawClass) -> NativeBlockifierResult { + let raw_compiled_class = versioned_raw_compiled_class.raw_compiled_class; + match raw_compiled_class.version { 0 => Ok(CompiledClassV0::try_from_json_string(&raw_compiled_class.raw_compiled_class)? .into()), - 1 => Ok(CompiledClassV1::try_from_json_string(&raw_compiled_class.raw_compiled_class)? - .into()), + 1 => { + let sierra_version = versioned_raw_compiled_class + .optional_sierra_version + .ok_or(NativeBlockifierInputError::MissingSierraVersion)?; + Ok(CompiledClassV1::try_from_json_string( + &raw_compiled_class.raw_compiled_class, + sierra_version, + )? + .into()) + } _ => Err(NativeBlockifierInputError::UnsupportedContractClassVersion { version: raw_compiled_class.version, })?, diff --git a/crates/papyrus_base_layer/Cargo.toml b/crates/papyrus_base_layer/Cargo.toml index 91092fa7d10..169800c2590 100644 --- a/crates/papyrus_base_layer/Cargo.toml +++ b/crates/papyrus_base_layer/Cargo.toml @@ -17,7 +17,7 @@ alloy-dyn-abi.workspace = true alloy-json-rpc.workspace = true alloy-primitives.workspace = true alloy-provider.workspace = true -alloy-sol-types.workspace = true +alloy-sol-types = { workspace = true, features = ["json"] } alloy-transport.workspace = true alloy-transport-http.workspace = true async-trait.workspace = true @@ -35,7 +35,7 @@ url = { workspace = true, features = ["serde"] } [dev-dependencies] ethers-core.workspace = true -papyrus_base_layer = { workspace = true, features = ["testing"] } +papyrus_base_layer = { path = "../papyrus_base_layer", features = ["testing"] } pretty_assertions.workspace = true starknet-types-core.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } diff --git a/crates/papyrus_base_layer/resources/Starknet-0.10.3.4.json b/crates/papyrus_base_layer/resources/Starknet-0.10.3.4.json new file mode 100644 index 00000000000..b54eadd25ba --- /dev/null +++ b/crates/papyrus_base_layer/resources/Starknet-0.10.3.4.json @@ -0,0 +1,831 @@ +{ + "contractName": "Starknet", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "fromAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "toAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + } + ], + "name": "ConsumedMessageToL1", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "fromAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "ConsumedMessageToL2", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Finalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "fromAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "toAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + } + ], + "name": "LogMessageToL1", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "fromAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fee", + "type": "uint256" + } + ], + "name": "LogMessageToL2", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "acceptedGovernor", + "type": "address" + } + ], + "name": "LogNewGovernorAccepted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "nominatedGovernor", + "type": "address" + } + ], + "name": "LogNominatedGovernor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "LogNominationCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "LogOperatorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "LogOperatorRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "removedGovernor", + "type": "address" + } + ], + "name": "LogRemovedGovernor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "stateTransitionFact", + "type": "bytes32" + } + ], + "name": "LogStateTransitionFact", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "globalRoot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "int256", + "name": "blockNumber", + "type": "int256" + } + ], + "name": "LogStateUpdate", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "fromAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "MessageToL2Canceled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "fromAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "MessageToL2CancellationStarted", + "type": "event" + }, + { + "inputs": [], + "name": "MAX_L1_MSG_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "cancelL1ToL2Message", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "configHash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "fromAddress", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + } + ], + "name": "consumeMessageFromL2", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finalize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "identify", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isFinalized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isFrozen", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "isOperator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "l1ToL2MessageCancellations", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "l1ToL2MessageNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "l1ToL2Messages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "msgHash", + "type": "bytes32" + } + ], + "name": "l2ToL1Messages", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "messageCancellationDelay", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "programHash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOperator", + "type": "address" + } + ], + "name": "registerOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + } + ], + "name": "sendMessageToL2", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newConfigHash", + "type": "uint256" + } + ], + "name": "setConfigHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "delayInSeconds", + "type": "uint256" + } + ], + "name": "setMessageCancellationDelay", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newProgramHash", + "type": "uint256" + } + ], + "name": "setProgramHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "starknetAcceptGovernance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "starknetCancelNomination", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "starknetIsGovernor", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newGovernor", + "type": "address" + } + ], + "name": "starknetNominateNewGovernor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "governorForRemoval", + "type": "address" + } + ], + "name": "starknetRemoveGovernor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "toAddress", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "selector", + "type": "uint256" + }, + { + "internalType": "uint256[]", + "name": "payload", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "nonce", + "type": "uint256" + } + ], + "name": "startL1ToL2MessageCancellation", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stateBlockNumber", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stateBlockHash", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "stateRoot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "removedOperator", + "type": "address" + } + ], + "name": "unregisterOperator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "programOutput", + "type": "uint256[]" + }, + { + "internalType": "uint256", + "name": "onchainDataHash", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "onchainDataSize", + "type": "uint256" + } + ], + "name": "updateState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60a060405234801561001057600080fd5b5030606081901b608052612d73610031600039806108a35250612d736000f3fe6080604052600436106101d85760003560e01c80637cbe06d11161010257806396115bc211610095578063e1f1176d11610064578063e1f1176d146104f5578063e37fec251461050a578063e87e73321461051f578063eeb728661461053f576101d8565b806396115bc2146104755780639be446bf14610495578063a46efaf3146104b5578063c99d397f146104d5576101d8565b80638d4e4083116100d15780638d4e40831461041657806391a66a261461042b578063946be3ed1461044b5780639588eca214610460576101d8565b80637cbe06d1146103b75780638303bd8a146103cc57806384f921cd146103e15780638a9bf09014610401576101d8565b80633e3aa6c51161017a5780636d70f7ae116101495780636d70f7ae14610337578063775526411461035757806377c7d7a9146103775780637a98660b14610397576101d8565b80633e3aa6c5146102c1578063439fab91146102e25780634bb278f3146103025780636170ff1b14610317576101d8565b806333eeb147116101b657806333eeb1471461025557806335befa5d1461026a5780633682a4501461027f5780633d07b336146102a1576101d8565b8063018cccdf146101dd57806301a01590146102085780632c9dd5c014610235575b600080fd5b3480156101e957600080fd5b506101f2610561565b6040516101ff9190612439565b60405180910390f35b34801561021457600080fd5b50610228610223366004611fd7565b6105a6565b6040516101ff919061242e565b34801561024157600080fd5b506101f261025036600461216f565b6105b7565b34801561026157600080fd5b5061022861069a565b34801561027657600080fd5b506101f261069f565b34801561028b57600080fd5b5061029f61029a366004611fd7565b6106b2565b005b3480156102ad57600080fd5b5061029f6102bc366004612069565b610753565b6102d46102cf3660046121b9565b6107a6565b6040516101ff929190612442565b3480156102ee57600080fd5b5061029f6102fd366004612081565b6108a1565b34801561030e57600080fd5b5061029f6109e9565b34801561032357600080fd5b506101f261033236600461220a565b610a81565b34801561034357600080fd5b50610228610352366004611fd7565b610bc3565b34801561036357600080fd5b5061029f610372366004611ffa565b610bf0565b34801561038357600080fd5b506101f2610392366004612069565b610e4a565b3480156103a357600080fd5b506101f26103b236600461220a565b610e65565b3480156103c357600080fd5b506101f2610f1c565b3480156103d857600080fd5b506101f2610f28565b3480156103ed57600080fd5b5061029f6103fc366004611fd7565b610f4b565b34801561040d57600080fd5b506101f2610f54565b34801561042257600080fd5b50610228610f77565b34801561043757600080fd5b5061029f610446366004611fd7565b610f9a565b34801561045757600080fd5b5061029f610fa3565b34801561046c57600080fd5b506101f2610fad565b34801561048157600080fd5b5061029f610490366004611fd7565b610fbd565b3480156104a157600080fd5b506101f26104b0366004612069565b611053565b3480156104c157600080fd5b506101f26104d0366004612069565b61105d565b3480156104e157600080fd5b5061029f6104f0366004612069565b611067565b34801561050157600080fd5b506101f26110ba565b34801561051657600080fd5b5061029f6110dd565b34801561052b57600080fd5b5061029f61053a366004612069565b6110e5565b34801561054b57600080fd5b50610554611138565b6040516101ff919061247f565b60006105a16040518060400160405280602081526020017f535441524b4e45545f312e305f4d5347494e475f4c31544f4c325f4e4f4e434581525061116f565b905090565b60006105b1826111a3565b92915050565b60405160009081906105d59086903390869088908290602001612311565b60405160208183030381529060405280519060200120905060006105f76111d2565b600083815260209190915260409020541161062d5760405162461bcd60e51b8152600401610624906129ca565b60405180910390fd5b336001600160a01b0316857f7a06c571aa77f34d9706c51e5d8122b5595aebeaa34233bfe866f22befb973b18686604051610669929190612387565b60405180910390a3600161067b6111d2565b6000838152602091909152604090208054919091039055949350505050565b600090565b60006106a96111f5565b60010154905090565b6106bb336111a3565b6106d75760405162461bcd60e51b8152600401610624906128e1565b6106e081610bc3565b6107505760016106ee61123f565b6001600160a01b0383166000908152602091909152604090819020805460ff191692151592909217909155517f50a18c352ee1c02ffe058e15c2eb6e58be387c81e73cc1e17035286e54c19a5790610747908390612373565b60405180910390a15b50565b61075b610f77565b156107785760405162461bcd60e51b8152600401610624906128be565b610781336111a3565b61079d5760405162461bcd60e51b8152600401610624906128e1565b61075081611262565b600080670de0b6b3a76400003411156107d15760405162461bcd60e51b81526004016106249061268c565b60006107db610561565b905061081f6040518060400160405280602081526020017f535441524b4e45545f312e305f4d5347494e475f4c31544f4c325f4e4f4e434581525082600101611280565b8587336001600160a01b03167fdb80dd488acf86d17c747445b0eabb5d57c541d3bd7b6b87af987858e5066b2b8888863460405161086094939291906123bf565b60405180910390a4600061087788888888866112b3565b9050346001016108856112f4565b6000838152602091909152604090205597909650945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163014156108ea5760405162461bcd60e51b815260040161062490612721565b60006108f461069a565b6020908102915081018083101561091d5760405162461bcd60e51b815260040161062490612966565b600061092b82848688612b44565b8101906109389190611fd7565b90503660006109498582888a612b44565b9150915061095782826109e5565b3660006109668887818c612b44565b90925090506001600160a01b0385161561099157610985858383611317565b505050505050506109e5565b61099961143c565b156109c15780156109bc5760405162461bcd60e51b8152600401610624906126c3565b6109dd565b6109cb828261144d565b6109d582826114ad565b6109dd611507565b505050505050505b5050565b6109f2336111a3565b610a0e5760405162461bcd60e51b8152600401610624906128e1565b610a16610f77565b15610a335760405162461bcd60e51b8152600401610624906128be565b610a56604051806060016040528060318152602001612d0d603191396001611280565b6040517f6823b073d48d6e3a7d385eeb601452d680e74bb46afe3255a7d778f3a9b1768190600090a1565b60008486336001600160a01b03167f8abd2ec2e0a10c82f5b60ea00455fa96c41fd144f225fcc52b8d83d94f803ed8878787604051610ac29392919061239b565b60405180910390a46000610ad987878787876112b3565b90506000610ae56112f4565b60008381526020919091526040902054905080610b145760405162461bcd60e51b815260040161062490612822565b6000610b1e61155e565b60008481526020919091526040902054905080610b4d5760405162461bcd60e51b815260040161062490612ad7565b6000610b57610f28565b8201905081811015610b7b5760405162461bcd60e51b8152600401610624906125ec565b80421015610b9b5760405162461bcd60e51b815260040161062490612623565b6000610ba56112f4565b60008681526020919091526040902055509198975050505050505050565b6000610bcd61123f565b6001600160a01b0392909216600090815260209290925250604090205460ff1690565b610bf933610bc3565b610c155760405162461bcd60e51b815260040161062490612a2e565b610c1f8484611581565b83836003818110610c2c57fe5b90506020020135610c3b6110ba565b14610c585760405162461bcd60e51b815260040161062490612592565b6000610c7985856040518060400160405280878152602001868152506115a1565b90506000610c85610f54565b82604051602001610c97929190612442565b604051602081830303815290604052805190602001209050610cb761161c565b6001600160a01b0316636a938567826040518263ffffffff1660e01b8152600401610ce29190612439565b60206040518083038186803b158015610cfa57600080fd5b505afa158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d329190612049565b610d4e5760405162461bcd60e51b81526004016106249061290a565b7f9866f8ddfe70bb512b2f2b28b49d4017c43f7ba775f1a20c61c13eea8cdac11182604051610d7d9190612439565b60405180910390a16004610da56001610d988884818c612b19565b610da06111d2565b61163f565b01610dbf6000610db78884818c612b19565b610da06112f4565b01858114610ddf5760405162461bcd60e51b8152600401610624906127eb565b610df38787610dec6111f5565b9190611a34565b6000610dfd6111f5565b90507fe8012213bb931d3efa0a954cfb0d7b75f2a5e2358ba5f7d3edfb0154f6e7a56881600001548260010154604051610e38929190612442565b60405180910390a15050505050505050565b6000610e546112f4565b600092835260205250604090205490565b60008486336001600160a01b03167f2e00dccd686fd6823ec7dc3e125582aa82881b6ff5f6b5a73856e1ea8338a3be878787604051610ea69392919061239b565b60405180910390a46000610ebd87878787876112b3565b90506000610ec96112f4565b60008381526020919091526040902054905080610ef85760405162461bcd60e51b815260040161062490612822565b42610f0161155e565b60008481526020919091526040902055509695505050505050565b670de0b6b3a764000081565b60006105a16040518060600160405280602d8152602001612c76602d913961116f565b61075081611ac3565b60006105a1604051806060016040528060238152602001612c536023913961116f565b60006105a1604051806060016040528060318152602001612d0d6031913961116f565b61075081611b9e565b610fab611c93565b565b6000610fb76111f5565b54905090565b610fc6336111a3565b610fe25760405162461bcd60e51b8152600401610624906128e1565b610feb81610bc3565b15610750576000610ffa61123f565b6001600160a01b0383166000908152602091909152604090819020805460ff191692151592909217909155517fec5f6c3a91a1efb1f9a308bb33c6e9e66bf9090fad0732f127dfdbf516d0625d90610747908390612373565b6000610e5461155e565b6000610e546111d2565b61106f610f77565b1561108c5760405162461bcd60e51b8152600401610624906128be565b611095336111a3565b6110b15760405162461bcd60e51b8152600401610624906128e1565b61075081611cf6565b60006105a1604051806060016040528060218152602001612ca36021913961116f565b610fab611d18565b6110ed610f77565b1561110a5760405162461bcd60e51b8152600401610624906128be565b611113336111a3565b61112f5760405162461bcd60e51b8152600401610624906128e1565b61075081611d9b565b60408051808201909152601981527f537461726b576172655f537461726b6e65745f323032325f3400000000000000602082015290565b6000808260405160200161118391906122f2565b60408051601f198184030181529190528051602090910120549392505050565b6000806111ae611dbd565b6001600160a01b039390931660009081526020939093525050604090205460ff1690565b60006105a1604051806060016040528060238152602001612cc460239139611e06565b600080604051806060016040528060278152602001612c2c6027913960405160200161122191906122f2565b60408051601f19818403018152919052805160209091012092915050565b60006105a1604051806060016040528060288152602001612bd460289139611e06565b610750604051806060016040528060218152602001612ca360219139825b60008260405160200161129391906122f2565b604051602081830303815290604052805190602001209050818155505050565b6040516000906112d390339088908590899088908a90829060200161233b565b60405160208183030381529060405280519060200120905095945050505050565b60006105a1604051806060016040528060268152602001612ce760269139611e06565b611329836001600160a01b0316611e39565b6113455760405162461bcd60e51b8152600401610624906124b2565b60006060846001600160a01b031663439fab9160e01b858560405160240161136e929190612450565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516113ac91906122f2565b600060405180830381855af49150503d80600081146113e7576040519150601f19603f3d011682016040523d82523d6000602084013e6113ec565b606091505b50915091508181906114115760405162461bcd60e51b8152600401610624919061247f565b5080518190156114345760405162461bcd60e51b8152600401610624919061247f565b505050505050565b6000611446610f54565b1515905090565b60a0811461146d5760405162461bcd60e51b815260040161062490612509565b600061147c6020828486612b44565b8101906114899190612069565b9050806114a85760405162461bcd60e51b815260040161062490612788565b505050565b60008060006114ba611f7b565b6114c6858701876120ee565b93509350935093506114d784611d9b565b6114e083611e3f565b6114f2816114ec6111f5565b90611e61565b6114fb82611262565b61143462069780611cf6565b6000611511611dbd565b6001810154909150600160a01b900460ff16156115405760405162461bcd60e51b8152600401610624906125bf565b60018101805460ff60a01b1916600160a01b17905561075033611e71565b60006105a1604051806060016040528060308152602001612bfc60309139611e06565b600481116109e55760405162461bcd60e51b815260040161062490612850565b604051600090839082906115bb90879084906020016122c2565b604051602081830303815290604052805190602001209050600081838660000151876020015186016040516020016115f694939291906122d7565b60408051808303601f190181529190528051602090910120600101979650505050505050565b60006105a1604051806060016040528060228152602001612bb26022913961116f565b6000808484600081811061164f57fe5b9050602002013590506340000000811061167b5760405162461bcd60e51b8152600401610624906127b4565b600181810160008861168e576004611691565b60025b905060005b82841015611983578382018881106116c05760405162461bcd60e51b8152600401610624906124de565b60008a8a838181106116ce57fe5b905060200201359050634000000081106116fa5760405162461bcd60e51b8152600401610624906126f1565b8181016001018a8111156117205760405162461bcd60e51b815260040161062490612887565b8c156117fe5760008c8c8990849261173a93929190612b19565b60405160200161174b9291906122c2565b6040516020818303038152906040528051906020012090508c8c60018a0181811061177257fe5b905060200201356001600160a01b03168d8d60008b0181811061179157fe5b905060200201357f4264ac208b5fde633ccdd42e0f12c3d6d443a4f3779bbf886925b94665b63a228f8f60038d019087926117ce93929190612b19565b6040516117dc929190612387565b60405180910390a3600090815260208b90526040902080546001019055611979565b60008c8c8990849261181293929190612b19565b6040516020016118239291906122c2565b60408051601f1981840301815291815281516020928301206000818152928e9052912054909150806118675760405162461bcd60e51b8152600401610624906129ca565b600091825260208c9052604082208290559490940160001901938c8c60028a0181811061189057fe5b90506020020135905060608d8d60058b019085926118b093929190612b19565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505090508d8d60038b0181811061190157fe5b905060200201358e8e60018c0181811061191757fe5b905060200201358f8f60008d0181811061192d57fe5b905060200201356001600160a01b03167f9592d37825c744e33fa80c469683bbd04d336241bb600b574758efd182abe26a848660405161196e9291906123e6565b60405180910390a450505b9550611696915050565b8284146119a25760405162461bcd60e51b8152600401610624906127b4565b8015611a26576000336001600160a01b0316826040516119c19061230e565b60006040518083038185875af1925050503d80600081146119fe576040519150601f19603f3d011682016040523d82523d6000602084013e611a03565b606091505b5050905080611a245760405162461bcd60e51b815260040161062490612a01565b505b509198975050505050505050565b60018381018054909101905581816002818110611a4d57fe5b90506020020135836001015414611a765760405162461bcd60e51b815260040161062490612a55565b366000611a838484611ef7565b91509150611a918282611f13565b855414611ab05760405162461bcd60e51b815260040161062490612563565b611aba8282611f31565b90945550505050565b611acc336111a3565b611ae85760405162461bcd60e51b8152600401610624906128e1565b336001600160a01b0382161415611b115760405162461bcd60e51b815260040161062490612a83565b6000611b1b611dbd565b9050611b26826111a3565b611b425760405162461bcd60e51b815260040161062490612ab1565b6001600160a01b03821660009081526020829052604090819020805460ff19169055517fd75f94825e770b8b512be8e74759e252ad00e102e38f50cce2f7c6f868a2959990611b92908490612373565b60405180910390a15050565b611ba7336111a3565b611bc35760405162461bcd60e51b8152600401610624906128e1565b6000611bcd611dbd565b90506001600160a01b038216611bf55760405162461bcd60e51b815260040161062490612941565b611bfe826111a3565b15611c1b5760405162461bcd60e51b815260040161062490612539565b60018101546001600160a01b031615611c465760405162461bcd60e51b815260040161062490612993565b6001810180546001600160a01b0319166001600160a01b0384161790556040517f6166272c8d3f5f579082f2827532732f97195007983bb5b83ac12c56700b01a690611b92908490612373565b6000611c9d611dbd565b60018101549091506001600160a01b03163314611ccc5760405162461bcd60e51b815260040161062490612751565b6001810154611ce3906001600160a01b0316611e71565b60010180546001600160a01b0319169055565b6107506040518060600160405280602d8152602001612c76602d913982611280565b611d21336111a3565b611d3d5760405162461bcd60e51b8152600401610624906128e1565b6000611d47611dbd565b60018101549091506001600160a01b031615610750576001810180546001600160a01b03191690556040517f7a8dc7dd7fffb43c4807438fa62729225156941e641fd877938f4edade3429f590600090a150565b610750604051806060016040528060238152602001612c536023913982611280565b6000806040518060400160405280601c81526020017f535441524b4e45545f312e305f474f5645524e414e43455f494e464f0000000081525060405160200161122191906122f2565b60008082604051602001611e1a91906122f2565b60408051601f1981840301815291905280516020909101209392505050565b3b151590565b610750604051806060016040528060228152602001612bb26022913982611f40565b8051825560200151600190910155565b611e7a816111a3565b15611e975760405162461bcd60e51b815260040161062490612539565b6000611ea1611dbd565b6001600160a01b03831660009081526020829052604090819020805460ff19166001179055519091507fcfb473e6c03f9a29ddaf990e736fa3de5188a0bd85d684f5b6e164ebfbfff5d290611b92908490612373565b366000611f076002828587612b19565b915091505b9250929050565b600082826000818110611f2257fe5b90506020020135905092915050565b600082826001818110611f2257fe5b6000611f4b8361116f565b6001600160a01b031614611f715760405162461bcd60e51b815260040161062490612667565b6109e58282611280565b604051806040016040528060008152602001600081525090565b60008083601f840112611fa6578182fd5b50813567ffffffffffffffff811115611fbd578182fd5b6020830191508360208083028501011115611f0c57600080fd5b600060208284031215611fe8578081fd5b8135611ff381612b9c565b9392505050565b6000806000806060858703121561200f578283fd5b843567ffffffffffffffff811115612025578384fd5b61203187828801611f95565b90989097506020870135966040013595509350505050565b60006020828403121561205a578081fd5b81518015158114611ff3578182fd5b60006020828403121561207a578081fd5b5035919050565b60008060208385031215612093578182fd5b823567ffffffffffffffff808211156120aa578384fd5b818501915085601f8301126120bd578384fd5b8135818111156120cb578485fd5b8660208285010111156120dc578485fd5b60209290920196919550909350505050565b60008060008084860360a0811215612104578485fd5b85359450602086013561211681612b9c565b93506040868101359350605f198201121561212f578182fd5b506040516040810181811067ffffffffffffffff8211171561214f578283fd5b604052606086013581526080909501356020860152509194909350909190565b600080600060408486031215612183578283fd5b83359250602084013567ffffffffffffffff8111156121a0578283fd5b6121ac86828701611f95565b9497909650939450505050565b600080600080606085870312156121ce578384fd5b8435935060208501359250604085013567ffffffffffffffff8111156121f2578283fd5b6121fe87828801611f95565b95989497509550505050565b600080600080600060808688031215612221578081fd5b8535945060208601359350604086013567ffffffffffffffff811115612245578182fd5b61225188828901611f95565b96999598509660600135949350505050565b81835260006001600160fb1b0383111561227b578081fd5b6020830280836020870137939093016020019283525090919050565b60006001600160fb1b038311156122ac578081fd5b6020830280838637939093019283525090919050565b60006122cf828486612297565b949350505050565b93845260208401929092526040830152606082015260800190565b60008251612304818460208701612b6c565b9190910192915050565b90565b6000868252856020830152846040830152612330606083018486612297565b979650505050505050565b600088825287602083015286604083015285606083015284608083015261236660a083018486612297565b9998505050505050505050565b6001600160a01b0391909116815260200190565b6000602082526122cf602083018486612263565b6000604082526123af604083018587612263565b9050826020830152949350505050565b6000606082526123d3606083018688612263565b6020830194909452506040015292915050565b604080825283519082018190526000906020906060840190828701845b8281101561241f57815184529284019290840190600101612403565b50505092019290925292915050565b901515815260200190565b90815260200190565b918252602082015260400190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b600060208252825180602084015261249e816040850160208701612b6c565b601f01601f19169190910160400192915050565b602080825260129082015271115250d7d393d517d057d0d3d395149050d560721b604082015260600190565b602080825260119082015270135154d4d051d157d513d3d7d4d213d495607a1b604082015260600190565b602080825260169082015275494c4c4547414c5f494e49545f444154415f53495a4560501b604082015260600190565b60208082526010908201526f20a62922a0a22cafa3a7ab22a92727a960811b604082015260600190565b6020808252601590820152741253959053125117d41491559253d554d7d493d3d5605a1b604082015260600190565b6020808252601390820152720929cac82989288be869e9c8c928ebe9082a69606b1b604082015260600190565b6020808252601390820152721053149150511657d253925512505312569151606a1b604082015260600190565b6020808252601c908201527f43414e43454c5f414c4c4f5745445f54494d455f4f564552464c4f5700000000604082015260600190565b60208082526024908201527f4d4553534147455f43414e43454c4c4154494f4e5f4e4f545f414c4c4f57454460408201526317d6515560e21b606082015260800190565b6020808252600b908201526a1053149150511657d4d15560aa1b604082015260600190565b60208082526017908201527f4d41585f4c315f4d53475f4645455f4558434545444544000000000000000000604082015260600190565b602080825260149082015273554e45585045435445445f494e49545f4441544160601b604082015260600190565b6020808252601690820152750929cac82989288bea082b2989e8288be988a9c8ea8960531b604082015260600190565b6020808252601690820152751112549150d517d0d0531317d11254d0531313d5d15160521b604082015260600190565b60208082526017908201527f4f4e4c595f43414e4449444154455f474f5645524e4f52000000000000000000604082015260600190565b6020808252601290820152712120a22fa4a724aa24a0a624ad20aa24a7a760711b604082015260600190565b6020808252601c908201527f494e56414c49445f4d4553534147455f5345474d454e545f53495a4500000000604082015260600190565b60208082526018908201527f535441524b4e45545f4f55545055545f544f4f5f4c4f4e470000000000000000604082015260600190565b6020808252601490820152731393d7d35154d4d051d157d513d7d0d05390d15360621b604082015260600190565b60208082526019908201527f535441524b4e45545f4f55545055545f544f4f5f53484f525400000000000000604082015260600190565b60208082526019908201527f5452554e43415445445f4d4553534147455f5041594c4f414400000000000000604082015260600190565b60208082526009908201526811925390531256915160ba1b604082015260600190565b6020808252600f908201526e4f4e4c595f474f5645524e414e434560881b604082015260600190565b60208082526019908201527f4e4f5f53544154455f5452414e534954494f4e5f50524f4f4600000000000000604082015260600190565b6020808252600b908201526a4241445f4144445245535360a81b604082015260600190565b6020808252601390820152721253925517d110551057d513d3d7d4d3505313606a1b604082015260600190565b60208082526017908201527f4f544845525f43414e4449444154455f50454e44494e47000000000000000000604082015260600190565b6020808252601a908201527f494e56414c49445f4d4553534147455f544f5f434f4e53554d45000000000000604082015260600190565b60208082526013908201527211551217d514905394d1915497d19052531151606a1b604082015260600190565b6020808252600d908201526c27a7262cafa7a822a920aa27a960991b604082015260600190565b60208082526014908201527324a72b20a624a22fa12627a1a5afa72aa6a122a960611b604082015260600190565b602080825260149082015273474f5645524e4f525f53454c465f52454d4f564560601b604082015260600190565b6020808252600c908201526b2727aa2fa3a7ab22a92727a960a11b604082015260600190565b60208082526022908201527f4d4553534147455f43414e43454c4c4154494f4e5f4e4f545f52455155455354604082015261115160f21b606082015260800190565b60008085851115612b28578182fd5b83861115612b34578182fd5b5050602083020193919092039150565b60008085851115612b53578081fd5b83861115612b5f578081fd5b5050820193919092039150565b60005b83811015612b87578181015183820152602001612b6f565b83811115612b96576000848401525b50505050565b6001600160a01b038116811461075057600080fdfe535441524b4e45545f312e305f494e49545f56455249464945525f41444452455353535441524b4e45545f312e305f524f4c45535f4f50455241544f52535f4d415050494e475f544147535441524b4e45545f312e305f4d5347494e475f4c31544f4c325f43414e43454c4c4154494f4e5f4d41505050494e47535441524b4e45545f312e305f494e49545f535441524b4e45545f53544154455f535452554354535441524b4e45545f312e305f494e49545f50524f4752414d5f484153485f55494e54535441524b4e45545f312e305f4d5347494e475f4c31544f4c325f43414e43454c4c4154494f4e5f44454c4159535441524b4e45545f312e305f535441524b4e45545f434f4e4649475f48415348535441524b4e45545f312e305f4d5347494e475f4c32544f4c315f4d41505050494e47535441524b4e45545f312e305f4d5347494e475f4c31544f4c325f4d41505050494e475f5632535441524b574152455f434f4e5452414354535f474f564552454e45445f46494e414c495a41424c455f312e305f544147a26469706673582212206cf2519eeb6d67aa7134a4ec1c369a3dbef46e84d03bd45309766773ff074d1964736f6c634300060c0033" +} diff --git a/crates/papyrus_base_layer/src/base_layer_test.rs b/crates/papyrus_base_layer/src/base_layer_test.rs index b52d0538979..43eb3db3270 100644 --- a/crates/papyrus_base_layer/src/base_layer_test.rs +++ b/crates/papyrus_base_layer/src/base_layer_test.rs @@ -1,5 +1,5 @@ use pretty_assertions::assert_eq; -use starknet_api::block::{BlockHash, BlockNumber}; +use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber}; use starknet_api::felt; use crate::ethereum_base_layer_contract::{EthereumBaseLayerConfig, EthereumBaseLayerContract}; @@ -24,13 +24,16 @@ async fn latest_proved_block_ethereum() { node_url: node_handle.0.endpoint().parse().unwrap(), starknet_contract_address, }; - let contract = EthereumBaseLayerContract::new(config).unwrap(); + let contract = EthereumBaseLayerContract::new(config); - let first_sn_state_update = (BlockNumber(100), BlockHash(felt!("0x100"))); - let second_sn_state_update = (BlockNumber(200), BlockHash(felt!("0x200"))); - let third_sn_state_update = (BlockNumber(300), BlockHash(felt!("0x300"))); + let first_sn_state_update = + BlockHashAndNumber { number: BlockNumber(100), hash: BlockHash(felt!("0x100")) }; + let second_sn_state_update = + BlockHashAndNumber { number: BlockNumber(200), hash: BlockHash(felt!("0x200")) }; + let third_sn_state_update = + BlockHashAndNumber { number: BlockNumber(300), hash: BlockHash(felt!("0x300")) }; - type Scenario = (u64, Option<(BlockNumber, BlockHash)>); + type Scenario = (u64, Option); let scenarios: Vec = vec![ (0, Some(third_sn_state_update)), (5, Some(third_sn_state_update)), diff --git a/crates/papyrus_base_layer/src/ethereum_base_layer_contract.rs b/crates/papyrus_base_layer/src/ethereum_base_layer_contract.rs index 3f9366065ec..f6a02b566f4 100644 --- a/crates/papyrus_base_layer/src/ethereum_base_layer_contract.rs +++ b/crates/papyrus_base_layer/src/ethereum_base_layer_contract.rs @@ -1,25 +1,97 @@ use std::collections::BTreeMap; use std::future::IntoFuture; -use alloy_contract::{ContractInstance, Interface}; use alloy_dyn_abi::SolType; use alloy_json_rpc::RpcError; pub(crate) use alloy_primitives::Address as EthereumContractAddress; use alloy_provider::network::Ethereum; use alloy_provider::{Provider, ProviderBuilder, RootProvider}; -use alloy_sol_types::sol_data; +use alloy_sol_types::{sol, sol_data}; use alloy_transport::TransportErrorKind; use alloy_transport_http::{Client, Http}; use async_trait::async_trait; use papyrus_config::dumping::{ser_param, ser_required_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializationType, SerializedParam}; use serde::{Deserialize, Serialize}; -use starknet_api::block::{BlockHash, BlockNumber}; +use starknet_api::block::{BlockHash, BlockHashAndNumber, BlockNumber}; use starknet_api::hash::StarkHash; use starknet_types_core::felt; use url::Url; -use crate::BaseLayerContract; +use crate::{BaseLayerContract, L1Event}; + +type EthereumBaseLayerResult = Result; + +// Wraps the Starknet contract with a type that implements its interface, and is aware of its +// events. +sol!( + #[sol(rpc)] + Starknet, + "resources/Starknet-0.10.3.4.json" +); + +#[derive(Debug)] +pub struct EthereumBaseLayerContract { + pub config: EthereumBaseLayerConfig, + pub contract: Starknet::StarknetInstance, RootProvider>, Ethereum>, +} + +impl EthereumBaseLayerContract { + pub fn new(config: EthereumBaseLayerConfig) -> Self { + let l1_client = ProviderBuilder::new().on_http(config.node_url.clone()); + // This type is generated from `sol!` macro, and the `new` method assumes it is already + // deployed at L1, and wraps it with a type. + let contract = Starknet::new(config.starknet_contract_address, l1_client); + Self { contract, config } + } +} + +#[async_trait] +impl BaseLayerContract for EthereumBaseLayerContract { + type Error = EthereumBaseLayerError; + + /// Returns the latest proved block on Ethereum, where finality determines how many + /// blocks back (0 = latest). + async fn latest_proved_block( + &self, + finality: u64, + ) -> EthereumBaseLayerResult> { + let Some(ethereum_block_number) = self.latest_l1_block_number(finality).await? else { + return Ok(None); + }; + + let call_state_block_number = + self.contract.stateBlockNumber().block(ethereum_block_number.into()); + let call_state_block_hash = + self.contract.stateBlockHash().block(ethereum_block_number.into()); + + let (state_block_number, state_block_hash) = tokio::try_join!( + call_state_block_number.call_raw().into_future(), + call_state_block_hash.call_raw().into_future() + )?; + + let validate = true; + let block_number = sol_data::Uint::<64>::abi_decode(&state_block_number, validate)?; + let block_hash = sol_data::FixedBytes::<32>::abi_decode(&state_block_hash, validate)?; + Ok(Some(BlockHashAndNumber { + number: BlockNumber(block_number), + hash: BlockHash(StarkHash::from_bytes_be(&block_hash)), + })) + } + + async fn events( + &self, + _from_block: u64, + _until_block: u64, + _event_identifiers: &[&str], + ) -> EthereumBaseLayerResult> { + todo!("Implmeneted in a subsequent commit") + } + + async fn latest_l1_block_number(&self, finality: u64) -> EthereumBaseLayerResult> { + Ok(self.contract.provider().get_block_number().await?.checked_sub(finality)) + } +} #[derive(thiserror::Error, Debug)] pub enum EthereumBaseLayerError { @@ -71,57 +143,3 @@ impl Default for EthereumBaseLayerConfig { } } } - -#[derive(Debug)] -pub struct EthereumBaseLayerContract { - contract: ContractInstance, RootProvider>, Ethereum>, -} - -impl EthereumBaseLayerContract { - pub fn new(config: EthereumBaseLayerConfig) -> Result { - let client = ProviderBuilder::new().on_http(config.node_url); - - // The solidity contract was pre-compiled, and only the relevant functions were kept. - let abi = serde_json::from_str(include_str!("core_contract_latest_block.abi"))?; - Ok(Self { - contract: ContractInstance::new( - config.starknet_contract_address, - client, - Interface::new(abi), - ), - }) - } -} - -#[async_trait] -impl BaseLayerContract for EthereumBaseLayerContract { - type Error = EthereumBaseLayerError; - - /// Returns the latest proved block on Ethereum, where finality determines how many - /// blocks back (0 = latest). - async fn latest_proved_block( - &self, - finality: u64, - ) -> Result, Self::Error> { - let ethereum_block_number = - self.contract.provider().get_block_number().await?.checked_sub(finality); - let Some(ethereum_block_number) = ethereum_block_number else { - return Ok(None); - }; - - let call_state_block_number = - self.contract.function("stateBlockNumber", &[])?.block(ethereum_block_number.into()); - let call_state_block_hash = - self.contract.function("stateBlockHash", &[])?.block(ethereum_block_number.into()); - - let (state_block_number, state_block_hash) = tokio::try_join!( - call_state_block_number.call_raw().into_future(), - call_state_block_hash.call_raw().into_future() - )?; - - Ok(Some(( - BlockNumber(sol_data::Uint::<64>::abi_decode(&state_block_number, true)?), - BlockHash(StarkHash::from_hex(&state_block_hash.to_string())?), - ))) - } -} diff --git a/crates/papyrus_base_layer/src/lib.rs b/crates/papyrus_base_layer/src/lib.rs index a3bc340cce7..4f9e887291a 100644 --- a/crates/papyrus_base_layer/src/lib.rs +++ b/crates/papyrus_base_layer/src/lib.rs @@ -1,5 +1,9 @@ use async_trait::async_trait; -use starknet_api::block::{BlockHash, BlockNumber}; +use serde::{Deserialize, Serialize}; +use starknet_api::block::BlockHashAndNumber; +use starknet_api::core::{ContractAddress, EntryPointSelector, EthAddress, Nonce}; +use starknet_api::transaction::fields::{Calldata, Fee}; +use starknet_api::transaction::L1HandlerTransaction; pub mod ethereum_base_layer_contract; @@ -19,5 +23,34 @@ pub trait BaseLayerContract { async fn latest_proved_block( &self, finality: u64, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; + + /// Get specific events from the Starknet base contract between two L1 block numbers. + async fn events( + &self, + from_block: u64, + until_block: u64, + event_identifiers: &[&str], + ) -> Result, Self::Error>; + + async fn latest_l1_block_number(&self, finality: u64) -> Result, Self::Error>; +} + +/// Wraps Starknet L1 events with Starknet API types. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] +pub enum L1Event { + ConsumedMessageToL2(EventData), + LogMessageToL2 { tx: L1HandlerTransaction, fee: Fee }, + MessageToL2CancellationStarted(EventData), + MessageToL2Canceled(EventData), +} + +/// Shared fields in Starknet messaging. +#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Default)] +pub struct EventData { + pub from_address: EthAddress, + pub to_address: ContractAddress, + pub entry_point_selector: EntryPointSelector, + pub payload: Calldata, + pub nonce: Nonce, } diff --git a/crates/papyrus_common/Cargo.toml b/crates/papyrus_common/Cargo.toml index f5105adc1b2..bf87019dfa1 100644 --- a/crates/papyrus_common/Cargo.toml +++ b/crates/papyrus_common/Cargo.toml @@ -22,7 +22,7 @@ thiserror.workspace = true [dev-dependencies] assert_matches.workspace = true -papyrus_test_utils.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" pretty_assertions.workspace = true serde_json = { workspace = true, features = ["arbitrary_precision"] } diff --git a/crates/papyrus_config/Cargo.toml b/crates/papyrus_config/Cargo.toml index c5896100d25..dafd11eeeae 100644 --- a/crates/papyrus_config/Cargo.toml +++ b/crates/papyrus_config/Cargo.toml @@ -8,21 +8,22 @@ description = "A library for handling node configuration." [dependencies] clap = { workspace = true, features = ["env", "string"] } -infra_utils.workspace = true itertools.workspace = true serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true, features = ["arbitrary_precision"] } +starknet_infra_utils.workspace = true strum_macros.workspace = true thiserror.workspace = true +tracing.workspace = true validator = { workspace = true, features = ["derive"] } [dev-dependencies] assert_matches.workspace = true -infra_utils.workspace = true itertools.workspace = true lazy_static.workspace = true -papyrus_test_utils.workspace = true -starknet_api.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" +starknet_api.path = "../starknet_api" +starknet_infra_utils.path = "../starknet_infra_utils" tempfile.workspace = true [lints] diff --git a/crates/papyrus_config/src/config_test.rs b/crates/papyrus_config/src/config_test.rs index cdcdcd8a51f..1cbc0628750 100644 --- a/crates/papyrus_config/src/config_test.rs +++ b/crates/papyrus_config/src/config_test.rs @@ -6,11 +6,11 @@ use std::time::Duration; use assert_matches::assert_matches; use clap::Command; -use infra_utils::path::resolve_project_relative_path; use itertools::chain; use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use serde_json::json; +use starknet_infra_utils::path::resolve_project_relative_path; use tempfile::TempDir; use validator::Validate; diff --git a/crates/papyrus_config/src/dumping.rs b/crates/papyrus_config/src/dumping.rs index 1acddda1123..7b13b046414 100644 --- a/crates/papyrus_config/src/dumping.rs +++ b/crates/papyrus_config/src/dumping.rs @@ -363,7 +363,7 @@ pub fn ser_pointer_target_required_param( /// Updates entries in the map to point to these targets, replacing values of entries that match /// the target parameter paths to contain only the name of the target they point to. /// Fails if a param is not pointing to a same-named pointer target nor whitelisted. -pub(crate) fn combine_config_map_and_pointers( +pub fn combine_config_map_and_pointers( mut config_map: BTreeMap, pointers: &ConfigPointers, non_pointer_params: &Pointers, diff --git a/crates/papyrus_config/src/loading.rs b/crates/papyrus_config/src/loading.rs index 50df585217f..0876ef69507 100644 --- a/crates/papyrus_config/src/loading.rs +++ b/crates/papyrus_config/src/loading.rs @@ -14,7 +14,8 @@ use clap::Command; use command::{get_command_matches, update_config_map_by_command_args}; use itertools::any; use serde::Deserialize; -use serde_json::{json, Map, Value}; +use serde_json::{json, to_string_pretty, Map, Value}; +use tracing::{info, instrument}; use crate::validators::validate_path_exists; use crate::{ @@ -30,9 +31,12 @@ use crate::{ /// Deserializes config from flatten JSON. /// For an explanation of `for<'a> Deserialize<'a>` see /// ``. +#[instrument(skip(config_map))] pub fn load Deserialize<'a>>( config_map: &BTreeMap, ) -> Result { + let pretty_config = to_string_pretty(&config_map).expect("Failed to pretty-print config_map"); + info!("config_map: {}", pretty_config); let mut nested_map = json!({}); for (param_path, value) in config_map { let mut entry = &mut nested_map; diff --git a/crates/papyrus_execution/Cargo.toml b/crates/papyrus_execution/Cargo.toml index 5572fa48628..125a65b4056 100644 --- a/crates/papyrus_execution/Cargo.toml +++ b/crates/papyrus_execution/Cargo.toml @@ -35,11 +35,11 @@ assert_matches.workspace = true cairo-lang-casm.workspace = true cairo-lang-utils.workspace = true indexmap = { workspace = true, features = ["serde"] } -papyrus_storage = { workspace = true, features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } pretty_assertions.workspace = true rand.workspace = true rand_chacha.workspace = true -papyrus_test_utils.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" [package.metadata.cargo-machete] # The `rand` crate is used in the `testing` feature, which is optional. diff --git a/crates/papyrus_execution/src/execution_utils.rs b/crates/papyrus_execution/src/execution_utils.rs index 9a6f34ffb79..b5d5bde88c8 100644 --- a/crates/papyrus_execution/src/execution_utils.rs +++ b/crates/papyrus_execution/src/execution_utils.rs @@ -19,6 +19,7 @@ use papyrus_storage::state::StateStorageReader; use papyrus_storage::{StorageError, StorageResult, StorageTxn}; // Expose the tool for creating entry point selectors from function names. pub use starknet_api::abi::abi_utils::selector_from_name; +use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ClassHash, ContractAddress, Nonce}; use starknet_api::state::{StateNumber, StorageKey, ThinStateDiff}; use starknet_types_core::felt::Felt; @@ -43,6 +44,8 @@ pub(crate) enum ExecutionUtilsError { StorageError(#[from] StorageError), #[error("Casm table not fully synced")] CasmTableNotSynced, + #[error(transparent)] + SierraValidationError(starknet_api::StarknetApiError), } /// Returns the execution config from the config file. @@ -63,12 +66,15 @@ pub(crate) fn get_contract_class( match txn.get_state_reader()?.get_class_definition_block_number(class_hash)? { Some(block_number) if state_number.is_before(block_number) => return Ok(None), Some(_block_number) => { - let Some(casm) = txn.get_casm(class_hash)? else { + let (Some(casm), Some(sierra)) = txn.get_casm_and_sierra(class_hash)? else { return Err(ExecutionUtilsError::CasmTableNotSynced); }; - return Ok(Some(RunnableCompiledClass::V1( - CompiledClassV1::try_from(casm).map_err(ExecutionUtilsError::ProgramError)?, - ))); + let sierra_version = SierraVersion::extract_from_program(&sierra.sierra_program) + .map_err(ExecutionUtilsError::SierraValidationError)?; + return Ok(Some(RunnableCompiledClass::V1(CompiledClassV1::try_from(( + casm, + sierra_version, + ))?))); } None => {} }; diff --git a/crates/papyrus_execution/src/lib.rs b/crates/papyrus_execution/src/lib.rs index bb16e097a87..bbeb79260f8 100644 --- a/crates/papyrus_execution/src/lib.rs +++ b/crates/papyrus_execution/src/lib.rs @@ -30,6 +30,7 @@ use blockifier::execution::entry_point::{ CallEntryPoint, CallType as BlockifierCallType, EntryPointExecutionContext, + SierraGasRevertTracker, }; use blockifier::state::cached_state::CachedState; use blockifier::transaction::account_transaction::ExecutionFlags; @@ -62,6 +63,7 @@ use starknet_api::contract_class::{ClassInfo, EntryPointType, SierraVersion}; use starknet_api::core::{ChainId, ClassHash, ContractAddress, EntryPointSelector}; use starknet_api::data_availability::L1DataAvailabilityMode; use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; +use starknet_api::execution_resources::GasAmount; use starknet_api::state::{StateNumber, ThinStateDiff}; use starknet_api::transaction::fields::{Calldata, Fee}; use starknet_api::transaction::{ @@ -274,6 +276,7 @@ pub fn execute_call( let mut context = EntryPointExecutionContext::new_invoke( Arc::new(TransactionContext { block_context, tx_info }), limit_steps_by_resources, + SierraGasRevertTracker::new(GasAmount(remaining_gas)), ); let res = call_entry_point @@ -894,7 +897,7 @@ fn to_blockifier_tx( sierra_version, ) => { let class_info = ClassInfo::new( - &compiled_class.into(), + &(compiled_class, sierra_version.clone()).into(), sierra_program_length, abi_length, sierra_version, @@ -923,7 +926,7 @@ fn to_blockifier_tx( sierra_version, ) => { let class_info = ClassInfo::new( - &compiled_class.into(), + &(compiled_class, sierra_version.clone()).into(), sierra_program_length, abi_length, sierra_version, diff --git a/crates/papyrus_execution/src/objects.rs b/crates/papyrus_execution/src/objects.rs index 8be701059ee..094167a3d52 100644 --- a/crates/papyrus_execution/src/objects.rs +++ b/crates/papyrus_execution/src/objects.rs @@ -350,7 +350,7 @@ impl TryFrom<(CallInfo, GasVector)> for FunctionInvocation { }) .collect(), execution_resources: vm_resources_to_execution_resources( - call_info.charged_resources.vm_resources, + call_info.resources, gas_vector, )?, }) diff --git a/crates/papyrus_execution/src/state_reader.rs b/crates/papyrus_execution/src/state_reader.rs index b67aaa170e3..e53530167b9 100644 --- a/crates/papyrus_execution/src/state_reader.rs +++ b/crates/papyrus_execution/src/state_reader.rs @@ -15,6 +15,7 @@ use papyrus_common::pending_classes::{ApiContractClass, PendingClassesTrait}; use papyrus_common::state::DeclaredClassHashEntry; use papyrus_storage::state::StateStorageReader; use papyrus_storage::{StorageError, StorageReader}; +use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; use starknet_api::state::{StateNumber, StorageKey}; use starknet_types_core::felt::Felt; @@ -76,24 +77,30 @@ impl BlockifierStateReader for ExecutionStateReader { } fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { - if let Some(pending_casm) = self - .maybe_pending_data - .as_ref() - .and_then(|pending_data| pending_data.classes.get_compiled_class(class_hash)) + if let Some(pending_classes) = + self.maybe_pending_data.as_ref().map(|pending_data| &pending_data.classes) { - return Ok(RunnableCompiledClass::V1( - CompiledClassV1::try_from(pending_casm).map_err(StateError::ProgramError)?, - )); - } - if let Some(ApiContractClass::DeprecatedContractClass(pending_deprecated_class)) = self - .maybe_pending_data - .as_ref() - .and_then(|pending_data| pending_data.classes.get_class(class_hash)) - { - return Ok(RunnableCompiledClass::V0( - CompiledClassV0::try_from(pending_deprecated_class) - .map_err(StateError::ProgramError)?, - )); + if let Some(api_contract_class) = pending_classes.get_class(class_hash) { + match api_contract_class { + ApiContractClass::ContractClass(sierra) => { + if let Some(pending_casm) = pending_classes.get_compiled_class(class_hash) { + let sierra_version = + SierraVersion::extract_from_program(&sierra.sierra_program)?; + let runnable_compiled_class = RunnableCompiledClass::V1( + CompiledClassV1::try_from((pending_casm, sierra_version)) + .map_err(StateError::ProgramError)?, + ); + return Ok(runnable_compiled_class); + } + } + ApiContractClass::DeprecatedContractClass(pending_deprecated_class) => { + return Ok(RunnableCompiledClass::V0( + CompiledClassV0::try_from(pending_deprecated_class) + .map_err(StateError::ProgramError)?, + )); + } + } + } } match get_contract_class( &self.storage_reader.begin_ro_txn().map_err(storage_err_to_state_err)?, @@ -108,6 +115,9 @@ impl BlockifierStateReader for ExecutionStateReader { } Err(ExecutionUtilsError::ProgramError(err)) => Err(StateError::ProgramError(err)), Err(ExecutionUtilsError::StorageError(err)) => Err(storage_err_to_state_err(err)), + Err(ExecutionUtilsError::SierraValidationError(err)) => { + Err(StateError::StarknetApiError(err)) + } } } diff --git a/crates/papyrus_execution/src/state_reader_test.rs b/crates/papyrus_execution/src/state_reader_test.rs index 8e6a3c9558d..afc79697364 100644 --- a/crates/papyrus_execution/src/state_reader_test.rs +++ b/crates/papyrus_execution/src/state_reader_test.rs @@ -24,6 +24,7 @@ use papyrus_storage::header::HeaderStorageWriter; use papyrus_storage::state::StateStorageWriter; use papyrus_storage::test_utils::get_test_storage; use starknet_api::block::{BlockBody, BlockHash, BlockHeader, BlockHeaderWithoutHash, BlockNumber}; +use starknet_api::contract_class::SierraVersion; use starknet_api::core::{ClassHash, CompiledClassHash, Nonce}; use starknet_api::hash::StarkHash; use starknet_api::state::{SierraContractClass, StateNumber, ThinStateDiff}; @@ -48,9 +49,11 @@ fn read_state() { let storage_value1 = felt!(888_u128); // The class is not used in the execution, so it can be default. let class0 = SierraContractClass::default(); + let sierra_version0 = SierraVersion::extract_from_program(&class0.sierra_program).unwrap(); let casm0 = get_test_casm(); - let blockifier_casm0 = - RunnableCompiledClass::V1(CompiledClassV1::try_from(casm0.clone()).unwrap()); + let blockifier_casm0 = RunnableCompiledClass::V1( + CompiledClassV1::try_from((casm0.clone(), sierra_version0)).unwrap(), + ); let compiled_class_hash0 = CompiledClassHash(StarkHash::default()); let class_hash1 = ClassHash(1u128.into()); @@ -62,10 +65,13 @@ fn read_state() { let storage_value2 = felt!(999_u128); let class_hash2 = ClassHash(1234u128.into()); let compiled_class_hash2 = CompiledClassHash(StarkHash::TWO); - let mut casm1 = get_test_casm(); - casm1.bytecode[0] = BigUintAsHex { value: 12345u32.into() }; - let blockifier_casm1 = - RunnableCompiledClass::V1(CompiledClassV1::try_from(casm1.clone()).unwrap()); + let mut casm2 = get_test_casm(); + casm2.bytecode[0] = BigUintAsHex { value: 12345u32.into() }; + let class2 = SierraContractClass::default(); + let sierra_version2 = SierraVersion::extract_from_program(&class2.sierra_program).unwrap(); + let blockifier_casm2 = RunnableCompiledClass::V1( + CompiledClassV1::try_from((casm2.clone(), sierra_version2)).unwrap(), + ); let nonce1 = Nonce(felt!(2_u128)); let class_hash3 = ClassHash(567_u128.into()); let class_hash4 = ClassHash(89_u128.into()); @@ -204,7 +210,8 @@ fn read_state() { // Test pending state diff let mut pending_classes = PendingClasses::default(); - pending_classes.add_compiled_class(class_hash2, casm1); + pending_classes.add_compiled_class(class_hash2, casm2); + pending_classes.add_class(class_hash2, ApiContractClass::ContractClass(class2)); pending_classes.add_class(class_hash3, ApiContractClass::ContractClass(class0)); pending_classes .add_class(class_hash4, ApiContractClass::DeprecatedContractClass(class1.clone())); @@ -234,7 +241,7 @@ fn read_state() { assert_eq!(state_reader2.get_nonce_at(address0).unwrap(), nonce0); assert_eq!(state_reader2.get_nonce_at(address2).unwrap(), nonce1); assert_eq!(state_reader2.get_compiled_class(class_hash0).unwrap(), blockifier_casm0); - assert_eq!(state_reader2.get_compiled_class(class_hash2).unwrap(), blockifier_casm1); + assert_eq!(state_reader2.get_compiled_class(class_hash2).unwrap(), blockifier_casm2); // Test that an error is returned if we only got the class without the casm. state_reader2.get_compiled_class(class_hash3).unwrap_err(); // Test that if the class is deprecated it is returned. diff --git a/crates/papyrus_monitoring_gateway/Cargo.toml b/crates/papyrus_monitoring_gateway/Cargo.toml index 600d3ca41eb..5a823dc8a45 100644 --- a/crates/papyrus_monitoring_gateway/Cargo.toml +++ b/crates/papyrus_monitoring_gateway/Cargo.toml @@ -23,9 +23,9 @@ validator = { workspace = true, features = ["derive"] } [dev-dependencies] metrics.workspace = true -papyrus_storage = { workspace = true, features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } pretty_assertions.workspace = true -starknet_client = { workspace = true, features = ["testing"] } +starknet_client = { path = "../starknet_client", features = ["testing"] } tower = { workspace = true, features = ["util"] } [lints] diff --git a/crates/papyrus_network/Cargo.toml b/crates/papyrus_network/Cargo.toml index 04a22212a76..c02168cb6cf 100644 --- a/crates/papyrus_network/Cargo.toml +++ b/crates/papyrus_network/Cargo.toml @@ -6,7 +6,7 @@ repository.workspace = true license-file.workspace = true [features] -testing = [] +testing = ["starknet_sequencer_infra/testing"] [dependencies] async-stream.workspace = true @@ -35,6 +35,7 @@ papyrus_network_types.workspace = true replace_with.workspace = true serde = { workspace = true, features = ["derive"] } starknet_api.workspace = true +starknet_sequencer_infra = { workspace = true, optional = true, features = ["testing"] } thiserror.workspace = true tokio = { workspace = true, features = ["full", "sync"] } tokio-retry.workspace = true @@ -50,6 +51,7 @@ defaultmap.workspace = true libp2p-swarm-test.workspace = true mockall.workspace = true pretty_assertions.workspace = true +starknet_sequencer_infra = { path = "../starknet_sequencer_infra", features = ["testing"] } tokio = { workspace = true, features = ["full", "sync", "test-util"] } tokio-stream.workspace = true void.workspace = true diff --git a/crates/papyrus_network/src/network_manager/mod.rs b/crates/papyrus_network/src/network_manager/mod.rs index 8fa54349617..57dc0f3f959 100644 --- a/crates/papyrus_network/src/network_manager/mod.rs +++ b/crates/papyrus_network/src/network_manager/mod.rs @@ -77,7 +77,12 @@ impl GenericNetworkManager { self.handle_local_sqmr_payload(protocol, client_payload.expect("An SQMR client channel should not be terminated.")) } Some((topic_hash, message)) = self.messages_to_broadcast_receivers.next() => { - self.broadcast_message(message.expect("A broadcast channel should not be terminated."), topic_hash); + match message { + Some(message) => self.broadcast_message(message, topic_hash), + None => { + warn!("Messages to broadcast sender was dropped for topic with hash {topic_hash:?}"); + } + } } Some(Some(peer_id)) = self.reported_peer_receivers.next() => self.swarm.report_peer_as_malicious(peer_id), Some(peer_id) = self.reported_peers_receiver.next() => self.swarm.report_peer_as_malicious(peer_id), @@ -498,7 +503,9 @@ impl GenericNetworkManager { let send_result = sender.try_send((message, broadcasted_message_metadata)); if let Err(e) = send_result { if e.is_disconnected() { - panic!("Receiver was dropped. This should never happen.") + warn!( + "Broadcasted messages receiver was dropped for topic with hash {topic_hash:?}." + ) } else if e.is_full() { warn!( "Receiver buffer is full. Dropping broadcasted message for topic with hash: \ diff --git a/crates/papyrus_network/src/network_manager/test_utils.rs b/crates/papyrus_network/src/network_manager/test_utils.rs index be1f65427b8..ca115842fd6 100644 --- a/crates/papyrus_network/src/network_manager/test_utils.rs +++ b/crates/papyrus_network/src/network_manager/test_utils.rs @@ -11,7 +11,7 @@ use libp2p::core::multiaddr::Protocol; use libp2p::gossipsub::SubscriptionError; use libp2p::identity::Keypair; use libp2p::{Multiaddr, PeerId}; -use papyrus_common::tcp::find_n_free_ports; +use starknet_sequencer_infra::test_utils::AvailablePorts; use super::{ BroadcastTopicClient, @@ -148,8 +148,11 @@ where Ok(TestSubscriberChannels { subscriber_channels, mock_network }) } -pub fn create_connected_network_configs(n: usize) -> Vec { - let mut ports = find_n_free_ports(n); +pub fn create_connected_network_configs( + n: usize, + available_ports: &mut AvailablePorts, +) -> Vec { + let mut ports = available_ports.get_next_ports(n); let port0 = ports.remove(0); let secret_key0 = [1u8; 32]; @@ -180,6 +183,7 @@ pub fn create_connected_network_configs(n: usize) -> Vec { pub fn create_network_configs_connected_to_broadcast_channels( n_configs: usize, topic: Topic, + available_ports: &mut AvailablePorts, ) -> (Vec, BroadcastTopicChannels) where T: TryFrom + 'static, @@ -187,8 +191,8 @@ where { const BUFFER_SIZE: usize = 1000; - let mut channels_configs = create_connected_network_configs(n_configs + 1); - let broadcast_channels = channels_configs.remove(0); + let mut channels_configs = create_connected_network_configs(n_configs + 1, available_ports); + let broadcast_channels = channels_configs.pop().unwrap(); let mut channels_network_manager = NetworkManager::new(broadcast_channels, None); let broadcast_channels = diff --git a/crates/papyrus_node/Cargo.toml b/crates/papyrus_node/Cargo.toml index 776373225ae..a16b973b9ce 100644 --- a/crates/papyrus_node/Cargo.toml +++ b/crates/papyrus_node/Cargo.toml @@ -59,11 +59,11 @@ tokio-stream = { workspace = true, optional = true } [dev-dependencies] assert-json-diff.workspace = true colored.workspace = true -infra_utils.workspace = true insta = { workspace = true, features = ["json"] } metrics-exporter-prometheus.workspace = true -papyrus_test_utils.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" pretty_assertions.workspace = true +starknet_infra_utils.path = "../starknet_infra_utils" tempfile.workspace = true [lints] diff --git a/crates/papyrus_node/src/bin/run_consensus.rs b/crates/papyrus_node/src/bin/run_consensus.rs index ec62abc1d95..236f825b85a 100644 --- a/crates/papyrus_node/src/bin/run_consensus.rs +++ b/crates/papyrus_node/src/bin/run_consensus.rs @@ -9,13 +9,15 @@ use clap::Parser; use futures::stream::StreamExt; use papyrus_consensus::config::ConsensusConfig; use papyrus_consensus::simulation_network_receiver::NetworkReceiver; +use papyrus_consensus::stream_handler::StreamHandler; use papyrus_consensus::types::BroadcastConsensusMessageChannel; use papyrus_consensus_orchestrator::papyrus_consensus_context::PapyrusConsensusContext; use papyrus_network::gossipsub_impl::Topic; -use papyrus_network::network_manager::NetworkManager; +use papyrus_network::network_manager::{BroadcastTopicChannels, NetworkManager}; use papyrus_node::bin_utils::build_configs; -use papyrus_node::run::{run, PapyrusResources, PapyrusTaskHandles}; +use papyrus_node::run::{run, PapyrusResources, PapyrusTaskHandles, NETWORK_TOPIC}; use papyrus_p2p_sync::BUFFER_SIZE; +use papyrus_protobuf::consensus::{ProposalPart, StreamMessage}; use papyrus_storage::StorageReader; use starknet_api::block::BlockNumber; use tokio::task::JoinHandle; @@ -60,12 +62,21 @@ fn build_consensus( Topic::new(consensus_config.network_topic.clone()), BUFFER_SIZE, )?; + let proposal_network_channels: BroadcastTopicChannels> = + network_manager.register_broadcast_topic(Topic::new(NETWORK_TOPIC), BUFFER_SIZE)?; + let BroadcastTopicChannels { + broadcasted_messages_receiver: inbound_network_receiver, + broadcast_topic_client: outbound_network_sender, + } = proposal_network_channels; + let (outbound_internal_sender, inbound_internal_receiver, stream_handler_task_handle) = + StreamHandler::get_channels(inbound_network_receiver, outbound_network_sender); // TODO(matan): connect this to an actual channel. let sync_channels = network_manager .register_broadcast_topic(Topic::new(test_config.sync_topic.clone()), BUFFER_SIZE)?; let context = PapyrusConsensusContext::new( storage_reader.clone(), network_channels.broadcast_topic_client.clone(), + outbound_internal_sender, consensus_config.num_validators, Some(sync_channels.broadcast_topic_client), ); @@ -85,17 +96,33 @@ fn build_consensus( broadcast_topic_client: network_channels.broadcast_topic_client, }; + let consensus_task = papyrus_consensus::run_consensus( + context, + consensus_config.start_height, + consensus_config.start_height, + consensus_config.validator_id, + consensus_config.consensus_delay, + consensus_config.timeouts.clone(), + broadcast_channels, + inbound_internal_receiver, + sync_receiver, + ); + Ok(Some(tokio::spawn(async move { - Ok(papyrus_consensus::run_consensus( - context, - consensus_config.start_height, - consensus_config.validator_id, - consensus_config.consensus_delay, - consensus_config.timeouts.clone(), - broadcast_channels, - sync_receiver, - ) - .await?) + tokio::select! { + stream_handler_result = stream_handler_task_handle => { + match stream_handler_result { + Ok(()) => Err(anyhow::anyhow!("Stream handler task completed")), + Err(e) => Err(anyhow::anyhow!("Stream handler task failed: {:?}", e)), + } + }, + consensus_result = consensus_task => { + match consensus_result { + Ok(()) => Err(anyhow::anyhow!("Consensus task completed")), + Err(e) => Err(anyhow::anyhow!("Consensus task failed: {:?}", e)), + } + }, + } }))) } diff --git a/crates/papyrus_node/src/config/config_test.rs b/crates/papyrus_node/src/config/config_test.rs index fe7a025a5a3..68bb93b67f2 100644 --- a/crates/papyrus_node/src/config/config_test.rs +++ b/crates/papyrus_node/src/config/config_test.rs @@ -9,7 +9,6 @@ use std::str::FromStr; use assert_json_diff::assert_json_eq; use colored::Colorize; -use infra_utils::path::resolve_project_relative_path; use itertools::Itertools; use papyrus_base_layer::ethereum_base_layer_contract::EthereumBaseLayerConfig; use papyrus_config::dumping::SerializeConfig; @@ -19,6 +18,7 @@ use papyrus_monitoring_gateway::MonitoringGatewayConfig; use pretty_assertions::assert_eq; use serde_json::{json, Map, Value}; use starknet_api::core::ChainId; +use starknet_infra_utils::path::resolve_project_relative_path; use tempfile::NamedTempFile; use validator::Validate; diff --git a/crates/papyrus_node/src/config/snapshots/papyrus_node__config__config_test__dump_default_config.snap b/crates/papyrus_node/src/config/snapshots/papyrus_node__config__config_test__dump_default_config.snap index 13889fc8a85..26d2b317fda 100644 --- a/crates/papyrus_node/src/config/snapshots/papyrus_node__config__config_test__dump_default_config.snap +++ b/crates/papyrus_node/src/config/snapshots/papyrus_node__config__config_test__dump_default_config.snap @@ -416,18 +416,6 @@ expression: dumped_default_config }, "privacy": "Public" }, - "p2p_sync.stop_sync_at_block_number": { - "description": "Stops the sync at given block number and closes the node cleanly. Used to run profiling on the node.", - "value": { - "$serde_json::private::Number": "1000" - }, - "privacy": "Public" - }, - "p2p_sync.stop_sync_at_block_number.#is_none": { - "description": "Flag for an optional field.", - "value": true, - "privacy": "TemporaryValue" - }, "p2p_sync.wait_period_for_new_data": { "description": "Time in millisseconds to wait when a query returned with partial data before sending a new query", "value": { diff --git a/crates/papyrus_node/src/run.rs b/crates/papyrus_node/src/run.rs index 6cf1b193563..1bfdeae7563 100644 --- a/crates/papyrus_node/src/run.rs +++ b/crates/papyrus_node/src/run.rs @@ -28,7 +28,7 @@ use papyrus_protobuf::consensus::{ProposalPart, StreamMessage}; use papyrus_rpc::run_server; use papyrus_storage::storage_metrics::update_storage_metrics; use papyrus_storage::{open_storage, StorageReader, StorageWriter}; -use papyrus_sync::sources::base_layer::{BaseLayerSourceError, EthereumBaseLayerSource}; +use papyrus_sync::sources::base_layer::EthereumBaseLayerSource; use papyrus_sync::sources::central::{CentralError, CentralSource, CentralSourceConfig}; use papyrus_sync::sources::pending::PendingSource; use papyrus_sync::{StateSync, SyncConfig}; @@ -242,8 +242,7 @@ async fn run_sync( .map_err(CentralError::ClientCreation)?; let pending_source = PendingSource::new(central_config, VERSION_FULL).map_err(CentralError::ClientCreation)?; - let base_layer_source = EthereumBaseLayerSource::new(base_layer_config) - .map_err(|e| BaseLayerSourceError::BaseLayerSourceCreationError(e.to_string()))?; + let base_layer_source = EthereumBaseLayerSource::new(base_layer_config); let sync = StateSync::new( sync_config, shared_highest_block, diff --git a/crates/papyrus_p2p_sync/Cargo.toml b/crates/papyrus_p2p_sync/Cargo.toml index f39a8bc76b5..f2894bd6b71 100644 --- a/crates/papyrus_p2p_sync/Cargo.toml +++ b/crates/papyrus_p2p_sync/Cargo.toml @@ -19,7 +19,9 @@ papyrus_network.workspace = true papyrus_proc_macros.workspace = true papyrus_protobuf.workspace = true papyrus_storage.workspace = true +papyrus_test_utils.workspace = true rand.workspace = true +rand_chacha.workspace = true serde.workspace = true starknet_api.workspace = true starknet_state_sync_types.workspace = true @@ -32,11 +34,9 @@ tracing.workspace = true [dev-dependencies] assert_matches.workspace = true lazy_static.workspace = true -papyrus_network = { workspace = true, features = ["testing"] } -papyrus_protobuf = { workspace = true, features = ["testing"] } -papyrus_storage = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true -rand_chacha.workspace = true +papyrus_network = { path = "../papyrus_network", features = ["testing"] } +papyrus_protobuf = { path = "../papyrus_protobuf", features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } static_assertions.workspace = true tokio = { workspace = true, features = ["test-util"] } diff --git a/crates/papyrus_p2p_sync/src/client/class.rs b/crates/papyrus_p2p_sync/src/client/class.rs index 9cb5dfaa390..cf93e494875 100644 --- a/crates/papyrus_p2p_sync/src/client/class.rs +++ b/crates/papyrus_p2p_sync/src/client/class.rs @@ -11,6 +11,7 @@ use papyrus_storage::{StorageError, StorageReader, StorageWriter}; use starknet_api::block::BlockNumber; use starknet_api::core::ClassHash; use starknet_api::state::{DeclaredClasses, DeprecatedDeclaredClasses}; +use starknet_state_sync_types::state_sync_types::SyncBlock; use super::stream_builder::{ BadPeerError, @@ -129,4 +130,12 @@ impl DataStreamBuilder<(ApiContractClass, ClassHash)> for ClassStreamBuilder { fn get_start_block_number(storage_reader: &StorageReader) -> Result { storage_reader.begin_ro_txn()?.get_class_marker() } + + // TODO(Eitan): Implement this function once we have a class manager component. + fn convert_sync_block_to_block_data( + _block_number: BlockNumber, + _sync_block: SyncBlock, + ) -> Option<(DeclaredClasses, DeprecatedDeclaredClasses, BlockNumber)> { + None + } } diff --git a/crates/papyrus_p2p_sync/src/client/class_test.rs b/crates/papyrus_p2p_sync/src/client/class_test.rs index 6e9e6629bd5..85b49d931e1 100644 --- a/crates/papyrus_p2p_sync/src/client/class_test.rs +++ b/crates/papyrus_p2p_sync/src/client/class_test.rs @@ -1,10 +1,9 @@ -use std::cmp::min; +use std::collections::HashMap; -use futures::{FutureExt, StreamExt}; +use futures::FutureExt; use papyrus_common::pending_classes::ApiContractClass; use papyrus_protobuf::sync::{ BlockHashOrNumber, - ClassQuery, DataOrFin, DeclaredClass, DeprecatedDeclaredClass, @@ -22,129 +21,131 @@ use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContract use starknet_api::state::SierraContractClass; use super::test_utils::{ - setup, + random_header, + run_test, wait_for_marker, + Action, DataType, - TestArgs, - CLASS_DIFF_QUERY_LENGTH, - HEADER_QUERY_LENGTH, SLEEP_DURATION_TO_LET_SYNC_ADVANCE, TIMEOUT_FOR_TEST, }; -use crate::client::state_diff_test::run_state_diff_sync; #[tokio::test] async fn class_basic_flow() { - let TestArgs { - p2p_sync, - storage_reader, - mut mock_state_diff_response_manager, - mut mock_header_response_manager, - mut mock_class_response_manager, - // The test will fail if we drop this - mock_transaction_response_manager: _mock_transaction_responses_manager, - .. - } = setup(); - let mut rng = get_rng(); - // TODO(noamsp): Add multiple state diffs per header - let (class_state_diffs, api_contract_classes): (Vec<_>, Vec<_>) = (0..HEADER_QUERY_LENGTH) - .map(|_| create_random_state_diff_chunk_with_class(&mut rng)) - .unzip(); - let header_state_diff_lengths = - class_state_diffs.iter().map(|class_state_diff| class_state_diff.len()).collect::>(); - - // Create a future that will receive queries, send responses and validate the results - let parse_queries_future = async move { - // Check that before we send state diffs there is no class query. - assert!(mock_class_response_manager.next().now_or_never().is_none()); - run_state_diff_sync( - p2p_sync.config, - &mut mock_header_response_manager, - &mut mock_state_diff_response_manager, - header_state_diff_lengths.clone(), - class_state_diffs.clone().into_iter().map(Some).collect(), - ) - .await; - - let num_declare_class_state_diff_headers = - u64::try_from(header_state_diff_lengths.len()).unwrap(); - let num_class_queries = - num_declare_class_state_diff_headers.div_ceil(CLASS_DIFF_QUERY_LENGTH); - for i in 0..num_class_queries { - let start_block_number = i * CLASS_DIFF_QUERY_LENGTH; - let limit = min( - num_declare_class_state_diff_headers - start_block_number, - CLASS_DIFF_QUERY_LENGTH, - ); + let state_diffs_and_classes_of_blocks = [ + vec![ + create_random_state_diff_chunk_with_class(&mut rng), + create_random_state_diff_chunk_with_class(&mut rng), + ], + vec![ + create_random_state_diff_chunk_with_class(&mut rng), + create_random_state_diff_chunk_with_class(&mut rng), + create_random_state_diff_chunk_with_class(&mut rng), + ], + ]; + + let mut actions = vec![ + // We already validate the header query content in other tests. + Action::ReceiveQuery(Box::new(|_query| ()), DataType::Header), + ]; + + // Send headers with corresponding state diff length. + for (i, state_diffs_and_classes) in state_diffs_and_classes_of_blocks.iter().enumerate() { + actions.push(Action::SendHeader(DataOrFin(Some(random_header( + &mut rng, + BlockNumber(i.try_into().unwrap()), + Some(state_diffs_and_classes.len()), + None, + ))))); + } + actions.push(Action::SendHeader(DataOrFin(None))); + + // Send state diffs. + actions.push( + // We already validate the state diff query content in other tests. + Action::ReceiveQuery(Box::new(|_query| ()), DataType::StateDiff), + ); + for state_diffs_and_classes in &state_diffs_and_classes_of_blocks { + for (state_diff, _) in state_diffs_and_classes { + actions.push(Action::SendStateDiff(DataOrFin(Some(state_diff.clone())))); + } + } - // Get a class query and validate it - let mut mock_class_responses_manager = - mock_class_response_manager.next().await.unwrap(); + let len = state_diffs_and_classes_of_blocks.len(); + actions.push(Action::ReceiveQuery( + Box::new(move |query| { assert_eq!( - *mock_class_responses_manager.query(), - Ok(ClassQuery(Query { - start_block: BlockHashOrNumber::Number(BlockNumber(start_block_number)), + query, + Query { + start_block: BlockHashOrNumber::Number(BlockNumber(0)), direction: Direction::Forward, - limit, + limit: len.try_into().unwrap(), step: 1, - })), - "If the limit of the query is too low, try to increase \ - SLEEP_DURATION_TO_LET_SYNC_ADVANCE", - ); - - for block_number in start_block_number..(start_block_number + limit) { - let class_hash = - class_state_diffs[usize::try_from(block_number).unwrap()].get_class_hash(); - let expected_class = - api_contract_classes[usize::try_from(block_number).unwrap()].clone(); - - let block_number = BlockNumber(block_number); - - // Check that before we've sent all parts the contract class wasn't written yet - let txn = storage_reader.begin_ro_txn().unwrap(); - assert_eq!(block_number, txn.get_class_marker().unwrap()); - - mock_class_responses_manager - .send_response(DataOrFin(Some((expected_class.clone(), class_hash)))) - .await - .unwrap(); - + } + ) + }), + DataType::Class, + )); + for (i, state_diffs_and_classes) in state_diffs_and_classes_of_blocks.into_iter().enumerate() { + for (state_diff, class) in &state_diffs_and_classes { + let class_hash = state_diff.get_class_hash(); + + // Check that before the last class was sent, the classes aren't written. + actions.push(Action::CheckStorage(Box::new(move |reader| { + async move { + assert_eq!( + u64::try_from(i).unwrap(), + reader.begin_ro_txn().unwrap().get_class_marker().unwrap().0 + ); + } + .boxed() + }))); + actions.push(Action::SendClass(DataOrFin(Some((class.clone(), class_hash))))); + } + // Check that a block's classes are written before the entire query finished. + actions.push(Action::CheckStorage(Box::new(move |reader| { + async move { + let block_number = BlockNumber(i.try_into().unwrap()); wait_for_marker( DataType::Class, - &storage_reader, + &reader, block_number.unchecked_next(), SLEEP_DURATION_TO_LET_SYNC_ADVANCE, TIMEOUT_FOR_TEST, ) .await; - let txn = storage_reader.begin_ro_txn().unwrap(); - let actual_class = match expected_class { - ApiContractClass::ContractClass(_) => ApiContractClass::ContractClass( - txn.get_class(&class_hash).unwrap().unwrap(), - ), - ApiContractClass::DeprecatedContractClass(_) => { - ApiContractClass::DeprecatedContractClass( - txn.get_deprecated_class(&class_hash).unwrap().unwrap(), - ) + let txn = reader.begin_ro_txn().unwrap(); + for (state_diff, expected_class) in state_diffs_and_classes { + let class_hash = state_diff.get_class_hash(); + match expected_class { + ApiContractClass::ContractClass(expected_class) => { + let actual_class = txn.get_class(&class_hash).unwrap().unwrap(); + assert_eq!(actual_class, expected_class.clone()); + } + ApiContractClass::DeprecatedContractClass(expected_class) => { + let actual_class = + txn.get_deprecated_class(&class_hash).unwrap().unwrap(); + assert_eq!(actual_class, expected_class.clone()); + } } - }; - assert_eq!(expected_class, actual_class); + } } - - mock_class_responses_manager.send_response(DataOrFin(None)).await.unwrap(); - } - }; - - tokio::select! { - sync_result = p2p_sync.run() => { - sync_result.unwrap(); - panic!("P2P sync aborted with no failure."); - } - _ = parse_queries_future => {} + .boxed() + }))); } + + run_test( + HashMap::from([ + (DataType::Header, len.try_into().unwrap()), + (DataType::StateDiff, len.try_into().unwrap()), + (DataType::Class, len.try_into().unwrap()), + ]), + actions, + ) + .await; } // We define this new trait here so we can use the get_class_hash function in the test. @@ -176,6 +177,8 @@ fn create_random_state_diff_chunk_with_class( }; ( StateDiffChunk::DeclaredClass(declared_class), + // TODO(noamsp): get_test_instance on these types returns the same value, making this + // test redundant. Fix this. ApiContractClass::ContractClass(SierraContractClass::get_test_instance(rng)), ) } else { diff --git a/crates/papyrus_p2p_sync/src/client/header.rs b/crates/papyrus_p2p_sync/src/client/header.rs index 947f8ede25e..37f5d101deb 100644 --- a/crates/papyrus_p2p_sync/src/client/header.rs +++ b/crates/papyrus_p2p_sync/src/client/header.rs @@ -7,7 +7,15 @@ use papyrus_network::network_manager::ClientResponsesManager; use papyrus_protobuf::sync::{DataOrFin, SignedBlockHeader}; use papyrus_storage::header::{HeaderStorageReader, HeaderStorageWriter}; use papyrus_storage::{StorageError, StorageReader, StorageWriter}; -use starknet_api::block::BlockNumber; +use starknet_api::block::{ + BlockHash, + BlockHeader, + BlockHeaderWithoutHash, + BlockNumber, + BlockSignature, +}; +use starknet_api::hash::StarkHash; +use starknet_state_sync_types::state_sync_types::SyncBlock; use tracing::debug; use super::stream_builder::{ @@ -112,4 +120,25 @@ impl DataStreamBuilder for HeaderStreamBuilder { fn get_start_block_number(storage_reader: &StorageReader) -> Result { storage_reader.begin_ro_txn()?.get_header_marker() } + + // TODO(Eitan): Use real header once SyncBlock contains data required by full nodes + // TODO(Eitan): Fill this with real header once SyncBlock has it. + fn convert_sync_block_to_block_data( + block_number: BlockNumber, + sync_block: SyncBlock, + ) -> Option { + Some(SignedBlockHeader { + block_header: BlockHeader { + block_hash: BlockHash(StarkHash::from(block_number.0)), + block_header_without_hash: BlockHeaderWithoutHash { + block_number, + ..Default::default() + }, + state_diff_length: Some(sync_block.state_diff.len()), + n_transactions: sync_block.transaction_hashes.len(), + ..Default::default() + }, + signatures: vec![BlockSignature::default()], + }) + } } diff --git a/crates/papyrus_p2p_sync/src/client/mod.rs b/crates/papyrus_p2p_sync/src/client/mod.rs index 0ff1dd955e1..51eceb5d505 100644 --- a/crates/papyrus_p2p_sync/src/client/mod.rs +++ b/crates/papyrus_p2p_sync/src/client/mod.rs @@ -18,13 +18,13 @@ use std::collections::BTreeMap; use std::time::Duration; use class::ClassStreamBuilder; -use futures::channel::mpsc::SendError; +use futures::channel::mpsc::{Receiver, SendError, Sender}; use futures::stream::BoxStream; -use futures::Stream; +use futures::{SinkExt as _, Stream}; use header::HeaderStreamBuilder; use papyrus_common::pending_classes::ApiContractClass; use papyrus_config::converters::deserialize_milliseconds_to_duration; -use papyrus_config::dumping::{ser_optional_param, ser_param, SerializeConfig}; +use papyrus_config::dumping::{ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use papyrus_network::network_manager::SqmrClientSender; use papyrus_protobuf::sync::{ @@ -45,7 +45,7 @@ use starknet_state_sync_types::state_sync_types::SyncBlock; use state_diff::StateDiffStreamBuilder; use stream_builder::{DataStreamBuilder, DataStreamResult}; use tokio_stream::StreamExt; -use tracing::instrument; +use tracing::{info, instrument}; use transaction::TransactionStreamFactory; const STEP: u64 = 1; @@ -62,12 +62,11 @@ pub struct P2PSyncClientConfig { #[serde(deserialize_with = "deserialize_milliseconds_to_duration")] pub wait_period_for_new_data: Duration, pub buffer_size: usize, - pub stop_sync_at_block_number: Option, } impl SerializeConfig for P2PSyncClientConfig { fn dump(&self) -> BTreeMap { - let mut config = BTreeMap::from_iter([ + BTreeMap::from_iter([ ser_param( "num_headers_per_query", &self.num_headers_per_query, @@ -106,16 +105,7 @@ impl SerializeConfig for P2PSyncClientConfig { "Size of the buffer for read from the storage and for incoming responses.", ParamPrivacyInput::Public, ), - ]); - config.extend(ser_optional_param( - &self.stop_sync_at_block_number, - BlockNumber(1000), - "stop_sync_at_block_number", - "Stops the sync at given block number and closes the node cleanly. Used to run \ - profiling on the node.", - ParamPrivacyInput::Public, - )); - config + ]) } } @@ -131,7 +121,6 @@ impl Default for P2PSyncClientConfig { wait_period_for_new_data: Duration::from_millis(50), // TODO(eitan): split this by protocol buffer_size: 100000, - stop_sync_at_block_number: None, } } } @@ -183,32 +172,30 @@ impl P2PSyncClientChannels { self, storage_reader: StorageReader, config: P2PSyncClientConfig, + internal_blocks_receivers: InternalBlocksReceivers, ) -> impl Stream + Send + 'static { let header_stream = HeaderStreamBuilder::create_stream( self.header_sender, storage_reader.clone(), - None, + Some(internal_blocks_receivers.header_receiver), config.wait_period_for_new_data, config.num_headers_per_query, - config.stop_sync_at_block_number, ); let state_diff_stream = StateDiffStreamBuilder::create_stream( self.state_diff_sender, storage_reader.clone(), - None, + Some(internal_blocks_receivers.state_diff_receiver), config.wait_period_for_new_data, config.num_block_state_diffs_per_query, - config.stop_sync_at_block_number, ); let transaction_stream = TransactionStreamFactory::create_stream( self.transaction_sender, storage_reader.clone(), - None, + Some(internal_blocks_receivers.transaction_receiver), config.wait_period_for_new_data, config.num_block_transactions_per_query, - config.stop_sync_at_block_number, ); let class_stream = ClassStreamBuilder::create_stream( @@ -217,7 +204,6 @@ impl P2PSyncClientChannels { None, config.wait_period_for_new_data, config.num_block_classes_per_query, - config.stop_sync_at_block_number, ); header_stream.merge(state_diff_stream).merge(transaction_stream).merge(class_stream) @@ -229,7 +215,6 @@ pub struct P2PSyncClient { storage_reader: StorageReader, storage_writer: StorageWriter, p2p_sync_channels: P2PSyncClientChannels, - #[allow(dead_code)] internal_blocks_receiver: BoxStream<'static, (BlockNumber, SyncBlock)>, } @@ -245,13 +230,102 @@ impl P2PSyncClient { } #[instrument(skip(self), level = "debug", err)] - pub async fn run(mut self) -> Result<(), P2PSyncClientError> { + pub async fn run(self) -> Result<(), P2PSyncClientError> { + info!("Starting P2P sync client"); + + let InternalBlocksChannels { + receivers: internal_blocks_receivers, + senders: mut internal_blocks_senders, + } = InternalBlocksChannels::new(); + let P2PSyncClient { + config, + storage_reader, + mut storage_writer, + p2p_sync_channels, + mut internal_blocks_receiver, + } = self; let mut data_stream = - self.p2p_sync_channels.create_stream(self.storage_reader.clone(), self.config); + p2p_sync_channels.create_stream(storage_reader, config, internal_blocks_receivers); loop { + tokio::select! { + maybe_internal_block = internal_blocks_receiver.next() => { + let (block_number, sync_block) = maybe_internal_block.expect("Internal blocks stream should never end"); + internal_blocks_senders.send(block_number, sync_block).await?; + } + data = data_stream.next() => { + let data = data.expect("Sync data stream should never end")?; + data.write_to_storage(&mut storage_writer)?; + } + } let data = data_stream.next().await.expect("Sync data stream should never end")?; - data.write_to_storage(&mut self.storage_writer)?; + data.write_to_storage(&mut storage_writer)?; + } + } +} + +pub(crate) struct InternalBlocksReceivers { + header_receiver: Receiver<(BlockNumber, SyncBlock)>, + state_diff_receiver: Receiver<(BlockNumber, SyncBlock)>, + transaction_receiver: Receiver<(BlockNumber, SyncBlock)>, + #[allow(dead_code)] + class_receiver: Receiver<(BlockNumber, SyncBlock)>, +} + +pub struct InternalBlocksSenders { + header_sender: Sender<(BlockNumber, SyncBlock)>, + state_diff_sender: Sender<(BlockNumber, SyncBlock)>, + transaction_sender: Sender<(BlockNumber, SyncBlock)>, + #[allow(dead_code)] + class_sender: Sender<(BlockNumber, SyncBlock)>, +} +impl InternalBlocksSenders { + pub async fn send( + &mut self, + block_number: BlockNumber, + sync_block: SyncBlock, + ) -> Result<(), SendError> { + let header_send = self.header_sender.send((block_number, sync_block.clone())); + let state_diff_send = self.state_diff_sender.send((block_number, sync_block.clone())); + let transaction_send = self.transaction_sender.send((block_number, sync_block.clone())); + let class_send = self.class_sender.send((block_number, sync_block)); + let res = + futures::future::join4(header_send, state_diff_send, transaction_send, class_send) + .await; + match res { + (Ok(()), Ok(()), Ok(()), Ok(())) => Ok(()), + (Err(e), _, _, _) => Err(e), + (_, Err(e), _, _) => Err(e), + (_, _, Err(e), _) => Err(e), + (_, _, _, Err(e)) => Err(e), + } + } +} +struct InternalBlocksChannels { + receivers: InternalBlocksReceivers, + senders: InternalBlocksSenders, +} + +impl InternalBlocksChannels { + pub fn new() -> Self { + let (header_sender, header_receiver) = futures::channel::mpsc::channel(100); + let (state_diff_sender, state_diff_receiver) = futures::channel::mpsc::channel(100); + let (transaction_sender, transaction_receiver) = futures::channel::mpsc::channel(100); + let (class_sender, class_receiver) = futures::channel::mpsc::channel(100); + + Self { + receivers: InternalBlocksReceivers { + header_receiver, + state_diff_receiver, + transaction_receiver, + class_receiver, + }, + senders: InternalBlocksSenders { + header_sender, + state_diff_sender, + transaction_sender, + class_sender, + }, } } } diff --git a/crates/papyrus_p2p_sync/src/client/state_diff.rs b/crates/papyrus_p2p_sync/src/client/state_diff.rs index 4eeebd36c41..362daca121d 100644 --- a/crates/papyrus_p2p_sync/src/client/state_diff.rs +++ b/crates/papyrus_p2p_sync/src/client/state_diff.rs @@ -12,6 +12,7 @@ use papyrus_storage::state::{StateStorageReader, StateStorageWriter}; use papyrus_storage::{StorageError, StorageReader, StorageWriter}; use starknet_api::block::BlockNumber; use starknet_api::state::ThinStateDiff; +use starknet_state_sync_types::state_sync_types::SyncBlock; use super::stream_builder::BadPeerError; use crate::client::stream_builder::{ @@ -110,6 +111,13 @@ impl DataStreamBuilder for StateDiffStreamBuilder { fn get_start_block_number(storage_reader: &StorageReader) -> Result { storage_reader.begin_ro_txn()?.get_state_marker() } + + fn convert_sync_block_to_block_data( + block_number: BlockNumber, + sync_block: SyncBlock, + ) -> Option<(ThinStateDiff, BlockNumber)> { + Some((sync_block.state_diff, block_number)) + } } // For performance reasons, this function does not check if a deprecated class was declared twice. diff --git a/crates/papyrus_p2p_sync/src/client/state_diff_test.rs b/crates/papyrus_p2p_sync/src/client/state_diff_test.rs index 04175a7568d..eb8c1528fa3 100644 --- a/crates/papyrus_p2p_sync/src/client/state_diff_test.rs +++ b/crates/papyrus_p2p_sync/src/client/state_diff_test.rs @@ -1,9 +1,7 @@ -use std::cmp::min; +use std::collections::HashMap; -use futures::future::join; -use futures::{FutureExt, StreamExt}; +use futures::FutureExt; use indexmap::indexmap; -use papyrus_network::network_manager::GenericReceiver; use papyrus_protobuf::sync::{ BlockHashOrNumber, ContractDiff, @@ -12,156 +10,173 @@ use papyrus_protobuf::sync::{ DeprecatedDeclaredClass, Direction, Query, - SignedBlockHeader, StateDiffChunk, }; use papyrus_storage::state::StateStorageReader; -use papyrus_test_utils::{get_rng, GetTestInstance}; -use rand::RngCore; -use rand_chacha::ChaCha8Rng; -use starknet_api::block::{BlockHeader, BlockHeaderWithoutHash, BlockNumber}; -use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; +use papyrus_test_utils::get_rng; +use starknet_api::block::BlockNumber; +use starknet_api::core::{ascii_as_felt, ClassHash, CompiledClassHash, ContractAddress, Nonce}; use starknet_api::state::{StorageKey, ThinStateDiff}; use starknet_types_core::felt::Felt; -use static_assertions::const_assert; -use tokio::sync::mpsc::{channel, Receiver}; use super::test_utils::{ - create_block_hashes_and_signatures, - setup, + random_header, + run_test, wait_for_marker, + Action, DataType, - HeaderTestPayload, - StateDiffTestPayload, - TestArgs, - HEADER_QUERY_LENGTH, SLEEP_DURATION_TO_LET_SYNC_ADVANCE, - STATE_DIFF_QUERY_LENGTH, TIMEOUT_FOR_TEST, - WAIT_PERIOD_FOR_NEW_DATA, }; -use super::{P2PSyncClientConfig, StateDiffQuery}; #[tokio::test] async fn state_diff_basic_flow() { - // Asserting the constants so the test can assume there will be 2 state diff queries for a - // single header query and the second will be smaller than the first. - const_assert!(STATE_DIFF_QUERY_LENGTH < HEADER_QUERY_LENGTH); - const_assert!(HEADER_QUERY_LENGTH < 2 * STATE_DIFF_QUERY_LENGTH); - - let TestArgs { - p2p_sync, - storage_reader, - mut mock_state_diff_response_manager, - mut mock_header_response_manager, - // The test will fail if we drop these - mock_transaction_response_manager: _mock_transaction_responses_manager, - mock_class_response_manager: _mock_class_responses_manager, - .. - } = setup(); - let mut rng = get_rng(); - // TODO(eitan): Add a 3rd constant for NUM_CHUNKS_PER_BLOCK so that ThinStateDiff is made from - // multiple StateDiffChunks - let (state_diffs, header_state_diff_lengths): (Vec<_>, Vec<_>) = (0..HEADER_QUERY_LENGTH) - .map(|_| { - let diff = create_random_state_diff_chunk(&mut rng); - let length = diff.len(); - (diff, length) - }) - .unzip(); - - let (state_diff_sender, mut state_diff_receiver) = channel(p2p_sync.config.buffer_size); - - // Create a future that will receive send responses and validate the results. - let test_future = async move { - for (start_block_number, num_blocks) in [ - (0u64, STATE_DIFF_QUERY_LENGTH), - (STATE_DIFF_QUERY_LENGTH, HEADER_QUERY_LENGTH - STATE_DIFF_QUERY_LENGTH), - ] { - for block_number in start_block_number..(start_block_number + num_blocks) { - let state_diff_chunk = state_diffs[usize::try_from(block_number).unwrap()].clone(); - - let block_number = BlockNumber(block_number); - // Check that before we've sent all parts the state diff wasn't written yet. - let txn = storage_reader.begin_ro_txn().unwrap(); - assert_eq!(block_number, txn.get_state_marker().unwrap()); - - state_diff_sender.send(Some(state_diff_chunk.clone())).await.unwrap(); - - // Check state diff was written to the storage. This way we make sure that the sync - // writes to the storage each block's state diff before receiving all query - // responses. + let class_hash0 = ClassHash(ascii_as_felt("class_hash0").unwrap()); + let class_hash1 = ClassHash(ascii_as_felt("class_hash1").unwrap()); + let casm_hash0 = CompiledClassHash(ascii_as_felt("casm_hash0").unwrap()); + let address0 = ContractAddress(ascii_as_felt("address0").unwrap().try_into().unwrap()); + let address1 = ContractAddress(ascii_as_felt("address1").unwrap().try_into().unwrap()); + let address2 = ContractAddress(ascii_as_felt("address2").unwrap().try_into().unwrap()); + let key0 = StorageKey(ascii_as_felt("key0").unwrap().try_into().unwrap()); + let key1 = StorageKey(ascii_as_felt("key1").unwrap().try_into().unwrap()); + let value0 = ascii_as_felt("value0").unwrap(); + let value1 = ascii_as_felt("value1").unwrap(); + let nonce0 = Nonce(ascii_as_felt("nonce0").unwrap()); + + let state_diffs_and_chunks = vec![ + ( + ThinStateDiff { + deployed_contracts: indexmap!(address0 => class_hash0), + storage_diffs: indexmap!(address0 => indexmap!(key0 => value0, key1 => value1)), + declared_classes: indexmap!(class_hash0 => casm_hash0), + deprecated_declared_classes: vec![class_hash1], + nonces: indexmap!(address0 => nonce0), + replaced_classes: Default::default(), + }, + vec![ + StateDiffChunk::DeclaredClass(DeclaredClass { + class_hash: class_hash0, + compiled_class_hash: casm_hash0, + }), + StateDiffChunk::ContractDiff(ContractDiff { + contract_address: address0, + class_hash: Some(class_hash0), + nonce: Some(nonce0), + storage_diffs: indexmap!(key0 => value0, key1 => value1), + }), + StateDiffChunk::DeprecatedDeclaredClass(DeprecatedDeclaredClass { + class_hash: class_hash1, + }), + ], + ), + ( + ThinStateDiff { + deployed_contracts: indexmap!(address1 => class_hash1), + storage_diffs: indexmap!( + address1 => indexmap!(key0 => value0), + address2 => indexmap!(key1 => value1) + ), + nonces: indexmap!(address2 => nonce0), + ..Default::default() + }, + vec![ + StateDiffChunk::ContractDiff(ContractDiff { + contract_address: address1, + class_hash: Some(class_hash1), + nonce: None, + storage_diffs: indexmap!(key0 => value0), + }), + StateDiffChunk::ContractDiff(ContractDiff { + contract_address: address2, + class_hash: None, + nonce: Some(nonce0), + storage_diffs: indexmap!(key1 => value1), + }), + ], + ), + ]; + + let mut actions = vec![ + // We already validate the header query content in other tests. + Action::ReceiveQuery(Box::new(|_query| ()), DataType::Header), + ]; + + // Send headers with corresponding state diff length + for (i, (state_diff, _)) in state_diffs_and_chunks.iter().enumerate() { + actions.push(Action::SendHeader(DataOrFin(Some(random_header( + &mut rng, + BlockNumber(i.try_into().unwrap()), + Some(state_diff.len()), + None, + ))))); + } + actions.push(Action::SendHeader(DataOrFin(None))); + + let len = state_diffs_and_chunks.len(); + actions.push(Action::ReceiveQuery( + Box::new(move |query| { + assert_eq!( + query, + Query { + start_block: BlockHashOrNumber::Number(BlockNumber(0)), + direction: Direction::Forward, + limit: len.try_into().unwrap(), + step: 1, + } + ) + }), + DataType::StateDiff, + )); + // Send state diff chunks and check storage + for (i, (expected_state_diff, state_diff_chunks)) in + state_diffs_and_chunks.iter().cloned().enumerate() + { + for state_diff_chunk in state_diff_chunks { + // Check that before the last chunk was sent, the state diff isn't written. + actions.push(Action::CheckStorage(Box::new(move |reader| { + async move { + assert_eq!( + u64::try_from(i).unwrap(), + reader.begin_ro_txn().unwrap().get_state_marker().unwrap().0 + ); + } + .boxed() + }))); + actions.push(Action::SendStateDiff(DataOrFin(Some(state_diff_chunk)))); + } + // Check that a block's state diff is written before the entire query finished. + actions.push(Action::CheckStorage(Box::new(move |reader| { + async move { + let block_number = BlockNumber(i.try_into().unwrap()); wait_for_marker( DataType::StateDiff, - &storage_reader, + &reader, block_number.unchecked_next(), SLEEP_DURATION_TO_LET_SYNC_ADVANCE, TIMEOUT_FOR_TEST, ) .await; - let txn = storage_reader.begin_ro_txn().unwrap(); - let state_diff = txn.get_state_diff(block_number).unwrap().unwrap(); - // TODO(noamsp): refactor test so that we treat multiple state diff chunks as a - // single state diff - let expected_state_diff = match state_diff_chunk { - StateDiffChunk::ContractDiff(contract_diff) => { - let mut deployed_contracts = indexmap! {}; - if let Some(class_hash) = contract_diff.class_hash { - deployed_contracts.insert(contract_diff.contract_address, class_hash); - }; - let mut nonces = indexmap! {}; - if let Some(nonce) = contract_diff.nonce { - nonces.insert(contract_diff.contract_address, nonce); - } - ThinStateDiff { - deployed_contracts, - nonces, - storage_diffs: indexmap! { - contract_diff.contract_address => contract_diff.storage_diffs - }, - ..Default::default() - } - } - StateDiffChunk::DeclaredClass(declared_class) => ThinStateDiff { - declared_classes: indexmap! { - declared_class.class_hash => declared_class.compiled_class_hash - }, - ..Default::default() - }, - StateDiffChunk::DeprecatedDeclaredClass(deprecated_declared_class) => { - ThinStateDiff { - deprecated_declared_classes: vec![deprecated_declared_class.class_hash], - ..Default::default() - } - } - }; - assert_eq!(state_diff, expected_state_diff); + let txn = reader.begin_ro_txn().unwrap(); + let actual_state_diff = txn.get_state_diff(block_number).unwrap().unwrap(); + assert_eq!(actual_state_diff, expected_state_diff); } - - state_diff_sender.send(None).await.unwrap(); - } - }; - - tokio::select! { - sync_result = p2p_sync.run() => { - sync_result.unwrap(); - panic!("P2P sync aborted with no failure."); - } - _ = join( - run_state_diff_sync_through_channel( - &mut mock_header_response_manager, - &mut mock_state_diff_response_manager, - header_state_diff_lengths, - &mut state_diff_receiver, - false, - ), - test_future, - ) => {} + .boxed() + }))); } + actions.push(Action::SendStateDiff(DataOrFin(None))); + + run_test( + HashMap::from([ + (DataType::Header, state_diffs_and_chunks.len().try_into().unwrap()), + (DataType::StateDiff, state_diffs_and_chunks.len().try_into().unwrap()), + ]), + actions, + ) + .await; } // TODO(noamsp): Consider verifying that ParseDataError::BadPeerError(EmptyStateDiffPart) was @@ -288,219 +303,42 @@ async fn validate_state_diff_fails( header_state_diff_lengths: Vec, state_diff_chunks: Vec>, ) { - let TestArgs { - storage_reader, - p2p_sync, - mut mock_state_diff_response_manager, - mut mock_header_response_manager, - // The test will fail if we drop these - mock_transaction_response_manager: _mock_transaction_responses_manager, - mock_class_response_manager: _mock_class_responses_manager, - .. - } = setup(); - - let (state_diff_sender, mut state_diff_receiver) = channel(p2p_sync.config.buffer_size); - - // Create a future that will send responses and validate the results. - let test_future = async move { - for state_diff_chunk in state_diff_chunks { - // Check that before we've sent all parts the state diff wasn't written yet. - let txn = storage_reader.begin_ro_txn().unwrap(); - assert_eq!(0, txn.get_state_marker().unwrap().0); - - state_diff_sender.send(state_diff_chunk).await.unwrap(); - } - }; - - tokio::select! { - sync_result = p2p_sync.run() => { - sync_result.unwrap(); - panic!("P2P sync aborted with no failure."); - } - _ = join( - run_state_diff_sync_through_channel( - &mut mock_header_response_manager, - &mut mock_state_diff_response_manager, - header_state_diff_lengths, - &mut state_diff_receiver, - true, - ), - test_future - ) => {} - } -} - -// Advances the header sync with associated header state diffs. -// The receiver waits for external sender to provide the state diff chunks. -async fn run_state_diff_sync_through_channel( - mock_header_response_manager: &mut GenericReceiver, - mock_state_diff_response_manager: &mut GenericReceiver, - header_state_diff_lengths: Vec, - state_diff_chunk_receiver: &mut Receiver>, - should_assert_reported: bool, -) { - // We wait for the state diff sync to see that there are no headers and start sleeping - tokio::time::sleep(SLEEP_DURATION_TO_LET_SYNC_ADVANCE).await; - - // Check that before we send headers there is no state diff query. - assert!(mock_state_diff_response_manager.next().now_or_never().is_none()); - - let num_headers = header_state_diff_lengths.len(); - let block_hashes_and_signatures = - create_block_hashes_and_signatures(num_headers.try_into().unwrap()); - - // split the headers into queries of size HEADER_QUERY_LENGTH and send headers for each query - for headers_for_current_query in block_hashes_and_signatures - .into_iter() - .zip(header_state_diff_lengths.clone().into_iter()) - .enumerate() - .collect::>() - .chunks(HEADER_QUERY_LENGTH.try_into().unwrap()) - .map(Vec::from) - { - // Receive the next query from header sync - let mut mock_header_responses_manager = mock_header_response_manager.next().await.unwrap(); - - for (i, ((block_hash, block_signature), header_state_diff_length)) in - headers_for_current_query - { - // Send header responses - mock_header_responses_manager - .send_response(DataOrFin(Some(SignedBlockHeader { - block_header: BlockHeader { - block_hash, - block_header_without_hash: BlockHeaderWithoutHash { - block_number: BlockNumber(u64::try_from(i).unwrap()), - ..Default::default() - }, - state_diff_length: Some(header_state_diff_length), - ..Default::default() - }, - signatures: vec![block_signature], - }))) - .await - .unwrap(); - } + let mut rng = get_rng(); - mock_header_responses_manager.send_response(DataOrFin(None)).await.unwrap(); + let mut actions = vec![ + // We already validate the header query content in other tests. + Action::ReceiveQuery(Box::new(|_query| ()), DataType::Header), + ]; + + // Send headers with corresponding state diff length + for (i, state_diff_length) in header_state_diff_lengths.iter().copied().enumerate() { + actions.push(Action::SendHeader(DataOrFin(Some(random_header( + &mut rng, + BlockNumber(i.try_into().unwrap()), + Some(state_diff_length), + None, + ))))); } + actions.push(Action::SendHeader(DataOrFin(None))); - // TODO(noamsp): remove sleep and wait until header marker writes the new headers. remove the - // comment from the StateDiffQuery about the limit being too low. We wait for the header - // sync to write the new headers. - tokio::time::sleep(SLEEP_DURATION_TO_LET_SYNC_ADVANCE).await; - - // Simulate time has passed so that state diff sync will resend query after it waited for - // new header - tokio::time::pause(); - tokio::time::advance(WAIT_PERIOD_FOR_NEW_DATA).await; - tokio::time::resume(); - - let num_state_diff_headers = u64::try_from(num_headers).unwrap(); - let num_state_diff_queries = num_state_diff_headers.div_ceil(STATE_DIFF_QUERY_LENGTH); - - for i in 0..num_state_diff_queries { - let start_block_number = i * STATE_DIFF_QUERY_LENGTH; - let limit = min(num_state_diff_headers - start_block_number, STATE_DIFF_QUERY_LENGTH); - - // Get a state diff query and validate it - let mut mock_state_diff_responses_manager = - mock_state_diff_response_manager.next().await.unwrap(); - assert_eq!( - *mock_state_diff_responses_manager.query(), - Ok(StateDiffQuery(Query { - start_block: BlockHashOrNumber::Number(BlockNumber(start_block_number)), - direction: Direction::Forward, - limit, - step: 1, - })), - "If the limit of the query is too low, try to increase \ - SLEEP_DURATION_TO_LET_SYNC_ADVANCE", - ); - - let mut current_state_diff_length = 0; - let destination_state_diff_length = - header_state_diff_lengths[start_block_number.try_into().unwrap() - ..(start_block_number + limit).try_into().unwrap()] - .iter() - .sum(); - - while current_state_diff_length < destination_state_diff_length { - let state_diff_chunk = state_diff_chunk_receiver.recv().await.unwrap(); - - mock_state_diff_responses_manager - .send_response(DataOrFin(state_diff_chunk.clone())) - .await - .unwrap(); - - if let Some(state_diff_chunk) = state_diff_chunk { - if !state_diff_chunk.is_empty() { - current_state_diff_length += state_diff_chunk.len(); - continue; - } - } - - break; - } - - if should_assert_reported { - mock_state_diff_responses_manager.assert_reported(TIMEOUT_FOR_TEST).await; - continue; - } + actions.push( + // We already validate the state diff query content in other tests. + Action::ReceiveQuery(Box::new(|_query| ()), DataType::StateDiff), + ); - assert_eq!(current_state_diff_length, destination_state_diff_length); - let state_diff_chunk = state_diff_chunk_receiver.recv().await.unwrap(); - mock_state_diff_responses_manager - .send_response(DataOrFin(state_diff_chunk.clone())) - .await - .unwrap(); + // Send state diff chunks. + for state_diff_chunk in state_diff_chunks { + actions.push(Action::SendStateDiff(DataOrFin(state_diff_chunk))); } -} -pub(crate) async fn run_state_diff_sync( - config: P2PSyncClientConfig, - mock_header_response_manager: &mut GenericReceiver, - mock_state_diff_response_manager: &mut GenericReceiver, - header_state_diff_lengths: Vec, - state_diff_chunks: Vec>, -) { - let (state_diff_sender, mut state_diff_receiver) = channel(config.buffer_size); - tokio::join! { - run_state_diff_sync_through_channel( - mock_header_response_manager, - mock_state_diff_response_manager, - header_state_diff_lengths, - &mut state_diff_receiver, - false, - ), - async { - for state_diff in state_diff_chunks.chunks(STATE_DIFF_QUERY_LENGTH.try_into().unwrap()) { - for state_diff_chunk in state_diff { - state_diff_sender.send(state_diff_chunk.clone()).await.unwrap(); - } + actions.push(Action::ValidateReportSent(DataType::StateDiff)); - state_diff_sender.send(None).await.unwrap(); - } - } - }; -} - -fn create_random_state_diff_chunk(rng: &mut ChaCha8Rng) -> StateDiffChunk { - let mut state_diff_chunk = StateDiffChunk::get_test_instance(rng); - let contract_address = ContractAddress::from(rng.next_u64()); - let class_hash = ClassHash(rng.next_u64().into()); - match &mut state_diff_chunk { - StateDiffChunk::ContractDiff(contract_diff) => { - contract_diff.contract_address = contract_address; - contract_diff.class_hash = Some(class_hash); - } - StateDiffChunk::DeclaredClass(declared_class) => { - declared_class.class_hash = class_hash; - declared_class.compiled_class_hash = CompiledClassHash(rng.next_u64().into()); - } - StateDiffChunk::DeprecatedDeclaredClass(deprecated_declared_class) => { - deprecated_declared_class.class_hash = class_hash; - } - } - state_diff_chunk + run_test( + HashMap::from([ + (DataType::Header, header_state_diff_lengths.len().try_into().unwrap()), + (DataType::StateDiff, header_state_diff_lengths.len().try_into().unwrap()), + ]), + actions, + ) + .await; } diff --git a/crates/papyrus_p2p_sync/src/client/stream_builder.rs b/crates/papyrus_p2p_sync/src/client/stream_builder.rs index 36718a939d1..0869fe5b925 100644 --- a/crates/papyrus_p2p_sync/src/client/stream_builder.rs +++ b/crates/papyrus_p2p_sync/src/client/stream_builder.rs @@ -1,11 +1,12 @@ use std::cmp::min; +use std::collections::HashMap; use std::time::Duration; use async_stream::stream; use futures::channel::mpsc::Receiver; use futures::future::BoxFuture; use futures::stream::BoxStream; -use futures::StreamExt; +use futures::{FutureExt, StreamExt}; use papyrus_network::network_manager::{ClientResponsesManager, SqmrClientSender}; use papyrus_protobuf::converters::ProtobufConversionError; use papyrus_protobuf::sync::{BlockHashOrNumber, DataOrFin, Direction, Query}; @@ -14,6 +15,7 @@ use papyrus_storage::state::StateStorageReader; use papyrus_storage::{StorageError, StorageReader, StorageWriter}; use starknet_api::block::{BlockNumber, BlockSignature}; use starknet_api::core::ClassHash; +use starknet_state_sync_types::state_sync_types::SyncBlock; use tracing::{debug, info, warn}; use super::{P2PSyncClientError, STEP}; @@ -53,13 +55,50 @@ where fn get_start_block_number(storage_reader: &StorageReader) -> Result; + // TODO(Eitan): Remove option on return once we have a class manager component. + /// Returning None happens when internal blocks are disabled for this stream. + fn convert_sync_block_to_block_data( + block_number: BlockNumber, + sync_block: SyncBlock, + ) -> Option; + + fn get_internal_block_at( + internal_blocks_received: &mut HashMap, + internal_block_receiver: &mut Option>, + current_block_number: BlockNumber, + ) -> Option { + if let Some(block) = internal_blocks_received.remove(¤t_block_number) { + return Some(block); + } + let Some(internal_block_receiver) = internal_block_receiver else { return None }; + while let Some((block_number, sync_block)) = internal_block_receiver + .next() + .now_or_never() + .map(|now_or_never_res| now_or_never_res.expect("Internal block receiver closed")) + { + if block_number >= current_block_number { + let block_data = + match Self::convert_sync_block_to_block_data(block_number, sync_block) { + Some(block_data) => block_data, + // If None is received then we don't use internal blocks for this stream + // TODO(Eitan): Remove this once we have a class manager component. + None => return None, + }; + if block_number == current_block_number { + return Some(block_data); + } + internal_blocks_received.insert(block_number, block_data); + } + } + None + } + fn create_stream( mut sqmr_sender: SqmrClientSender>, storage_reader: StorageReader, - _internal_block_receiver: Option>, + mut internal_block_receiver: Option>, wait_period_for_new_data: Duration, num_blocks_per_query: u64, - stop_sync_at_block_number: Option, ) -> BoxStream<'static, DataStreamResult> where TQuery: From + Send + 'static, @@ -67,6 +106,7 @@ where { stream! { let mut current_block_number = Self::get_start_block_number(&storage_reader)?; + let mut internal_blocks_received = HashMap::new(); 'send_query_and_parse_responses: loop { let limit = match Self::BLOCK_NUMBER_LIMIT { BlockNumberLimit::Unlimited => num_blocks_per_query, @@ -85,13 +125,23 @@ where limit }, }; + + if let Some(block) = Self::get_internal_block_at(&mut internal_blocks_received, &mut internal_block_receiver, current_block_number) + { + debug!("Sync received internally {:?} for block {}.", Self::TYPE_DESCRIPTION, current_block_number); + yield Ok(Box::::from(Box::new(block))); + current_block_number = current_block_number.unchecked_next(); + continue 'send_query_and_parse_responses; + } + let end_block_number = current_block_number.0 + limit; debug!( - "Downloading {:?} for blocks [{}, {})", + "Sync downloading {:?} for blocks [{}, {}) from network.", Self::TYPE_DESCRIPTION, current_block_number.0, end_block_number, ); + // TODO(shahak): Use the report callback. let mut client_response_manager = sqmr_sender .send_new_query( @@ -101,9 +151,7 @@ where limit, step: STEP, }) - ) - .await?; - + ).await?; while current_block_number.0 < end_block_number { match Self::parse_data_for_block( &mut client_response_manager, current_block_number, &storage_reader @@ -134,12 +182,6 @@ where } info!("Added {:?} for block {}.", Self::TYPE_DESCRIPTION, current_block_number); current_block_number = current_block_number.unchecked_next(); - if stop_sync_at_block_number.is_some_and(|stop_sync_at_block_number| { - current_block_number >= stop_sync_at_block_number - }) { - info!("{:?} hit the stop sync block number.", Self::TYPE_DESCRIPTION); - return; - } } // Consume the None message signaling the end of the query. diff --git a/crates/papyrus_p2p_sync/src/client/test_utils.rs b/crates/papyrus_p2p_sync/src/client/test_utils.rs index 038dd781917..80aec949610 100644 --- a/crates/papyrus_p2p_sync/src/client/test_utils.rs +++ b/crates/papyrus_p2p_sync/src/client/test_utils.rs @@ -64,7 +64,6 @@ lazy_static! { num_block_classes_per_query: CLASS_DIFF_QUERY_LENGTH, wait_period_for_new_data: WAIT_PERIOD_FOR_NEW_DATA, buffer_size: BUFFER_SIZE, - stop_sync_at_block_number: None, }; } pub(crate) type HeaderTestPayload = @@ -142,7 +141,6 @@ pub enum Action { SendHeader(DataOrFin), /// Send a state diff as a response to a query we got from ReceiveQuery. Will panic if didn't /// call ReceiveQuery with DataType::StateDiff before. - #[allow(dead_code)] SendStateDiff(DataOrFin), /// Send a transaction as a response to a query we got from ReceiveQuery. Will panic if didn't /// call ReceiveQuery with DataType::Transaction before. @@ -150,7 +148,6 @@ pub enum Action { SendTransaction(DataOrFin), /// Send a class as a response to a query we got from ReceiveQuery. Will panic if didn't /// call ReceiveQuery with DataType::Class before. - #[allow(dead_code)] SendClass(DataOrFin<(ApiContractClass, ClassHash)>), /// Perform custom validations on the storage. Returns back the storage reader it received as /// input @@ -174,7 +171,6 @@ pub async fn run_test(max_query_lengths: HashMap, actions: Vec for TransactionStreamFactory { fn get_start_block_number(storage_reader: &StorageReader) -> Result { storage_reader.begin_ro_txn()?.get_body_marker() } + + // TODO(Eitan): Use real transactions once SyncBlock contains data required by full nodes + fn convert_sync_block_to_block_data( + block_number: BlockNumber, + sync_block: SyncBlock, + ) -> Option<(BlockBody, BlockNumber)> { + let num_transactions = sync_block.transaction_hashes.len(); + let mut rng = get_rng(); + let block_body = BlockBody { + transaction_hashes: sync_block.transaction_hashes, + transaction_outputs: std::iter::repeat_with(|| { + TransactionOutput::get_test_instance(&mut rng) + }) + .take(num_transactions) + .collect::>(), + transactions: std::iter::repeat_with(|| Transaction::get_test_instance(&mut rng)) + .take(num_transactions) + .collect::>(), + }; + Some((block_body, block_number)) + } } diff --git a/crates/papyrus_proc_macros/Cargo.toml b/crates/papyrus_proc_macros/Cargo.toml index e2471eb39d1..b969fa8d450 100644 --- a/crates/papyrus_proc_macros/Cargo.toml +++ b/crates/papyrus_proc_macros/Cargo.toml @@ -14,8 +14,8 @@ tracing.workspace = true [dev-dependencies] metrics.workspace = true metrics-exporter-prometheus.workspace = true -papyrus_common.workspace = true -papyrus_test_utils.workspace = true +papyrus_common.path = "../papyrus_common" +papyrus_test_utils.path = "../papyrus_test_utils" prometheus-parse.workspace = true [lib] diff --git a/crates/papyrus_protobuf/Cargo.toml b/crates/papyrus_protobuf/Cargo.toml index 1fe9091503c..15f5029bed6 100644 --- a/crates/papyrus_protobuf/Cargo.toml +++ b/crates/papyrus_protobuf/Cargo.toml @@ -27,7 +27,7 @@ papyrus_common.workspace = true [dev-dependencies] rand.workspace = true rand_chacha.workspace = true -papyrus_test_utils.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" [build-dependencies] prost-build.workspace = true diff --git a/crates/papyrus_protobuf/src/consensus.rs b/crates/papyrus_protobuf/src/consensus.rs index 5afa4522fcb..feb40ee908a 100644 --- a/crates/papyrus_protobuf/src/consensus.rs +++ b/crates/papyrus_protobuf/src/consensus.rs @@ -1,6 +1,6 @@ use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::core::ContractAddress; -use starknet_api::transaction::{Transaction, TransactionHash}; +use starknet_api::transaction::Transaction; use crate::converters::ProtobufConversionError; @@ -31,6 +31,7 @@ pub struct Vote { pub voter: ContractAddress, } +// TODO: remove this once we are sure everything works using just Vote. #[derive(Debug, Clone, Hash, Eq, PartialEq)] pub enum ConsensusMessage { Proposal(Proposal), // To be deprecated @@ -52,7 +53,7 @@ pub enum StreamMessageBody { Fin, } -#[derive(Debug, Clone, Hash, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct StreamMessage> + TryFrom, Error = ProtobufConversionError>> { pub message: StreamMessageBody, pub stream_id: u64, @@ -60,7 +61,7 @@ pub struct StreamMessage> + TryFrom, Error = ProtobufCon } /// This message must be sent first when proposing a new block. -#[derive(Default, Debug, Clone, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq)] pub struct ProposalInit { /// The height of the consensus (block number). pub height: BlockNumber, @@ -72,14 +73,26 @@ pub struct ProposalInit { pub proposer: ContractAddress, } +/// A temporary constant to use as a validator ID. Zero is not a valid contract address. +// TODO(Matan): Remove this once we have a proper validator set. +pub const DEFAULT_VALIDATOR_ID: u64 = 100; + +impl Default for ProposalInit { + fn default() -> Self { + ProposalInit { + height: Default::default(), + round: Default::default(), + valid_round: Default::default(), + proposer: ContractAddress::from(DEFAULT_VALIDATOR_ID), + } + } +} + /// There is one or more batches of transactions in a proposed block. #[derive(Debug, Clone, PartialEq)] pub struct TransactionBatch { /// The transactions in the batch. pub transactions: Vec, - // TODO(guyn): remove this once we know how to get hashes as part of the compilation. - /// The transaction's hashes. - pub tx_hashes: Vec, } /// The proposal is done when receiving this fin message, which contains the block hash. diff --git a/crates/papyrus_protobuf/src/converters/consensus.rs b/crates/papyrus_protobuf/src/converters/consensus.rs index 708a9ee3b99..6e431e7411d 100644 --- a/crates/papyrus_protobuf/src/converters/consensus.rs +++ b/crates/papyrus_protobuf/src/converters/consensus.rs @@ -6,8 +6,7 @@ use std::convert::{TryFrom, TryInto}; use prost::Message; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::hash::StarkHash; -use starknet_api::transaction::{Transaction, TransactionHash}; -use starknet_types_core::felt::Felt; +use starknet_api::transaction::Transaction; use crate::consensus::{ ConsensusMessage, @@ -24,6 +23,7 @@ use crate::consensus::{ use crate::converters::ProtobufConversionError; use crate::{auto_impl_into_and_try_from_vec_u8, protobuf}; +// TODO(guyn): remove this once we integrate ProposalPart everywhere. impl TryFrom for Proposal { type Error = ProtobufConversionError; @@ -227,8 +227,6 @@ impl From for protobuf::ProposalInit { auto_impl_into_and_try_from_vec_u8!(ProposalInit, protobuf::ProposalInit); -// TODO(guyn): remove tx_hashes once we know how to compile the hashes -// when making the executable transactions. impl TryFrom for TransactionBatch { type Error = ProtobufConversionError; fn try_from(value: protobuf::TransactionBatch) -> Result { @@ -237,20 +235,14 @@ impl TryFrom for TransactionBatch { .into_iter() .map(|tx| tx.try_into()) .collect::, ProtobufConversionError>>()?; - let tx_hashes = value - .tx_hashes - .into_iter() - .map(|x| Felt::try_from(x).map(TransactionHash)) - .collect::>()?; - Ok(TransactionBatch { transactions, tx_hashes }) + Ok(TransactionBatch { transactions }) } } impl From for protobuf::TransactionBatch { fn from(value: TransactionBatch) -> Self { let transactions = value.transactions.into_iter().map(Into::into).collect(); - let tx_hashes = value.tx_hashes.into_iter().map(|hash| hash.0.into()).collect(); - protobuf::TransactionBatch { transactions, tx_hashes } + protobuf::TransactionBatch { transactions } } } diff --git a/crates/papyrus_protobuf/src/converters/consensus_test.rs b/crates/papyrus_protobuf/src/converters/consensus_test.rs index 57e328a7fac..51f34a3f70e 100644 --- a/crates/papyrus_protobuf/src/converters/consensus_test.rs +++ b/crates/papyrus_protobuf/src/converters/consensus_test.rs @@ -12,8 +12,8 @@ use starknet_api::transaction::{ }; use crate::consensus::{ - ConsensusMessage, - Proposal, + ConsensusMessage, // TODO: remove this + Proposal, // TODO: remove this ProposalFin, ProposalInit, ProposalPart, @@ -51,11 +51,11 @@ fn add_gas_values_to_transaction(transactions: &mut [Transaction]) { fn convert_stream_message_to_vec_u8_and_back() { let mut rng = get_rng(); - // Test that we can convert a StreamMessage with a ConsensusMessage message to bytes and back. - let mut stream_message: StreamMessage = + // Test that we can convert a StreamMessage with a ProposalPart message to bytes and back. + let mut stream_message: StreamMessage = StreamMessage::get_test_instance(&mut rng); - if let StreamMessageBody::Content(ConsensusMessage::Proposal(proposal)) = + if let StreamMessageBody::Content(ProposalPart::Transactions(proposal)) = &mut stream_message.message { add_gas_values_to_transaction(&mut proposal.transactions); @@ -66,6 +66,7 @@ fn convert_stream_message_to_vec_u8_and_back() { assert_eq!(stream_message, res_data); } +// TODO(guyn): this can be removed once ConsensusMessage is taken out. #[test] fn convert_consensus_message_to_vec_u8_and_back() { let mut rng = get_rng(); @@ -112,7 +113,7 @@ fn convert_proposal_init_to_vec_u8_and_back() { let proposal_init = ProposalInit::get_test_instance(&mut rng); - let bytes_data: Vec = proposal_init.clone().into(); + let bytes_data: Vec = proposal_init.into(); let res_data = ProposalInit::try_from(bytes_data).unwrap(); assert_eq!(proposal_init, res_data); } diff --git a/crates/papyrus_protobuf/src/converters/test_instances.rs b/crates/papyrus_protobuf/src/converters/test_instances.rs index 01c9c1903aa..c870e1f8e8d 100644 --- a/crates/papyrus_protobuf/src/converters/test_instances.rs +++ b/crates/papyrus_protobuf/src/converters/test_instances.rs @@ -2,11 +2,11 @@ use papyrus_test_utils::{auto_impl_get_test_instance, get_number_of_variants, Ge use rand::Rng; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::core::ContractAddress; -use starknet_api::transaction::{Transaction, TransactionHash}; +use starknet_api::transaction::Transaction; use crate::consensus::{ - ConsensusMessage, - Proposal, + ConsensusMessage, // TODO: remove this + Proposal, // TODO: remove this ProposalFin, ProposalInit, ProposalPart, @@ -18,6 +18,7 @@ use crate::consensus::{ }; auto_impl_get_test_instance! { + // TODO(guyn): remove this once we integrate ProposalPart everywhere. pub enum ConsensusMessage { Proposal(Proposal) = 0, Vote(Vote) = 1, @@ -52,7 +53,6 @@ auto_impl_get_test_instance! { } pub struct TransactionBatch { pub transactions: Vec, - pub tx_hashes: Vec, } pub enum ProposalPart { Init(ProposalInit) = 0, @@ -64,10 +64,12 @@ auto_impl_get_test_instance! { // The auto_impl_get_test_instance macro does not work for StreamMessage because it has // a generic type. TODO(guyn): try to make the macro work with generic types. -impl GetTestInstance for StreamMessage { +impl GetTestInstance for StreamMessage { fn get_test_instance(rng: &mut rand_chacha::ChaCha8Rng) -> Self { let message = if rng.gen_bool(0.5) { - StreamMessageBody::Content(ConsensusMessage::Proposal(Proposal::get_test_instance(rng))) + StreamMessageBody::Content(ProposalPart::Transactions(TransactionBatch { + transactions: vec![Transaction::get_test_instance(rng)], + })) } else { StreamMessageBody::Fin }; diff --git a/crates/papyrus_protobuf/src/converters/transaction.rs b/crates/papyrus_protobuf/src/converters/transaction.rs index 2e43b8ccf60..f035c4a02f1 100644 --- a/crates/papyrus_protobuf/src/converters/transaction.rs +++ b/crates/papyrus_protobuf/src/converters/transaction.rs @@ -1253,7 +1253,7 @@ impl From for protobuf::transaction::Deploy { impl TryFrom for L1HandlerTransaction { type Error = ProtobufConversionError; fn try_from(value: protobuf::transaction::L1HandlerV0) -> Result { - let version = TransactionVersion(Felt::ZERO); + let version = L1HandlerTransaction::VERSION; let nonce = Nonce( value diff --git a/crates/papyrus_protobuf/src/proto/p2p/proto/consensus.proto b/crates/papyrus_protobuf/src/proto/p2p/proto/consensus.proto index 81e5af8d2c6..2761f487350 100644 --- a/crates/papyrus_protobuf/src/proto/p2p/proto/consensus.proto +++ b/crates/papyrus_protobuf/src/proto/p2p/proto/consensus.proto @@ -55,8 +55,6 @@ message ProposalInit { message TransactionBatch { repeated Transaction transactions = 1; - // TODO(guyn): remove this once we know how to calculate hashes - repeated Felt252 tx_hashes = 2; } message ProposalFin { diff --git a/crates/papyrus_rpc/Cargo.toml b/crates/papyrus_rpc/Cargo.toml index 39856c7ed7b..c2a60be0741 100644 --- a/crates/papyrus_rpc/Cargo.toml +++ b/crates/papyrus_rpc/Cargo.toml @@ -48,17 +48,17 @@ jsonschema.workspace = true lazy_static.workspace = true metrics-exporter-prometheus.workspace = true mockall.workspace = true -papyrus_execution = { workspace = true, features = ["testing"] } -papyrus_storage = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +papyrus_execution = { path = "../papyrus_execution", features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } +papyrus_test_utils.path = "../papyrus_test_utils" pretty_assertions.workspace = true prometheus-parse.workspace = true rand.workspace = true rand_chacha.workspace = true reqwest.workspace = true starknet-core.workspace = true -starknet_api = { workspace = true, features = ["testing"] } -starknet_client = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } +starknet_client = { path = "../starknet_client", features = ["testing"] } strum.workspace = true strum_macros.workspace = true diff --git a/crates/papyrus_rpc/src/v0_8/execution_test.rs b/crates/papyrus_rpc/src/v0_8/execution_test.rs index 732525a62f6..75fd5c61aaf 100644 --- a/crates/papyrus_rpc/src/v0_8/execution_test.rs +++ b/crates/papyrus_rpc/src/v0_8/execution_test.rs @@ -1204,7 +1204,7 @@ async fn pending_trace_block_transactions_and_trace_transaction_execution_contex #[test] fn message_from_l1_to_l1_handler_tx() { let l1_handler_tx = L1HandlerTransaction::from(MESSAGE_FROM_L1.clone()); - assert_eq!(l1_handler_tx.version, TransactionVersion::ONE); + assert_eq!(l1_handler_tx.version, L1HandlerTransaction::VERSION); assert_eq!(l1_handler_tx.contract_address, *CONTRACT_ADDRESS); assert_eq!(l1_handler_tx.entry_point_selector, selector_from_name("l1_handle")); // The first item of calldata is the from_address. diff --git a/crates/papyrus_rpc/src/v0_8/transaction.rs b/crates/papyrus_rpc/src/v0_8/transaction.rs index 16375420410..b491c403f9b 100644 --- a/crates/papyrus_rpc/src/v0_8/transaction.rs +++ b/crates/papyrus_rpc/src/v0_8/transaction.rs @@ -949,9 +949,16 @@ impl Add for ExecutionResources { memory_holes, }, data_availability: DataAvailabilityResources { - l1_gas: self.data_availability.l1_gas + other.data_availability.l1_gas, - l1_data_gas: self.data_availability.l1_data_gas - + other.data_availability.l1_data_gas, + l1_gas: self + .data_availability + .l1_gas + .checked_add(other.data_availability.l1_gas) + .expect("L1 Gas overflow"), + l1_data_gas: self + .data_availability + .l1_data_gas + .checked_add(other.data_availability.l1_data_gas) + .expect("L1_Data Gas overflow"), }, } } @@ -1281,7 +1288,7 @@ impl From for L1HandlerTransaction { calldata.extend_from_slice(&message.payload.0); let calldata = Calldata(Arc::new(calldata)); Self { - version: TransactionVersion::ONE, + version: L1HandlerTransaction::VERSION, contract_address: message.to_address, entry_point_selector: message.entry_point_selector, calldata, diff --git a/crates/papyrus_rpc/src/v0_8/transaction_test.rs b/crates/papyrus_rpc/src/v0_8/transaction_test.rs index 965656b6f87..de2b5dece3d 100644 --- a/crates/papyrus_rpc/src/v0_8/transaction_test.rs +++ b/crates/papyrus_rpc/src/v0_8/transaction_test.rs @@ -16,7 +16,7 @@ use starknet_api::transaction::fields::{ Tip, TransactionSignature, }; -use starknet_api::transaction::{L1HandlerTransaction, Transaction, TransactionVersion}; +use starknet_api::transaction::{L1HandlerTransaction, Transaction}; use starknet_api::{calldata, contract_address, felt, nonce}; use starknet_client::writer::objects::transaction as client_transaction; @@ -38,7 +38,7 @@ use super::{ lazy_static::lazy_static! { // A transaction from MAINNET with tx hash 0x439e12f67962c353182d72b4af12c3f11eaba4b36e552aebcdcd6db66971bdb. static ref L1_HANDLER_TX: L1HandlerTransaction = L1HandlerTransaction { - version: TransactionVersion::ZERO, + version: L1HandlerTransaction::VERSION, nonce: nonce!(0x18e94d), contract_address: contract_address!( "0x73314940630fd6dcda0d772d4c972c4e0a9946bef9dabf4ef84eda8ef542b82" diff --git a/crates/papyrus_state_reader/Cargo.toml b/crates/papyrus_state_reader/Cargo.toml index 80d5d7cabb6..1b81d026393 100644 --- a/crates/papyrus_state_reader/Cargo.toml +++ b/crates/papyrus_state_reader/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true repository.workspace = true license.workspace = true +[features] +cairo_native = ["blockifier/cairo_native"] + [lints] workspace = true @@ -16,6 +19,7 @@ starknet_api.workspace = true [dev-dependencies] assert_matches.workspace = true -blockifier = { workspace = true, features = ["testing"] } +blockifier = { path = "../blockifier", features = ["testing"] } indexmap.workspace = true -papyrus_storage = { workspace = true, features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } +rstest.workspace = true diff --git a/crates/papyrus_state_reader/src/papyrus_state.rs b/crates/papyrus_state_reader/src/papyrus_state.rs index bfa5e01c41f..1bc09381b8f 100644 --- a/crates/papyrus_state_reader/src/papyrus_state.rs +++ b/crates/papyrus_state_reader/src/papyrus_state.rs @@ -1,11 +1,16 @@ +#[cfg(feature = "cairo_native")] +use std::sync::Arc; + use blockifier::execution::contract_class::{ CompiledClassV0, CompiledClassV1, RunnableCompiledClass, - VersionedRunnableCompiledClass, }; +use blockifier::state::contract_class_manager::ContractClassManager; use blockifier::state::errors::{couple_casm_and_sierra, StateError}; -use blockifier::state::global_cache::GlobalContractCache; +#[cfg(feature = "cairo_native")] +use blockifier::state::global_cache::CachedCairoNative; +use blockifier::state::global_cache::CachedCasm; use blockifier::state::state_api::{StateReader, StateResult}; use papyrus_storage::compiled_class::CasmStorageReader; use papyrus_storage::db::RO; @@ -22,19 +27,20 @@ use starknet_types_core::felt::Felt; mod test; type RawPapyrusReader<'env> = papyrus_storage::StorageTxn<'env, RO>; + pub struct PapyrusReader { storage_reader: StorageReader, latest_block: BlockNumber, - global_class_hash_to_class: GlobalContractCache, + contract_class_manager: ContractClassManager, } impl PapyrusReader { pub fn new( storage_reader: StorageReader, latest_block: BlockNumber, - global_class_hash_to_class: GlobalContractCache, + contract_class_manager: ContractClassManager, ) -> Self { - Self { storage_reader, latest_block, global_class_hash_to_class } + Self { storage_reader, latest_block, contract_class_manager } } fn reader(&self) -> StateResult> { @@ -43,12 +49,9 @@ impl PapyrusReader { .map_err(|error| StateError::StateReadError(error.to_string())) } - /// Returns a V1 contract if found, or a V0 contract if a V1 contract is not - /// found, or an `Error` otherwise. - fn get_compiled_class_inner( - &self, - class_hash: ClassHash, - ) -> StateResult { + /// Returns a V1 contract with Sierra if V1 contract is found, or a V0 contract without Sierra + /// if a V1 contract is not found, or an `Error` otherwise. + fn get_compiled_class_inner(&self, class_hash: ClassHash) -> StateResult { let state_number = StateNumber(self.latest_block); let class_declaration_block_number = self .reader()? @@ -69,10 +72,21 @@ impl PapyrusReader { database is inconsistent.", ); let sierra_version = SierraVersion::extract_from_program(&sierra.sierra_program)?; - let runnable_compiled = - RunnableCompiledClass::V1(CompiledClassV1::try_from(casm_compiled_class)?); + let runnable_casm = RunnableCompiledClass::V1(CompiledClassV1::try_from(( + casm_compiled_class, + sierra_version, + ))?); + #[cfg(not(feature = "cairo_native"))] + let cached_casm = CachedCasm::WithoutSierra(runnable_casm); - return Ok(VersionedRunnableCompiledClass::Cairo1((runnable_compiled, sierra_version))); + #[cfg(feature = "cairo_native")] + let cached_casm = if !self.contract_class_manager.run_cairo_native() { + CachedCasm::WithoutSierra(runnable_casm) + } else { + CachedCasm::WithSierra(runnable_casm, Arc::new(sierra)) + }; + + return Ok(cached_casm); } let v0_compiled_class = self @@ -82,12 +96,57 @@ impl PapyrusReader { .map_err(|err| StateError::StateReadError(err.to_string()))?; match v0_compiled_class { - Some(starknet_api_contract_class) => Ok(VersionedRunnableCompiledClass::Cairo0( - CompiledClassV0::try_from(starknet_api_contract_class)?.into(), - )), + Some(starknet_api_contract_class) => { + let runnable_casm = RunnableCompiledClass::V0(CompiledClassV0::try_from( + starknet_api_contract_class, + )?); + Ok(CachedCasm::WithoutSierra(runnable_casm)) + } None => Err(StateError::UndeclaredClassHash(class_hash)), } } + + /// Returns cached casm from cache if exists, otherwise fetches it from state. + fn get_cached_casm(&self, class_hash: ClassHash) -> StateResult { + match self.contract_class_manager.get_casm(&class_hash) { + Some(contract_class) => Ok(contract_class), + None => { + let runnable_casm_from_db = self.get_compiled_class_inner(class_hash)?; + self.contract_class_manager.set_casm(class_hash, runnable_casm_from_db.clone()); + Ok(runnable_casm_from_db) + } + } + } + + fn get_casm(&self, class_hash: ClassHash) -> StateResult { + Ok(self.get_cached_casm(class_hash)?.to_runnable_casm()) + } + + #[cfg(feature = "cairo_native")] + // Handles `get_compiled_class` under the assumption that native compilation has finished. + // Returns the native compiled class if the compilation succeeded and the runnable casm upon + // failure. + fn get_compiled_class_after_waiting_on_native_compilation( + &self, + class_hash: ClassHash, + casm: RunnableCompiledClass, + ) -> RunnableCompiledClass { + assert!( + self.contract_class_manager.wait_on_native_compilation(), + "this function should only be called when the waiting on native compilation flag is \ + on." + ); + let cached_native = self + .contract_class_manager + .get_native(&class_hash) + .expect("Should have native in cache in sync compilation flow."); + match cached_native { + CachedCairoNative::Compiled(compiled_native) => { + RunnableCompiledClass::from(compiled_native) + } + CachedCairoNative::CompilationFailed => casm, + } + } } // Currently unused - will soon replace the same `impl` for `PapyrusStateReader`. @@ -132,16 +191,66 @@ impl StateReader for PapyrusReader { fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { // Assumption: the global cache is cleared upon reverted blocks. - let versioned_contract_class = self.global_class_hash_to_class.get(&class_hash); - match versioned_contract_class { - Some(contract_class) => Ok(RunnableCompiledClass::from(contract_class)), - None => { - let versioned_contract_class_from_db = self.get_compiled_class_inner(class_hash)?; - // The class was declared in a previous (finalized) state; update the global cache. - self.global_class_hash_to_class - .set(class_hash, versioned_contract_class_from_db.clone()); - Ok(RunnableCompiledClass::from(versioned_contract_class_from_db)) + #[cfg(not(feature = "cairo_native"))] + return self.get_casm(class_hash); + + #[cfg(feature = "cairo_native")] + { + if !self.contract_class_manager.run_cairo_native() { + // Cairo native is disabled - fetch and return the casm. + return self.get_casm(class_hash); + } + + // Try fetching native from cache. + if let Some(cached_native) = self.contract_class_manager.get_native(&class_hash) { + match cached_native { + CachedCairoNative::Compiled(compiled_native) => { + return Ok(RunnableCompiledClass::from(compiled_native)); + } + CachedCairoNative::CompilationFailed => { + // The compilation previously failed. Make no further compilation attempts. + // Fetch and return the casm. + return self.get_casm(class_hash); + } + } + }; + + // Native not found in cache. Get the cached casm. + let cached_casm = self.get_cached_casm(class_hash)?; + + // If the fetched casm includes a Sierra, send a compilation request. + // Return the casm. + // NOTE: We assume that whenever the fetched casm does not include a Sierra, compilation + // to native is not required. + match cached_casm { + CachedCasm::WithSierra(runnable_casm, sierra) => { + if let RunnableCompiledClass::V1(casm_v1) = runnable_casm.clone() { + self.contract_class_manager.send_compilation_request(( + class_hash, + sierra.clone(), + casm_v1.clone(), + )); + if self.contract_class_manager.wait_on_native_compilation() { + // With this config, sending a compilation request blocks the sender + // until compilation completes. Retry fetching Native from cache. + return Ok(self + .get_compiled_class_after_waiting_on_native_compilation( + class_hash, + runnable_casm, + )); + } + } else { + panic!( + "A Sierra file was saved in cache for a Cairo0 contract - class hash \ + {class_hash}. This is probably a bug as no Sierra file exists for a \ + Cairo0 contract." + ); + } + + Ok(runnable_casm) + } + CachedCasm::WithoutSierra(runnable_casm) => Ok(runnable_casm), } } } diff --git a/crates/papyrus_state_reader/src/papyrus_state_test.rs b/crates/papyrus_state_reader/src/papyrus_state_test.rs index 0f398f00afc..d1e94af1545 100644 --- a/crates/papyrus_state_reader/src/papyrus_state_test.rs +++ b/crates/papyrus_state_reader/src/papyrus_state_test.rs @@ -1,19 +1,25 @@ +use core::panic; + use assert_matches::assert_matches; +use blockifier::blockifier::config::ContractClassManagerConfig; use blockifier::execution::call_info::CallExecution; +use blockifier::execution::contract_class::RunnableCompiledClass; use blockifier::execution::entry_point::CallEntryPoint; use blockifier::retdata; use blockifier::state::cached_state::CachedState; -use blockifier::state::global_cache::{GlobalContractCache, GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST}; +use blockifier::state::contract_class_manager::ContractClassManager; use blockifier::state::state_api::StateReader; use blockifier::test_utils::contracts::FeatureContract; -use blockifier::test_utils::{trivial_external_entry_point_new, CairoVersion}; +use blockifier::test_utils::{trivial_external_entry_point_new, CairoVersion, RunnableCairo1}; use indexmap::IndexMap; use papyrus_storage::class::ClassStorageWriter; +use papyrus_storage::compiled_class::CasmStorageWriter; use papyrus_storage::state::StateStorageWriter; +use rstest::rstest; use starknet_api::abi::abi_utils::selector_from_name; use starknet_api::block::BlockNumber; use starknet_api::contract_class::ContractClass; -use starknet_api::state::{StateDiff, StorageKey}; +use starknet_api::state::{StateDiff, StorageKey, ThinStateDiff}; use starknet_api::{calldata, felt}; use crate::papyrus_state::PapyrusReader; @@ -49,7 +55,7 @@ fn test_entry_point_with_papyrus_state() -> papyrus_storage::StorageResult<()> { let papyrus_reader = PapyrusReader::new( storage_reader, block_number, - GlobalContractCache::new(GLOBAL_CONTRACT_CACHE_SIZE_FOR_TEST), + ContractClassManager::start(ContractClassManagerConfig::default()), ); let mut state = CachedState::from(papyrus_reader); @@ -75,3 +81,137 @@ fn test_entry_point_with_papyrus_state() -> papyrus_storage::StorageResult<()> { Ok(()) } + +fn build_papyrus_state_reader_and_declare_contract( + contract: FeatureContract, + contract_manager_config: ContractClassManagerConfig, +) -> PapyrusReader { + let class_hash = contract.get_class_hash(); + let ((storage_reader, mut storage_writer), _) = papyrus_storage::test_utils::get_test_storage(); + let test_compiled_class_hash = contract.get_compiled_class_hash(); + let block_number = BlockNumber::default(); + + // Hack to declare the contract in the storage. + match contract.get_class() { + ContractClass::V1((casm_class, _)) => { + let thin_state_diff = ThinStateDiff { + declared_classes: IndexMap::from([(class_hash, test_compiled_class_hash)]), + ..Default::default() + }; + storage_writer + .begin_rw_txn() + .unwrap() + .append_state_diff(block_number, thin_state_diff) + .unwrap() + .append_classes(block_number, &[(class_hash, &contract.get_sierra())], &[]) + .unwrap() + .append_casm(&class_hash, &casm_class) + .unwrap() + .commit() + .unwrap(); + } + + ContractClass::V0(deprecated_contract_class) => { + let thin_state_diff = ThinStateDiff { + deprecated_declared_classes: vec![class_hash], + ..Default::default() + }; + storage_writer + .begin_rw_txn() + .unwrap() + .append_state_diff(block_number, thin_state_diff) + .unwrap() + .append_classes(block_number, &[], &[(class_hash, &deprecated_contract_class)]) + .unwrap() + .commit() + .unwrap(); + } + } + + PapyrusReader::new( + storage_reader, + BlockNumber(1), + ContractClassManager::start(contract_manager_config), + ) +} + +#[rstest] +#[case::dont_run_cairo_native(false, false)] +#[cfg_attr(feature = "cairo_native", case::run_cairo_native_without_waiting(true, false))] +#[cfg_attr(feature = "cairo_native", case::run_cairo_native_and_wait(true, true))] +fn test_get_compiled_class_without_native_in_cache( + #[values(CairoVersion::Cairo0, CairoVersion::Cairo1(RunnableCairo1::Casm))] + cairo_version: CairoVersion, + #[case] run_cairo_native: bool, + #[case] wait_on_native_compilation: bool, +) { + // Sanity checks. + if !run_cairo_native { + assert!(!wait_on_native_compilation); + } + #[cfg(not(feature = "cairo_native"))] + assert!(!run_cairo_native); + + // We store the sierra with the casm only when the casm is cairo1 and the native flag is enabled + let cached_with_sierra = run_cairo_native && matches!(cairo_version, CairoVersion::Cairo1(_)); + let test_contract = FeatureContract::TestContract(cairo_version); + let test_class_hash = test_contract.get_class_hash(); + let contract_manager_config = ContractClassManagerConfig::create_for_testing( + run_cairo_native, + wait_on_native_compilation, + ); + + let papyrus_reader = + build_papyrus_state_reader_and_declare_contract(test_contract, contract_manager_config); + #[cfg(feature = "cairo_native")] + assert!(papyrus_reader.contract_class_manager.get_native(&test_class_hash).is_none()); + + let compiled_class = papyrus_reader.get_compiled_class(test_class_hash).unwrap(); + + if cached_with_sierra { + // TODO: Test that a compilation request was sent. + if wait_on_native_compilation { + #[cfg(feature = "cairo_native")] + assert_matches!( + compiled_class, + RunnableCompiledClass::V1Native(_), + "We should have waited to the native class." + ); + } else { + assert_matches!( + compiled_class, + RunnableCompiledClass::V1(_), + "We do not wait for native, return the cairo1 casm." + ); + } + } else { + assert_eq!( + compiled_class, + test_contract.get_runnable_class(), + "`get_compiled_class` should return the casm" + ); + } +} + +#[cfg(feature = "cairo_native")] +#[test] +fn test_get_compiled_class_when_native_is_cached() { + let ((storage_reader, _), _) = papyrus_storage::test_utils::get_test_storage(); + let test_contract = FeatureContract::TestContract(CairoVersion::Cairo1(RunnableCairo1::Native)); + let test_class_hash = test_contract.get_class_hash(); + let contract_manager_config = ContractClassManagerConfig::create_for_testing(true, true); + let papyrus_reader = PapyrusReader::new( + storage_reader, + BlockNumber::default(), + ContractClassManager::start(contract_manager_config), + ); + if let RunnableCompiledClass::V1Native(native_compiled_class) = + test_contract.get_runnable_class() + { + papyrus_reader.contract_class_manager.set_native(test_class_hash, native_compiled_class); + } else { + panic!("Expected NativeCompiledClassV1"); + } + let compiled_class = papyrus_reader.get_compiled_class(test_class_hash).unwrap(); + assert_matches!(compiled_class, RunnableCompiledClass::V1Native(_)); +} diff --git a/crates/papyrus_storage/Cargo.toml b/crates/papyrus_storage/Cargo.toml index 4320f91e129..92f5d008632 100644 --- a/crates/papyrus_storage/Cargo.toml +++ b/crates/papyrus_storage/Cargo.toml @@ -56,7 +56,7 @@ camelpaste.workspace = true insta = { workspace = true, features = ["yaml"] } metrics-exporter-prometheus.workspace = true num-traits.workspace = true -papyrus_test_utils.workspace = true +papyrus_test_utils.path = "../papyrus_test_utils" paste.workspace = true pretty_assertions.workspace = true prometheus-parse.workspace = true diff --git a/crates/papyrus_sync/Cargo.toml b/crates/papyrus_sync/Cargo.toml index 50ee6603f54..b492314844f 100644 --- a/crates/papyrus_sync/Cargo.toml +++ b/crates/papyrus_sync/Cargo.toml @@ -33,12 +33,12 @@ tracing.workspace = true [dev-dependencies] assert_matches.workspace = true mockall.workspace = true -papyrus_storage = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } +papyrus_test_utils.path = "../papyrus_test_utils" pretty_assertions.workspace = true simple_logger.workspace = true -starknet_api = { workspace = true, features = ["testing"] } -starknet_client = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } +starknet_client = { path = "../starknet_client", features = ["testing"] } tokio-stream.workspace = true [lints] diff --git a/crates/papyrus_sync/src/sources/base_layer.rs b/crates/papyrus_sync/src/sources/base_layer.rs index 2ecac3b8c45..9478c29b215 100644 --- a/crates/papyrus_sync/src/sources/base_layer.rs +++ b/crates/papyrus_sync/src/sources/base_layer.rs @@ -39,6 +39,7 @@ impl< let finality = 0; self.latest_proved_block(finality) .await + .map(|block| block.map(|block| (block.number, block.hash))) .map_err(|e| BaseLayerSourceError::BaseLayerContractError(Box::new(e))) } } diff --git a/crates/sequencing/papyrus_consensus/Cargo.toml b/crates/sequencing/papyrus_consensus/Cargo.toml index 95104b1963b..2fda71a45f9 100644 --- a/crates/sequencing/papyrus_consensus/Cargo.toml +++ b/crates/sequencing/papyrus_consensus/Cargo.toml @@ -26,14 +26,15 @@ starknet_api.workspace = true thiserror.workspace = true tokio = { workspace = true, features = ["sync"] } tracing.workspace = true +validator.workspace = true [dev-dependencies] enum-as-inner.workspace = true mockall.workspace = true -papyrus_network = { workspace = true, features = ["testing"] } -papyrus_network_types = { workspace = true, features = ["testing"] } -papyrus_storage = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +papyrus_network = { path = "../../papyrus_network", features = ["testing"] } +papyrus_network_types = { path = "../../papyrus_network_types", features = ["testing"] } +papyrus_storage = { path = "../../papyrus_storage", features = ["testing"] } +papyrus_test_utils.path = "../../papyrus_test_utils" test-case.workspace = true [lints] diff --git a/crates/sequencing/papyrus_consensus/src/bin/run_simulation.rs b/crates/sequencing/papyrus_consensus/src/bin/run_simulation.rs index 4ebb40c8af8..65f32c7780c 100644 --- a/crates/sequencing/papyrus_consensus/src/bin/run_simulation.rs +++ b/crates/sequencing/papyrus_consensus/src/bin/run_simulation.rs @@ -14,6 +14,7 @@ use fs2::FileExt; use lazy_static::lazy_static; use nix::unistd::Pid; use papyrus_common::tcp::find_free_port; +use papyrus_protobuf::consensus::DEFAULT_VALIDATOR_ID; use tokio::process::Command as TokioCommand; lazy_static! { @@ -265,16 +266,17 @@ async fn build_node(data_dir: &str, logs_dir: &str, i: usize, papyrus_args: &Pap let tcp_port = if is_bootstrap { *BOOTNODE_TCP_PORT } else { find_free_port() }; let monitoring_gateway_server_port = find_free_port(); let data_dir = format!("{}/data{}", data_dir, i); + let validator_id = i + usize::try_from(DEFAULT_VALIDATOR_ID).expect("Conversion failed"); let mut cmd = format!( "RUST_LOG=papyrus_consensus=debug,papyrus=info target/release/run_consensus \ --network.#is_none false --base_layer.node_url {} --storage.db_config.path_prefix {} \ - --consensus.#is_none false --consensus.validator_id 0x{} --consensus.num_validators {} \ + --consensus.#is_none false --consensus.validator_id 0x{:x} --consensus.num_validators {} \ --network.tcp_port {} --rpc.server_address 127.0.0.1:{} \ --monitoring_gateway.server_address 127.0.0.1:{} --collect_metrics true ", papyrus_args.base_layer_node_url, data_dir, - i, + validator_id, papyrus_args.num_validators, tcp_port, find_free_port(), @@ -310,19 +312,20 @@ async fn build_node(data_dir: &str, logs_dir: &str, i: usize, papyrus_args: &Pap if is_bootstrap { cmd.push_str(&format!( - "--network.secret_key {} 2>&1 | sed -r 's/\\x1B\\[[0-9;]*[mK]//g' > {}/validator{}.txt", - SECRET_KEY, logs_dir, i + "--network.secret_key {} 2>&1 | sed -r 's/\\x1B\\[[0-9;]*[mK]//g' > \ + {}/validator0x{:x}.txt", + SECRET_KEY, logs_dir, validator_id )); } else { cmd.push_str(&format!( "--network.bootstrap_peer_multiaddr.#is_none false --network.bootstrap_peer_multiaddr \ /ip4/127.0.0.1/tcp/{}/p2p/{} 2>&1 | sed -r 's/\\x1B\\[[0-9;]*[mK]//g' > \ - {}/validator{}.txt", - *BOOTNODE_TCP_PORT, BOOT_NODE_PEER_ID, logs_dir, i + {}/validator0x{:x}.txt", + *BOOTNODE_TCP_PORT, BOOT_NODE_PEER_ID, logs_dir, validator_id )); } - Node::new(i, monitoring_gateway_server_port, cmd) + Node::new(validator_id, monitoring_gateway_server_port, cmd) } async fn build_all_nodes(data_dir: &str, logs_dir: &str, papyrus_args: &PapyrusArgs) -> Vec { diff --git a/crates/sequencing/papyrus_consensus/src/config.rs b/crates/sequencing/papyrus_consensus/src/config.rs index e6016cea60a..fe5f7b182bb 100644 --- a/crates/sequencing/papyrus_consensus/src/config.rs +++ b/crates/sequencing/papyrus_consensus/src/config.rs @@ -12,18 +12,19 @@ use papyrus_config::converters::{ use papyrus_config::dumping::{append_sub_config_name, ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use papyrus_network::NetworkConfig; +use papyrus_protobuf::consensus::DEFAULT_VALIDATOR_ID; use serde::{Deserialize, Serialize}; use starknet_api::block::BlockNumber; use starknet_api::core::ChainId; +use validator::Validate; -use super::types::ValidatorId; -use crate::types::DEFAULT_VALIDATOR_ID; +use crate::types::ValidatorId; const CONSENSUS_TCP_PORT: u16 = 10100; const CONSENSUS_QUIC_PORT: u16 = 10101; /// Configuration for consensus. -#[derive(Debug, Deserialize, Serialize, Clone, PartialEq)] +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Validate)] pub struct ConsensusConfig { /// The chain id of the Starknet chain. pub chain_id: ChainId, @@ -41,8 +42,8 @@ pub struct ConsensusConfig { pub consensus_delay: Duration, /// Timeouts configuration for consensus. pub timeouts: TimeoutsConfig, - // TODO(Dan/Matan): validate configs (#[validate]). /// The network configuration for the consensus. + #[validate] pub network_config: NetworkConfig, } diff --git a/crates/sequencing/papyrus_consensus/src/manager.rs b/crates/sequencing/papyrus_consensus/src/manager.rs index 5a4a183cb67..8609ca247e7 100644 --- a/crates/sequencing/papyrus_consensus/src/manager.rs +++ b/crates/sequencing/papyrus_consensus/src/manager.rs @@ -271,7 +271,12 @@ impl MultiHeightManager { // Get the first message to verify the init was sent. // TODO(guyn): add a timeout and panic, since StreamHandler should only send once // the first message (message_id=0) has arrived. - let Some(first_part) = content_receiver.next().await else { + let Some(first_part) = content_receiver.try_next().map_err(|_| { + ConsensusError::InternalNetworkError( + "Stream handler must fill the first message before sending the stream".to_string(), + ) + })? + else { return Err(ConsensusError::InternalNetworkError( "Proposal receiver closed".to_string(), )); diff --git a/crates/sequencing/papyrus_consensus/src/manager_test.rs b/crates/sequencing/papyrus_consensus/src/manager_test.rs index e6ae664568b..1f6d59f5fda 100644 --- a/crates/sequencing/papyrus_consensus/src/manager_test.rs +++ b/crates/sequencing/papyrus_consensus/src/manager_test.rs @@ -2,11 +2,9 @@ use std::sync::Arc; use std::time::Duration; use std::vec; -use async_trait::async_trait; use futures::channel::{mpsc, oneshot}; use futures::SinkExt; use lazy_static::lazy_static; -use mockall::mock; use mockall::predicate::eq; use papyrus_network::network_manager::test_utils::{ mock_register_broadcast_topic, @@ -14,13 +12,7 @@ use papyrus_network::network_manager::test_utils::{ TestSubscriberChannels, }; use papyrus_network_types::network_types::BroadcastedMessageMetadata; -use papyrus_protobuf::consensus::{ - ConsensusMessage, - ProposalFin, - ProposalInit, - ProposalPart, - Vote, -}; +use papyrus_protobuf::consensus::{ConsensusMessage, ProposalFin, DEFAULT_VALIDATOR_ID}; use papyrus_test_utils::{get_rng, GetTestInstance}; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_types_core::felt::Felt; @@ -28,15 +20,8 @@ use tokio::sync::Notify; use super::{run_consensus, MultiHeightManager, RunHeightRes}; use crate::config::TimeoutsConfig; -use crate::test_utils::{precommit, prevote, proposal_init}; -use crate::types::{ - ConsensusContext, - ConsensusError, - ProposalContentId, - Round, - ValidatorId, - DEFAULT_VALIDATOR_ID, -}; +use crate::test_utils::{precommit, prevote, proposal_init, MockTestContext, TestProposalPart}; +use crate::types::{ConsensusError, ValidatorId}; lazy_static! { static ref PROPOSER_ID: ValidatorId = DEFAULT_VALIDATOR_ID.into(); @@ -52,50 +37,6 @@ lazy_static! { const CHANNEL_SIZE: usize = 10; -mock! { - pub TestContext {} - - #[async_trait] - impl ConsensusContext for TestContext { - type ProposalPart = ProposalPart; - - async fn build_proposal( - &mut self, - init: ProposalInit, - timeout: Duration - ) -> oneshot::Receiver; - - async fn validate_proposal( - &mut self, - height: BlockNumber, - round: Round, - proposer: ValidatorId, - timeout: Duration, - content: mpsc::Receiver - ) -> oneshot::Receiver<(ProposalContentId, ProposalFin)>; - - async fn repropose( - &mut self, - id: ProposalContentId, - init: ProposalInit, - ); - - async fn validators(&self, height: BlockNumber) -> Vec; - - fn proposer(&self, height: BlockNumber, round: Round) -> ValidatorId; - - async fn broadcast(&mut self, message: ConsensusMessage) -> Result<(), ConsensusError>; - - async fn decision_reached( - &mut self, - block: ProposalContentId, - precommits: Vec, - ) -> Result<(), ConsensusError>; - - async fn set_height_and_round(&mut self, height: BlockNumber, round: Round); - } -} - async fn send(sender: &mut MockBroadcastedMessagesSender, msg: ConsensusMessage) { let broadcasted_message_metadata = BroadcastedMessageMetadata::get_test_instance(&mut get_rng()); @@ -103,8 +44,8 @@ async fn send(sender: &mut MockBroadcastedMessagesSender, msg: } async fn send_proposal( - proposal_receiver_sender: &mut mpsc::Sender>, - content: Vec, + proposal_receiver_sender: &mut mpsc::Sender>, + content: Vec, ) { let (mut proposal_sender, proposal_receiver) = mpsc::channel(CHANNEL_SIZE); proposal_receiver_sender.send(proposal_receiver).await.unwrap(); @@ -116,7 +57,7 @@ async fn send_proposal( fn expect_validate_proposal(context: &mut MockTestContext, block_hash: Felt) { context .expect_validate_proposal() - .return_once(move |_, _, _, _, _| { + .return_once(move |_, _, _| { let (block_sender, block_receiver) = oneshot::channel(); block_sender .send(( @@ -149,10 +90,7 @@ async fn manager_multiple_heights_unordered() { // Send messages for height 2 followed by those for height 1. send_proposal( &mut proposal_receiver_sender, - vec![ - ProposalPart::Init(proposal_init(2, 0, *PROPOSER_ID)), - ProposalPart::Fin(ProposalFin { proposal_content_id: BlockHash(Felt::TWO) }), - ], + vec![TestProposalPart::Init(proposal_init(2, 0, *PROPOSER_ID))], ) .await; send(&mut sender, prevote(Some(Felt::TWO), 2, 0, *PROPOSER_ID)).await; @@ -160,10 +98,7 @@ async fn manager_multiple_heights_unordered() { send_proposal( &mut proposal_receiver_sender, - vec![ - ProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID)), - ProposalPart::Fin(ProposalFin { proposal_content_id: BlockHash(Felt::ONE) }), - ], + vec![TestProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID))], ) .await; send(&mut sender, prevote(Some(Felt::ONE), 1, 0, *PROPOSER_ID)).await; @@ -232,7 +167,7 @@ async fn run_consensus_sync() { // Send messages for height 2. send_proposal( &mut proposal_receiver_sender, - vec![ProposalPart::Init(proposal_init(2, 0, *PROPOSER_ID))], + vec![TestProposalPart::Init(proposal_init(2, 0, *PROPOSER_ID))], ) .await; let TestSubscriberChannels { mock_network, subscriber_channels } = @@ -326,7 +261,7 @@ async fn run_consensus_sync_cancellation_safety() { // Send a proposal for height 1. send_proposal( &mut proposal_receiver_sender, - vec![ProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID))], + vec![TestProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID))], ) .await; proposal_handled.notified().await; @@ -358,7 +293,7 @@ async fn test_timeouts() { send_proposal( &mut proposal_receiver_sender, - vec![ProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID))], + vec![TestProposalPart::Init(proposal_init(1, 0, *PROPOSER_ID))], ) .await; send(&mut sender, prevote(None, 1, 0, *VALIDATOR_ID_2)).await; @@ -368,7 +303,7 @@ async fn test_timeouts() { let mut context = MockTestContext::new(); context.expect_set_height_and_round().returning(move |_, _| ()); - context.expect_validate_proposal().returning(move |_, _, _, _, _| { + context.expect_validate_proposal().returning(move |_, _, _| { let (block_sender, block_receiver) = oneshot::channel(); block_sender .send((BlockHash(Felt::ONE), ProposalFin { proposal_content_id: BlockHash(Felt::ONE) })) @@ -414,7 +349,7 @@ async fn test_timeouts() { // reach a decision. send_proposal( &mut proposal_receiver_sender, - vec![ProposalPart::Init(proposal_init(1, 1, *PROPOSER_ID))], + vec![TestProposalPart::Init(proposal_init(1, 1, *PROPOSER_ID))], ) .await; send(&mut sender, prevote(Some(Felt::ONE), 1, 1, *PROPOSER_ID)).await; diff --git a/crates/sequencing/papyrus_consensus/src/single_height_consensus.rs b/crates/sequencing/papyrus_consensus/src/single_height_consensus.rs index 718e6503162..4800ea83db4 100644 --- a/crates/sequencing/papyrus_consensus/src/single_height_consensus.rs +++ b/crates/sequencing/papyrus_consensus/src/single_height_consensus.rs @@ -247,13 +247,7 @@ impl SingleHeightConsensus { // twice in parallel. This could be caused by a network repeat or a malicious spam attack. proposal_entry.insert(None); let block_receiver = context - .validate_proposal( - self.height, - init.round, - init.proposer, - self.timeouts.proposal_timeout, - p2p_messages_receiver, - ) + .validate_proposal(init, self.timeouts.proposal_timeout, p2p_messages_receiver) .await; context.set_height_and_round(self.height, self.state_machine.round()).await; Ok(ShcReturn::Tasks(vec![ShcTask::ValidateProposal(init, block_receiver)])) @@ -514,7 +508,10 @@ impl SingleHeightConsensus { round: Round, valid_round: Option, ) { - let proposal_id = proposal_id.expect("StateMachine should not propose a None proposal_id"); + let Some(proposal_id) = proposal_id else { + warn!("Build proposal failed"); + return; + }; let Some(valid_round) = valid_round else { // newly built so just streamed return; diff --git a/crates/sequencing/papyrus_consensus/src/single_height_consensus_test.rs b/crates/sequencing/papyrus_consensus/src/single_height_consensus_test.rs index ee5f2cd0627..7648c1d5933 100644 --- a/crates/sequencing/papyrus_consensus/src/single_height_consensus_test.rs +++ b/crates/sequencing/papyrus_consensus/src/single_height_consensus_test.rs @@ -1,18 +1,22 @@ use futures::channel::{mpsc, oneshot}; use futures::SinkExt; use lazy_static::lazy_static; -use papyrus_protobuf::consensus::{ConsensusMessage, ProposalFin, ProposalInit}; +use papyrus_protobuf::consensus::{ + ConsensusMessage, + ProposalFin, + ProposalInit, + DEFAULT_VALIDATOR_ID, +}; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_types_core::felt::Felt; use test_case::test_case; -use tokio; use super::SingleHeightConsensus; use crate::config::TimeoutsConfig; use crate::single_height_consensus::{ShcEvent, ShcReturn, ShcTask}; use crate::state_machine::StateMachineEvent; -use crate::test_utils::{precommit, prevote, MockProposalPart, MockTestContext, TestBlock}; -use crate::types::{ConsensusError, ValidatorId, DEFAULT_VALIDATOR_ID}; +use crate::test_utils::{precommit, prevote, MockTestContext, TestBlock, TestProposalPart}; +use crate::types::{ConsensusError, ValidatorId}; lazy_static! { static ref PROPOSER_ID: ValidatorId = DEFAULT_VALIDATOR_ID.into(); @@ -22,12 +26,8 @@ lazy_static! { static ref VALIDATORS: Vec = vec![*PROPOSER_ID, *VALIDATOR_ID_1, *VALIDATOR_ID_2, *VALIDATOR_ID_3]; static ref BLOCK: TestBlock = TestBlock { content: vec![1, 2, 3], id: BlockHash(Felt::ONE) }; - static ref PROPOSAL_INIT: ProposalInit = ProposalInit { - height: BlockNumber(0), - round: 0, - proposer: *PROPOSER_ID, - valid_round: None - }; + static ref PROPOSAL_INIT: ProposalInit = + ProposalInit { proposer: *PROPOSER_ID, ..Default::default() }; static ref TIMEOUTS: TimeoutsConfig = TimeoutsConfig::default(); static ref VALIDATE_PROPOSAL_EVENT: ShcEvent = ShcEvent::ValidateProposal( StateMachineEvent::Proposal(Some(BLOCK.id), PROPOSAL_INIT.round, PROPOSAL_INIT.valid_round,), @@ -69,9 +69,9 @@ async fn handle_proposal( ) -> ShcReturn { // Send the proposal from the peer. let (mut content_sender, content_receiver) = mpsc::channel(CHANNEL_SIZE); - content_sender.send(MockProposalPart(1)).await.unwrap(); + content_sender.send(TestProposalPart::Init(ProposalInit::default())).await.unwrap(); - shc.handle_proposal(context, PROPOSAL_INIT.clone(), content_receiver).await.unwrap() + shc.handle_proposal(context, *PROPOSAL_INIT, content_receiver).await.unwrap() } #[tokio::test] @@ -173,7 +173,7 @@ async fn validator(repeat_proposal: bool) { ); context.expect_proposer().returning(move |_, _| *PROPOSER_ID); - context.expect_validate_proposal().times(1).returning(move |_, _, _, _, _| { + context.expect_validate_proposal().times(1).returning(move |_, _, _| { let (block_sender, block_receiver) = oneshot::channel(); block_sender.send((BLOCK.id, PROPOSAL_FIN.clone())).unwrap(); block_receiver @@ -253,7 +253,7 @@ async fn vote_twice(same_vote: bool) { ); context.expect_proposer().times(1).returning(move |_, _| *PROPOSER_ID); - context.expect_validate_proposal().times(1).returning(move |_, _, _, _, _| { + context.expect_validate_proposal().times(1).returning(move |_, _, _| { let (block_sender, block_receiver) = oneshot::channel(); block_sender.send((BLOCK.id, PROPOSAL_FIN.clone())).unwrap(); block_receiver diff --git a/crates/sequencing/papyrus_consensus/src/state_machine_test.rs b/crates/sequencing/papyrus_consensus/src/state_machine_test.rs index 817807aba6d..ff91f999dbe 100644 --- a/crates/sequencing/papyrus_consensus/src/state_machine_test.rs +++ b/crates/sequencing/papyrus_consensus/src/state_machine_test.rs @@ -1,13 +1,14 @@ use std::collections::VecDeque; use lazy_static::lazy_static; +use papyrus_protobuf::consensus::DEFAULT_VALIDATOR_ID; use starknet_api::block::BlockHash; use starknet_types_core::felt::Felt; use test_case::test_case; use super::Round; use crate::state_machine::{StateMachine, StateMachineEvent}; -use crate::types::{ProposalContentId, ValidatorId, DEFAULT_VALIDATOR_ID}; +use crate::types::{ProposalContentId, ValidatorId}; lazy_static! { static ref PROPOSER_ID: ValidatorId = DEFAULT_VALIDATOR_ID.into(); diff --git a/crates/sequencing/papyrus_consensus/src/stream_handler.rs b/crates/sequencing/papyrus_consensus/src/stream_handler.rs index 7101579dce9..b794ce87dd7 100644 --- a/crates/sequencing/papyrus_consensus/src/stream_handler.rs +++ b/crates/sequencing/papyrus_consensus/src/stream_handler.rs @@ -28,7 +28,11 @@ type StreamKey = (PeerId, StreamId); const CHANNEL_BUFFER_LENGTH: usize = 100; -#[derive(Debug, Clone)] +// Use this struct for each inbound stream. +// Drop the struct when: +// (1) receiver on the other end is dropped, +// (2) fin message is received and all messages are sent. +#[derive(Debug)] struct StreamData< T: Clone + Into> + TryFrom, Error = ProtobufConversionError> + 'static, > { @@ -36,18 +40,22 @@ struct StreamData< // Last message ID. If None, it means we have not yet gotten to it. fin_message_id: Option, max_message_id_received: MessageId, + // Keep the receiver until it is time to send it to the application. + receiver: Option>, sender: mpsc::Sender, // A buffer for messages that were received out of order. message_buffer: HashMap>, } impl> + TryFrom, Error = ProtobufConversionError>> StreamData { - fn new(sender: mpsc::Sender) -> Self { + fn new() -> Self { + let (sender, receiver) = mpsc::channel(CHANNEL_BUFFER_LENGTH); StreamData { next_message_id: 0, fin_message_id: None, max_message_id_received: 0, sender, + receiver: Some(receiver), message_buffer: HashMap::new(), } } @@ -178,13 +186,45 @@ impl> + TryFrom, Error = ProtobufConversi } } - fn inbound_send(data: &mut StreamData, message: StreamMessage) { + // Returns true if the receiver for this stream is dropped. + fn inbound_send(&mut self, data: &mut StreamData, message: StreamMessage) -> bool { // TODO(guyn): reconsider the "expect" here. let sender = &mut data.sender; if let StreamMessageBody::Content(content) = message.message { - sender.try_send(content).expect("Send should succeed"); + if message.message_id == 0 { + // TODO(guyn): consider the expect in both cases. + // If this is the first message, send the receiver to the application. + let receiver = data.receiver.take().expect("Receiver should exist"); + // Send the receiver to the application. + self.inbound_channel_sender.try_send(receiver).expect("Send should succeed"); + } + match sender.try_send(content) { + Ok(_) => {} + Err(e) => { + if e.is_disconnected() { + warn!( + "Sender is disconnected, dropping the message. StreamId: {}, \ + MessageId: {}", + message.stream_id, message.message_id + ); + return true; + } else if e.is_full() { + // TODO(guyn): replace panic with buffering of the message. + panic!( + "Sender is full, dropping the message. StreamId: {}, MessageId: {}", + message.stream_id, message.message_id + ); + } else { + // TODO(guyn): replace panic with more graceful error handling + panic!("Unexpected error: {:?}", e); + } + } + }; data.next_message_id += 1; + return false; } + // A Fin message is not sent. This is a no-op, can safely return true. + true } // Send the message to the network. @@ -225,24 +265,37 @@ impl> + TryFrom, Error = ProtobufConversi return; } }; - let peer_id = metadata.originator_id; + + let peer_id = metadata.originator_id.clone(); let stream_id = message.stream_id; let key = (peer_id, stream_id); - let message_id = message.message_id; let data = match self.inbound_stream_data.entry(key.clone()) { - Occupied(entry) => entry.into_mut(), - Vacant(e) => { + // If data exists, remove it (it will be returned to hash map at end of function). + Occupied(entry) => entry.remove_entry().1, + Vacant(_) => { // If we received a message for a stream that we have not seen before, // we need to create a new receiver for it. - let (sender, receiver) = mpsc::channel(CHANNEL_BUFFER_LENGTH); - // TODO(guyn): reconsider the "expect" here. - self.inbound_channel_sender.try_send(receiver).expect("Send should succeed"); - - let data = StreamData::new(sender); - e.insert(data) + StreamData::new() } }; + if let Some(data) = self.handle_message_inner(message, metadata, data) { + self.inbound_stream_data.insert(key, data); + } + } + + /// Returns the StreamData struct if it should be put back into the hash map. None if the data + /// should be dropped. + fn handle_message_inner( + &mut self, + message: StreamMessage, + metadata: BroadcastedMessageMetadata, + mut data: StreamData, + ) -> Option> { + let peer_id = metadata.originator_id; + let stream_id = message.stream_id; + let key = (peer_id, stream_id); + let message_id = message.message_id; if data.max_message_id_received < message_id { data.max_message_id_received = message_id; @@ -258,9 +311,11 @@ impl> + TryFrom, Error = ProtobufConversi warn!( "Received fin message with id that is smaller than a previous message! \ key: {:?}, fin_message_id: {}, max_message_id_received: {}", - key, message_id, data.max_message_id_received + key.clone(), + message_id, + data.max_message_id_received ); - return; + return None; } } } @@ -270,37 +325,44 @@ impl> + TryFrom, Error = ProtobufConversi warn!( "Received message with id that is bigger than the id of the fin message! key: \ {:?}, message_id: {}, fin_message_id: {}", - key, + key.clone(), message_id, data.fin_message_id.unwrap_or(u64::MAX) ); - return; + return None; } // This means we can just send the message without buffering it. match message_id.cmp(&data.next_message_id) { Ordering::Equal => { - Self::inbound_send(data, message); - Self::process_buffer(data); + let mut receiver_dropped = self.inbound_send(&mut data, message); + if !receiver_dropped { + receiver_dropped = self.process_buffer(&mut data); + } - if data.message_buffer.is_empty() && data.fin_message_id.is_some() { + if data.message_buffer.is_empty() && data.fin_message_id.is_some() + || receiver_dropped + { data.sender.close_channel(); - self.inbound_stream_data.remove(&key); + return None; } } Ordering::Greater => { - Self::store(data, key, message); + Self::store(&mut data, key.clone(), message); } Ordering::Less => { // TODO(guyn): replace warnings with more graceful error handling warn!( "Received message with id that is smaller than the next message expected! \ key: {:?}, message_id: {}, next_message_id: {}", - key, message_id, data.next_message_id + key.clone(), + message_id, + data.next_message_id ); - return; + return None; } } + Some(data) } // Store an inbound message in the buffer. @@ -323,9 +385,13 @@ impl> + TryFrom, Error = ProtobufConversi // Tries to drain as many messages as possible from the buffer (in order), // DOES NOT guarantee that the buffer will be empty after calling this function. - fn process_buffer(data: &mut StreamData) { + // Returns true if the receiver for this stream is dropped. + fn process_buffer(&mut self, data: &mut StreamData) -> bool { while let Some(message) = data.message_buffer.remove(&data.next_message_id) { - Self::inbound_send(data, message); + if self.inbound_send(data, message) { + return true; + } } + false } } diff --git a/crates/sequencing/papyrus_consensus/src/stream_handler_test.rs b/crates/sequencing/papyrus_consensus/src/stream_handler_test.rs index 6e6e7204057..2f00140462c 100644 --- a/crates/sequencing/papyrus_consensus/src/stream_handler_test.rs +++ b/crates/sequencing/papyrus_consensus/src/stream_handler_test.rs @@ -10,7 +10,7 @@ use papyrus_network::network_manager::test_utils::{ }; use papyrus_network::network_manager::BroadcastTopicChannels; use papyrus_network_types::network_types::BroadcastedMessageMetadata; -use papyrus_protobuf::consensus::{ConsensusMessage, Proposal, StreamMessage, StreamMessageBody}; +use papyrus_protobuf::consensus::{StreamMessage, StreamMessageBody}; use papyrus_test_utils::{get_rng, GetTestInstance}; use super::{MessageId, StreamHandler, StreamId}; @@ -20,16 +20,18 @@ const CHANNEL_SIZE: usize = 100; #[cfg(test)] mod tests { + use papyrus_protobuf::consensus::{ProposalInit, ProposalPart}; + use super::*; fn make_test_message( stream_id: StreamId, message_id: MessageId, fin: bool, - ) -> StreamMessage { + ) -> StreamMessage { let content = match fin { true => StreamMessageBody::Fin, - false => StreamMessageBody::Content(ConsensusMessage::Proposal(Proposal::default())), + false => StreamMessageBody::Content(ProposalPart::Init(ProposalInit::default())), }; StreamMessage { message: content, stream_id, message_id } } @@ -47,24 +49,21 @@ mod tests { } async fn send( - sender: &mut MockBroadcastedMessagesSender>, + sender: &mut MockBroadcastedMessagesSender>, metadata: &BroadcastedMessageMetadata, - msg: StreamMessage, + msg: StreamMessage, ) { sender.send((msg, metadata.clone())).await.unwrap(); } #[allow(clippy::type_complexity)] fn setup_test() -> ( - StreamHandler, - MockBroadcastedMessagesSender>, - mpsc::Receiver>, + StreamHandler, + MockBroadcastedMessagesSender>, + mpsc::Receiver>, BroadcastedMessageMetadata, - mpsc::Sender<(StreamId, mpsc::Receiver)>, - futures::stream::Map< - mpsc::Receiver>, - fn(Vec) -> StreamMessage, - >, + mpsc::Sender<(StreamId, mpsc::Receiver)>, + futures::stream::Map>, fn(Vec) -> StreamMessage>, ) { // The outbound_sender is the network connector for broadcasting messages. // The network_broadcast_receiver is used to catch those messages in the test. @@ -81,7 +80,7 @@ mod tests { // The receiver goes into StreamHandler, sender is used by the test (as mock Consensus). // Note that each new channel comes in a tuple with (stream_id, receiver). let (outbound_channel_sender, outbound_channel_receiver) = - mpsc::channel::<(StreamId, mpsc::Receiver)>(CHANNEL_SIZE); + mpsc::channel::<(StreamId, mpsc::Receiver)>(CHANNEL_SIZE); // The network_sender_to_inbound is the sender of the mock network, that is used by the // test to send messages into the StreamHandler (from the mock network). @@ -99,7 +98,7 @@ mod tests { // each stream. The inbound_channel_receiver is given to the "mock consensus" that // gets new channels and inbounds to them. let (inbound_channel_sender, inbound_channel_receiver) = - mpsc::channel::>(CHANNEL_SIZE); + mpsc::channel::>(CHANNEL_SIZE); // TODO(guyn): We should also give the broadcast_topic_client to the StreamHandler // This will allow reporting to the network things like bad peers. @@ -173,21 +172,29 @@ mod tests { }); let mut stream_handler = join_handle.await.expect("Task should succeed"); - // Get the receiver for the stream. - let mut receiver = inbound_channel_receiver.next().await.unwrap(); - // Check that the channel is empty (no messages were sent yet). - assert!(receiver.try_next().is_err()); + // No receiver should be created yet. + assert!(inbound_channel_receiver.try_next().is_err()); assert_eq!(stream_handler.inbound_stream_data.len(), 1); assert_eq!( stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id)].message_buffer.len(), 5 ); + // Still waiting for message 0. + assert_eq!( + stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id)].next_message_id, + 0 + ); + // Has a receiver, waiting to be sent when message 0 is received. + assert!( + stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id)].receiver.is_some() + ); + let range: Vec = (1..6).collect(); let keys: Vec = stream_handler.inbound_stream_data[&(peer_id, stream_id)] - .clone() .message_buffer - .into_keys() + .keys() + .copied() .collect(); assert!(do_vecs_match_unordered(&keys, &range)); @@ -203,6 +210,9 @@ mod tests { let stream_handler = join_handle.await.expect("Task should succeed"); assert!(stream_handler.inbound_stream_data.is_empty()); + // Get the receiver for the stream. + let mut receiver = inbound_channel_receiver.next().await.unwrap(); + for _ in 0..5 { // message number 5 is Fin, so it will not be sent! let _ = receiver.next().await.unwrap(); @@ -255,20 +265,14 @@ mod tests { let mut stream_handler = join_handle.await.expect("Task should succeed"); let values = [(peer_id.clone(), 1), (peer_id.clone(), 10), (peer_id.clone(), 127)]; - assert!( - stream_handler - .inbound_stream_data - .clone() - .into_keys() - .all(|item| values.contains(&item)) - ); + assert!(stream_handler.inbound_stream_data.keys().all(|item| values.contains(item))); // We have all message from 1 to 9 buffered. assert!(do_vecs_match_unordered( &stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id1)] .message_buffer - .clone() - .into_keys() + .keys() + .copied() .collect::>(), &(1..10).collect::>() )); @@ -277,8 +281,8 @@ mod tests { assert!(do_vecs_match_unordered( &stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id2)] .message_buffer - .clone() - .into_keys() + .keys() + .copied() .collect::>(), &(1..6).collect::>() )); @@ -287,29 +291,14 @@ mod tests { assert!(do_vecs_match_unordered( &stream_handler.inbound_stream_data[&(peer_id.clone(), stream_id3)] .message_buffer - .clone() - .into_keys() + .keys() + .copied() .collect::>(), &(1..10).collect::>() )); - // Get the receiver for the first stream. - let mut receiver1 = inbound_channel_receiver.next().await.unwrap(); - - // Check that the channel is empty (no messages were sent yet). - assert!(receiver1.try_next().is_err()); - - // Get the receiver for the second stream. - let mut receiver2 = inbound_channel_receiver.next().await.unwrap(); - - // Check that the channel is empty (no messages were sent yet). - assert!(receiver2.try_next().is_err()); - - // Get the receiver for the third stream. - let mut receiver3 = inbound_channel_receiver.next().await.unwrap(); - - // Check that the channel is empty (no messages were sent yet). - assert!(receiver3.try_next().is_err()); + // None of the streams should have emitted a receiver yet. + assert!(inbound_channel_receiver.try_next().is_err()); // Send the last message on stream_id1: send(&mut network_sender, &inbound_metadata, make_test_message(stream_id1, 0, false)).await; @@ -320,6 +309,9 @@ mod tests { stream_handler }); + // Get the receiver for the first stream. + let mut receiver1 = inbound_channel_receiver.next().await.unwrap(); + // Should be able to read all the messages for stream_id1. for _ in 0..9 { // message number 9 is Fin, so it will not be sent! @@ -329,13 +321,7 @@ mod tests { // stream_id1 should be gone let values = [(peer_id.clone(), 1), (peer_id.clone(), 10)]; - assert!( - stream_handler - .inbound_stream_data - .clone() - .into_keys() - .all(|item| values.contains(&item)) - ); + assert!(stream_handler.inbound_stream_data.keys().all(|item| values.contains(item))); // Send the last message on stream_id2: send(&mut network_sender, &inbound_metadata, make_test_message(stream_id2, 0, false)).await; @@ -346,6 +332,9 @@ mod tests { stream_handler }); + // Get the receiver for the second stream. + let mut receiver2 = inbound_channel_receiver.next().await.unwrap(); + // Should be able to read all the messages for stream_id2. for _ in 0..5 { // message number 5 is Fin, so it will not be sent! @@ -356,13 +345,7 @@ mod tests { // Stream_id2 should also be gone. let values = [(peer_id.clone(), 1)]; - assert!( - stream_handler - .inbound_stream_data - .clone() - .into_keys() - .all(|item| values.contains(&item)) - ); + assert!(stream_handler.inbound_stream_data.keys().all(|item| values.contains(item))); // Send the last message on stream_id3: send(&mut network_sender, &inbound_metadata, make_test_message(stream_id3, 0, false)).await; @@ -373,6 +356,9 @@ mod tests { stream_handler }); + // Get the receiver for the third stream. + let mut receiver3 = inbound_channel_receiver.next().await.unwrap(); + let stream_handler = join_handle.await.expect("Task should succeed"); for _ in 0..10 { // All messages are received, including number 9 which is not Fin @@ -381,13 +367,7 @@ mod tests { // Stream_id3 should still be there, because we didn't send a fin. let values = [(peer_id.clone(), 1)]; - assert!( - stream_handler - .inbound_stream_data - .clone() - .into_keys() - .all(|item| values.contains(&item)) - ); + assert!(stream_handler.inbound_stream_data.keys().all(|item| values.contains(item))); // But the buffer should be empty, as we've successfully drained it all. assert!( @@ -395,6 +375,58 @@ mod tests { ); } + #[tokio::test] + async fn inbound_close_channel() { + let (mut stream_handler, mut network_sender, mut inbound_channel_receiver, metadata, _, _) = + setup_test(); + + let stream_id = 127; + // Send two messages, no Fin. + for i in 0..2 { + let message = make_test_message(stream_id, i, false); + send(&mut network_sender, &metadata, message).await; + } + + // Allow the StreamHandler to process the messages. + let join_handle = tokio::spawn(async move { + let _ = tokio::time::timeout(TIMEOUT, stream_handler.run()).await; + stream_handler + }); + let mut stream_handler = join_handle.await.expect("Task should succeed"); + + let mut receiver = inbound_channel_receiver.next().await.unwrap(); + for _ in 0..2 { + let _ = receiver.next().await.unwrap(); + } + + // Check that the stream handler contains the StreamData. + assert_eq!(stream_handler.inbound_stream_data.len(), 1); + assert_eq!( + stream_handler.inbound_stream_data.keys().next().unwrap(), + &(metadata.originator_id.clone(), stream_id) + ); + + // Close the channel. + drop(receiver); + + // Send more messages. + // TODO(guyn): if we set this to 2..4 it fails... the last message opens a new StreamData! + for i in 2..3 { + let message = make_test_message(stream_id, i, false); + send(&mut network_sender, &metadata, message).await; + } + + // Allow the StreamHandler to process the messages. + let join_handle = tokio::spawn(async move { + let _ = tokio::time::timeout(TIMEOUT, stream_handler.run()).await; + stream_handler + }); + let stream_handler = join_handle.await.expect("Task should succeed"); + + // Check that the stream handler no longer contains the StreamData. + assert_eq!(stream_handler.inbound_stream_data.len(), 0); + } + // This test does two things: // 1. Opens two outbound channels and checks that messages get correctly sent on both. // 2. Closes the first channel and checks that Fin is sent and that the relevant structures @@ -418,7 +450,7 @@ mod tests { broadcast_channel_sender.send((stream_id1, receiver1)).await.unwrap(); // Send a message on the stream. - let message1 = ConsensusMessage::Proposal(Proposal::default()); + let message1 = ProposalPart::Init(ProposalInit::default()); sender1.send(message1.clone()).await.unwrap(); // Run the loop for a short duration to process the message. @@ -445,7 +477,7 @@ mod tests { assert_eq!(stream_handler.outbound_stream_number[&stream_id1], 1); // Send another message on the same stream. - let message2 = ConsensusMessage::Proposal(Proposal::default()); + let message2 = ProposalPart::Init(ProposalInit::default()); sender1.send(message2.clone()).await.unwrap(); // Run the loop for a short duration to process the message. @@ -470,7 +502,7 @@ mod tests { broadcast_channel_sender.send((stream_id2, receiver2)).await.unwrap(); // Send a message on the stream. - let message3 = ConsensusMessage::Proposal(Proposal::default()); + let message3 = ProposalPart::Init(ProposalInit::default()); sender2.send(message3.clone()).await.unwrap(); // Run the loop for a short duration to process the message. diff --git a/crates/sequencing/papyrus_consensus/src/test_utils.rs b/crates/sequencing/papyrus_consensus/src/test_utils.rs index 8ee68c1427b..be41380d352 100644 --- a/crates/sequencing/papyrus_consensus/src/test_utils.rs +++ b/crates/sequencing/papyrus_consensus/src/test_utils.rs @@ -8,14 +8,7 @@ use papyrus_protobuf::converters::ProtobufConversionError; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_types_core::felt::Felt; -use crate::types::{ - ConsensusContext, - ConsensusError, - ProposalContentId, - Round, - ValidatorId, - DEFAULT_VALIDATOR_ID, -}; +use crate::types::{ConsensusContext, ConsensusError, ProposalContentId, Round, ValidatorId}; /// Define a consensus block which can be used to enable auto mocking Context. #[derive(Debug, PartialEq, Clone)] @@ -25,36 +18,36 @@ pub struct TestBlock { } #[derive(Debug, PartialEq, Clone)] -pub struct MockProposalPart(pub u64); +pub enum TestProposalPart { + Init(ProposalInit), +} -impl From for MockProposalPart { +impl From for TestProposalPart { fn from(init: ProposalInit) -> Self { - MockProposalPart(init.height.0) + TestProposalPart::Init(init) } } -impl TryFrom for ProposalInit { +impl TryFrom for ProposalInit { type Error = ProtobufConversionError; - fn try_from(part: MockProposalPart) -> Result { - Ok(ProposalInit { - height: BlockNumber(part.0), - proposer: DEFAULT_VALIDATOR_ID.into(), - ..Default::default() - }) + fn try_from(part: TestProposalPart) -> Result { + let TestProposalPart::Init(init) = part; + Ok(init) } } -impl From for Vec { - fn from(part: MockProposalPart) -> Vec { - vec![u8::try_from(part.0).expect("Invalid MockProposalPart conversion")] +impl From for Vec { + fn from(part: TestProposalPart) -> Vec { + let TestProposalPart::Init(init) = part; + init.into() } } -impl TryFrom> for MockProposalPart { +impl TryFrom> for TestProposalPart { type Error = ProtobufConversionError; fn try_from(value: Vec) -> Result { - Ok(MockProposalPart(value[0].into())) + Ok(TestProposalPart::Init(value.try_into()?)) } } @@ -64,7 +57,7 @@ mock! { #[async_trait] impl ConsensusContext for TestContext { - type ProposalPart = MockProposalPart; + type ProposalPart = TestProposalPart; async fn build_proposal( &mut self, @@ -74,11 +67,9 @@ mock! { async fn validate_proposal( &mut self, - height: BlockNumber, - round: Round, - proposer: ValidatorId, + init: ProposalInit, timeout: Duration, - content: mpsc::Receiver + content: mpsc::Receiver ) -> oneshot::Receiver<(ProposalContentId, ProposalFin)>; async fn repropose( @@ -129,5 +120,5 @@ pub fn precommit( }) } pub fn proposal_init(height: u64, round: u32, proposer: ValidatorId) -> ProposalInit { - ProposalInit { height: BlockNumber(height), round, proposer, valid_round: None } + ProposalInit { height: BlockNumber(height), round, proposer, ..Default::default() } } diff --git a/crates/sequencing/papyrus_consensus/src/types.rs b/crates/sequencing/papyrus_consensus/src/types.rs index 855ffa860b3..c64e2fb253e 100644 --- a/crates/sequencing/papyrus_consensus/src/types.rs +++ b/crates/sequencing/papyrus_consensus/src/types.rs @@ -25,10 +25,6 @@ pub type ValidatorId = ContractAddress; pub type Round = u32; pub type ProposalContentId = BlockHash; -/// A temporary constant to use as a validator ID. Zero is not a valid contract address. -// TODO(Matan): Remove this once we have a proper validator set. -pub const DEFAULT_VALIDATOR_ID: u64 = 100; - /// Interface for consensus to call out to the node. /// /// Function calls should be assumed to not be cancel safe. @@ -81,9 +77,7 @@ pub trait ConsensusContext { /// by ConsensusContext. async fn validate_proposal( &mut self, - height: BlockNumber, - round: Round, - proposer: ValidatorId, + init: ProposalInit, timeout: Duration, content: mpsc::Receiver, ) -> oneshot::Receiver<(ProposalContentId, ProposalFin)>; @@ -178,4 +172,6 @@ pub enum ConsensusError { InternalNetworkError(String), #[error("{0}")] SyncError(String), + #[error("{0}")] + Other(String), } diff --git a/crates/sequencing/papyrus_consensus_orchestrator/Cargo.toml b/crates/sequencing/papyrus_consensus_orchestrator/Cargo.toml index 6fb31cdd99a..013297e72e2 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/Cargo.toml +++ b/crates/sequencing/papyrus_consensus_orchestrator/Cargo.toml @@ -8,25 +8,31 @@ description = "Implements the consensus context and orchestrates the node's comp [dependencies] async-trait.workspace = true +blockifier.workspace = true chrono.workspace = true futures.workspace = true +indexmap.workspace = true papyrus_consensus.workspace = true papyrus_network.workspace = true papyrus_protobuf.workspace = true papyrus_storage.workspace = true +serde.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true starknet_batcher_types = { workspace = true, features = ["testing"] } tokio = { workspace = true, features = ["full"] } +tokio-util.workspace = true tracing.workspace = true [dev-dependencies] lazy_static.workspace = true mockall.workspace = true -papyrus_network = { workspace = true, features = ["testing"] } -papyrus_storage = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true -starknet_batcher_types = { workspace = true, features = ["testing"] } +papyrus_network = { path = "../../papyrus_network", features = ["testing"] } +papyrus_storage = { path = "../../papyrus_storage", features = ["testing"] } +papyrus_test_utils.path = "../../papyrus_test_utils" +serde_json.workspace = true +starknet_batcher_types = { path = "../../starknet_batcher_types", features = ["testing"] } +starknet_infra_utils.path = "../../starknet_infra_utils" test-case.workspace = true [lints] diff --git a/crates/sequencing/papyrus_consensus_orchestrator/resources/central_state_diff.json b/crates/sequencing/papyrus_consensus_orchestrator/resources/central_state_diff.json new file mode 100644 index 00000000000..2a96fcf4414 --- /dev/null +++ b/crates/sequencing/papyrus_consensus_orchestrator/resources/central_state_diff.json @@ -0,0 +1,39 @@ +{ + "address_to_class_hash": { + "0x1": "0x1" + }, + "nonces": { + "L1": { + "0x2": "0x2" + } + }, + "storage_updates": { + "L1": { + "0x3": { + "0x3": "0x3" + } + } + }, + "declared_classes": { + "0x4": "0x4" + }, + "block_info": { + "block_number": 5, + "block_timestamp": 6, + "l1_gas_price": { + "price_in_wei": "0x8", + "price_in_fri": "0x9" + }, + "l1_data_gas_price": { + "price_in_wei": "0xa", + "price_in_fri": "0xb" + }, + "l2_gas_price": { + "price_in_wei": "0xc", + "price_in_fri": "0xd" + }, + "sequencer_address": "0x7", + "starknet_version": "0.13.4", + "use_kzg_da": true + } +} diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects.rs new file mode 100644 index 00000000000..941c4d6376f --- /dev/null +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects.rs @@ -0,0 +1,91 @@ +use blockifier::state::cached_state::CommitmentStateDiff; +use indexmap::{indexmap, IndexMap}; +use serde::{Deserialize, Serialize}; +use starknet_api::block::{ + BlockInfo, + BlockNumber, + BlockTimestamp, + NonzeroGasPrice, + StarknetVersion, +}; +use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; +use starknet_api::data_availability::DataAvailabilityMode; +use starknet_api::state::StorageKey; +use starknet_types_core::felt::Felt; + +/// Central objects are required in order to continue processing the block by the centralized +/// Python pipline. These objects are written to the Aerospike database and are used by python +/// services. In the future, all services will be decentralized and this module will be removed. +#[cfg(test)] +#[path = "central_objects_test.rs"] +mod central_objects_test; + +#[derive(Debug, PartialEq, Deserialize, Serialize)] +pub struct CentralResourcePrice { + pub price_in_wei: NonzeroGasPrice, + pub price_in_fri: NonzeroGasPrice, +} + +#[derive(Debug, PartialEq, Deserialize, Serialize)] +pub struct CentralBlockInfo { + pub block_number: BlockNumber, + pub block_timestamp: BlockTimestamp, + pub sequencer_address: ContractAddress, + pub l1_gas_price: CentralResourcePrice, + pub l1_data_gas_price: CentralResourcePrice, + pub l2_gas_price: CentralResourcePrice, + pub use_kzg_da: bool, + pub starknet_version: Option, +} + +impl From<(BlockInfo, StarknetVersion)> for CentralBlockInfo { + fn from((block_info, starknet_version): (BlockInfo, StarknetVersion)) -> CentralBlockInfo { + CentralBlockInfo { + block_number: block_info.block_number, + block_timestamp: block_info.block_timestamp, + sequencer_address: block_info.sequencer_address, + l1_gas_price: CentralResourcePrice { + price_in_wei: block_info.gas_prices.eth_gas_prices.l1_gas_price, + price_in_fri: block_info.gas_prices.strk_gas_prices.l1_gas_price, + }, + l1_data_gas_price: CentralResourcePrice { + price_in_wei: block_info.gas_prices.eth_gas_prices.l1_data_gas_price, + price_in_fri: block_info.gas_prices.strk_gas_prices.l1_data_gas_price, + }, + l2_gas_price: CentralResourcePrice { + price_in_wei: block_info.gas_prices.eth_gas_prices.l2_gas_price, + price_in_fri: block_info.gas_prices.strk_gas_prices.l2_gas_price, + }, + use_kzg_da: block_info.use_kzg_da, + starknet_version: Some(starknet_version), + } + } +} + +#[derive(Debug, PartialEq, Deserialize, Serialize)] +pub struct CentralStateDiff { + pub address_to_class_hash: IndexMap, + pub nonces: IndexMap>, + pub storage_updates: + IndexMap>>, + pub declared_classes: IndexMap, + pub block_info: CentralBlockInfo, +} + +impl From<(CommitmentStateDiff, BlockInfo, StarknetVersion)> for CentralStateDiff { + fn from( + (state_diff, block_info, starknet_version): ( + CommitmentStateDiff, + BlockInfo, + StarknetVersion, + ), + ) -> CentralStateDiff { + CentralStateDiff { + address_to_class_hash: state_diff.address_to_class_hash, + nonces: indexmap!(DataAvailabilityMode::L1=> state_diff.address_to_nonce), + storage_updates: indexmap!(DataAvailabilityMode::L1=> state_diff.storage_updates), + declared_classes: state_diff.class_hash_to_compiled_class_hash, + block_info: (block_info, starknet_version).into(), + } + } +} diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects_test.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects_test.rs new file mode 100644 index 00000000000..098a310fd50 --- /dev/null +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/central_objects_test.rs @@ -0,0 +1,63 @@ +use indexmap::indexmap; +use starknet_api::block::{ + BlockNumber, + BlockTimestamp, + GasPrice, + NonzeroGasPrice, + StarknetVersion, +}; +use starknet_api::core::{ClassHash, CompiledClassHash, Nonce}; +use starknet_api::data_availability::DataAvailabilityMode; +use starknet_api::test_utils::read_json_file; +use starknet_api::{contract_address, felt, storage_key}; + +use super::{CentralBlockInfo, CentralResourcePrice, CentralStateDiff}; + +pub const CENTRAL_STATE_DIFF_JSON_PATH: &str = "central_state_diff.json"; + +fn central_state_diff() -> CentralStateDiff { + CentralStateDiff { + address_to_class_hash: indexmap! { + contract_address!(1_u8) => + ClassHash(felt!(1_u8)), + }, + nonces: indexmap!( + DataAvailabilityMode::L1 => + indexmap!(contract_address!(2_u8)=> Nonce(felt!(2_u8))), + ), + storage_updates: indexmap!( + DataAvailabilityMode::L1=> + indexmap!(contract_address!(3_u8) => indexmap!(storage_key!(3_u8) => felt!(3_u8))), + ), + declared_classes: indexmap!(ClassHash(felt!(4_u8))=> CompiledClassHash(felt!(4_u8))), + block_info: CentralBlockInfo { + block_number: BlockNumber(5), + block_timestamp: BlockTimestamp(6), + sequencer_address: contract_address!(7_u8), + l1_gas_price: CentralResourcePrice { + price_in_wei: NonzeroGasPrice::new(GasPrice(8)).unwrap(), + price_in_fri: NonzeroGasPrice::new(GasPrice(9)).unwrap(), + }, + l1_data_gas_price: CentralResourcePrice { + price_in_wei: NonzeroGasPrice::new(GasPrice(10)).unwrap(), + price_in_fri: NonzeroGasPrice::new(GasPrice(11)).unwrap(), + }, + l2_gas_price: CentralResourcePrice { + price_in_wei: NonzeroGasPrice::new(GasPrice(12)).unwrap(), + price_in_fri: NonzeroGasPrice::new(GasPrice(13)).unwrap(), + }, + use_kzg_da: true, + starknet_version: Some(StarknetVersion::default()), + }, + } +} + +#[test] +fn serialize_central_state_diff() { + let rust_central_state_diff = central_state_diff(); + let rust_json = serde_json::to_value(&rust_central_state_diff).unwrap(); + + let python_json = read_json_file(CENTRAL_STATE_DIFF_JSON_PATH); + + assert_eq!(rust_json, python_json,); +} diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/cende/mod.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/mod.rs new file mode 100644 index 00000000000..94dbbf15c0e --- /dev/null +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/cende/mod.rs @@ -0,0 +1,101 @@ +mod central_objects; + +use std::sync::Arc; + +use async_trait::async_trait; +use futures::channel::oneshot; +#[cfg(test)] +use mockall::automock; +use starknet_api::block::BlockNumber; +use tokio::sync::Mutex; +use tokio::task::{self}; +use tracing::debug; + +// TODO(dvir): add tests when will have more logic. + +/// A chunk of all the data to write to Aersopike. +#[derive(Debug)] +pub(crate) struct AerospikeBlob { + // TODO(yael, dvir): add the blob fields. +} + +#[cfg_attr(test, automock)] +#[async_trait] +pub trait CendeContext: Send + Sync { + /// Write the previous height blob to Aerospike. Returns a cell with an inner boolean indicating + /// whether the write was successful. + /// `height` is the height of the block that is built when calling this function. + fn write_prev_height_blob(&self, height: BlockNumber) -> oneshot::Receiver; + + // Prepares the previous height blob that will be written in the next height. + async fn prepare_blob_for_next_height(&self, blob_parameters: BlobParameters); +} + +#[derive(Clone, Debug, Default)] +pub struct CendeAmbassador { + // TODO(dvir): consider creating enum varaiant instead of the `Option`. + // `None` indicates that there is no blob to write, and therefore, the node can't be the + // proposer. + prev_height_blob: Arc>>, +} + +impl CendeAmbassador { + pub fn new() -> Self { + CendeAmbassador { prev_height_blob: Arc::new(Mutex::new(None)) } + } +} + +#[async_trait] +impl CendeContext for CendeAmbassador { + fn write_prev_height_blob(&self, height: BlockNumber) -> oneshot::Receiver { + let (sender, receiver) = oneshot::channel(); + let prev_height_blob = self.prev_height_blob.clone(); + task::spawn(async move { + // TODO(dvir): remove this when handle the booting up case. + // Heights that are permitted to be built without writing to Aerospike. + // Height 1 to make `end_to_end_flow` test pass. + const PERMITTED_HEIGHTS: [BlockNumber; 1] = [BlockNumber(1)]; + + if PERMITTED_HEIGHTS.contains(&height) { + debug!( + "height {} is in `PERMITTED_HEIGHTS`, consensus can send proposal without \ + writing to Aerospike", + height + ); + sender.send(true).unwrap(); + return; + } + let Some(ref _blob) = *prev_height_blob.lock().await else { + debug!("No blob to write to Aerospike."); + sender.send(false).expect("Writing to a one-shot sender should succeed."); + return; + }; + // TODO(dvir): write blob to AS. + // TODO(dvir): consider set `prev_height_blob` to `None` after writing to AS. + debug!("Writing blob to Aerospike."); + sender.send(true).expect("Writing to a one-shot sender should succeed."); + debug!("Blob writing to Aerospike completed."); + }); + + receiver + } + + async fn prepare_blob_for_next_height(&self, blob_parameters: BlobParameters) { + // TODO(dvir, yael): make the full creation of blob. + // TODO(dvir): as optimization, call the `into` and other preperation when writing to AS. + *self.prev_height_blob.lock().await = Some(blob_parameters.into()); + } +} + +#[derive(Clone, Debug, Default)] +pub struct BlobParameters { + // TODO(dvir): add here all the information needed for creating the blob: tranasctions, classes, + // block info, BlockExecutionArtifacts. +} + +impl From for AerospikeBlob { + fn from(_blob_parameters: BlobParameters) -> Self { + // TODO(yael): make the full creation of blob. + AerospikeBlob {} + } +} diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/lib.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/lib.rs index ff7de38c704..8f7eb6e36d0 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/src/lib.rs +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/lib.rs @@ -7,3 +7,7 @@ pub mod papyrus_consensus_context; #[allow(missing_docs)] pub mod sequencer_consensus_context; + +/// Centralized and decentralized communication types and functionallity. +#[allow(missing_docs)] +pub mod cende; diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context.rs index 5581abac189..e7b833ffa2c 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context.rs +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context.rs @@ -21,17 +21,16 @@ use papyrus_consensus::types::{ ProposalContentId, Round, ValidatorId, - DEFAULT_VALIDATOR_ID, }; use papyrus_network::network_manager::{BroadcastTopicClient, BroadcastTopicClientTrait}; use papyrus_protobuf::consensus::{ ConsensusMessage, - Proposal, ProposalFin, ProposalInit, ProposalPart, TransactionBatch, Vote, + DEFAULT_VALIDATOR_ID, }; use papyrus_storage::body::BodyStorageReader; use papyrus_storage::header::HeaderStorageReader; @@ -89,7 +88,8 @@ impl ConsensusContext for PapyrusConsensusContext { proposal_init: ProposalInit, _timeout: Duration, ) -> oneshot::Receiver { - let mut proposal_sender_sender = self.network_proposal_sender.clone(); + let height = proposal_init.height; + let mut network_proposal_sender = self.network_proposal_sender.clone(); let (fin_sender, fin_receiver) = oneshot::channel(); let storage_reader = self.storage_reader.clone(); @@ -99,46 +99,37 @@ impl ConsensusContext for PapyrusConsensusContext { // TODO(dvir): consider fix this for the case of reverts. If between the check that // the block in storage and to getting the transaction was a revert // this flow will fail. - wait_for_block(&storage_reader, proposal_init.height) - .await - .expect("Failed to wait to block"); + wait_for_block(&storage_reader, height).await.expect("Failed to wait to block"); let txn = storage_reader.begin_ro_txn().expect("Failed to begin ro txn"); let transactions = txn - .get_block_transactions(proposal_init.height) + .get_block_transactions(height) .expect("Get transactions from storage failed") .unwrap_or_else(|| { - panic!( - "Block in {} was not found in storage despite waiting for it", - proposal_init.height - ) + panic!("Block in {height} was not found in storage despite waiting for it") }); let block_hash = txn - .get_block_header(proposal_init.height) + .get_block_header(height) .expect("Get header from storage failed") .unwrap_or_else(|| { - panic!( - "Block in {} was not found in storage despite waiting for it", - proposal_init.height - ) + panic!("Block in {height} was not found in storage despite waiting for it") }) .block_hash; let (mut proposal_sender, proposal_receiver) = mpsc::channel(CHANNEL_SIZE); - let stream_id = proposal_init.height.0; - proposal_sender_sender + let stream_id = height.0; + network_proposal_sender .send((stream_id, proposal_receiver)) .await .expect("Failed to send proposal receiver"); proposal_sender - .send(Self::ProposalPart::Init(proposal_init.clone())) + .send(Self::ProposalPart::Init(proposal_init)) .await .expect("Failed to send proposal init"); proposal_sender .send(ProposalPart::Transactions(TransactionBatch { transactions: transactions.clone(), - tx_hashes: vec![], })) .await .expect("Failed to send transactions"); @@ -150,10 +141,7 @@ impl ConsensusContext for PapyrusConsensusContext { let mut proposals = valid_proposals .lock() .expect("Lock on active proposals was poisoned due to a previous panic"); - proposals - .entry(proposal_init.height) - .or_default() - .insert(block_hash, transactions); + proposals.entry(height).or_default().insert(block_hash, transactions); } // Done after inserting the proposal into the map to avoid race conditions between // insertion and calls to `repropose`. @@ -167,12 +155,11 @@ impl ConsensusContext for PapyrusConsensusContext { async fn validate_proposal( &mut self, - height: BlockNumber, - _round: Round, - _proposer: ValidatorId, + proposal_init: ProposalInit, _timeout: Duration, mut content: mpsc::Receiver, ) -> oneshot::Receiver<(ProposalContentId, ProposalFin)> { + let height = proposal_init.height; let (fin_sender, fin_receiver) = oneshot::channel(); let storage_reader = self.storage_reader.clone(); @@ -251,28 +238,35 @@ impl ConsensusContext for PapyrusConsensusContext { } async fn repropose(&mut self, id: ProposalContentId, init: ProposalInit) { + let height = init.height; let transactions = self .valid_proposals .lock() .expect("valid_proposals lock was poisoned") - .get(&init.height) - .unwrap_or_else(|| panic!("No proposals found for height {}", init.height)) + .get(&height) + .unwrap_or_else(|| panic!("No proposals found for height {height}")) .get(&id) - .unwrap_or_else(|| panic!("No proposal found for height {} and id {}", init.height, id)) + .unwrap_or_else(|| panic!("No proposal found for height {height} and id {id}")) .clone(); - let proposal = Proposal { - height: init.height.0, - round: init.round, - proposer: init.proposer, - transactions, - block_hash: id, - valid_round: init.valid_round, - }; - self.network_broadcast_client - .broadcast_message(ConsensusMessage::Proposal(proposal)) + let stream_id = height.0; + let (mut proposal_sender, proposal_receiver) = mpsc::channel(CHANNEL_SIZE); + self.network_proposal_sender + .send((stream_id, proposal_receiver)) + .await + .expect("Failed to send proposal receiver"); + proposal_sender + .send(Self::ProposalPart::Init(init)) + .await + .expect("Failed to send proposal init"); + proposal_sender + .send(ProposalPart::Transactions(TransactionBatch { transactions })) + .await + .expect("Failed to send transactions"); + proposal_sender + .send(ProposalPart::Fin(ProposalFin { proposal_content_id: id })) .await - .expect("Failed to send proposal"); + .expect("Failed to send fin"); } async fn validators(&self, _height: BlockNumber) -> Vec { diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context_test.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context_test.rs index dc83ee01c75..ab2276001a4 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context_test.rs +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/papyrus_consensus_context_test.rs @@ -3,7 +3,7 @@ use std::time::Duration; use futures::channel::{mpsc, oneshot}; use futures::StreamExt; use papyrus_consensus::stream_handler::StreamHandler; -use papyrus_consensus::types::{ConsensusContext, ValidatorId, DEFAULT_VALIDATOR_ID}; +use papyrus_consensus::types::ConsensusContext; use papyrus_network::network_manager::test_utils::{ mock_register_broadcast_topic, BroadcastNetworkMock, @@ -24,6 +24,7 @@ use papyrus_storage::header::HeaderStorageWriter; use papyrus_storage::test_utils::get_test_storage; use papyrus_test_utils::get_test_block; use starknet_api::block::{Block, BlockHash}; +use test_case::test_case; use crate::papyrus_consensus_context::PapyrusConsensusContext; @@ -36,12 +37,7 @@ const TEST_CHANNEL_SIZE: usize = 10; async fn build_proposal() { let (block, mut papyrus_context, _mock_network, _) = test_setup(); let block_number = block.header.block_header_without_hash.block_number; - let proposal_init = ProposalInit { - height: block_number, - round: 0, - proposer: ValidatorId::from(DEFAULT_VALIDATOR_ID), - valid_round: None, - }; + let proposal_init = ProposalInit { height: block_number, ..Default::default() }; // TODO(Asmaa): Test proposal content. let fin_receiver = papyrus_context.build_proposal(proposal_init, Duration::MAX).await; @@ -49,17 +45,16 @@ async fn build_proposal() { assert_eq!(fin, block.header.block_hash); } +#[test_case(true ; "repropose")] +#[test_case(false ; "dont_repropose")] #[tokio::test] -async fn validate_proposal_success() { +async fn validate_proposal_success(repropose: bool) { let (block, mut papyrus_context, _mock_network, _) = test_setup(); let block_number = block.header.block_header_without_hash.block_number; let (mut validate_sender, validate_receiver) = mpsc::channel(TEST_CHANNEL_SIZE); for tx in block.body.transactions.clone() { - let tx_part = ProposalPart::Transactions(TransactionBatch { - transactions: vec![tx], - tx_hashes: vec![], - }); + let tx_part = ProposalPart::Transactions(TransactionBatch { transactions: vec![tx] }); validate_sender.try_send(tx_part).unwrap(); } let fin_part = ProposalPart::Fin(ProposalFin { proposal_content_id: block.header.block_hash }); @@ -68,9 +63,7 @@ async fn validate_proposal_success() { let fin = papyrus_context .validate_proposal( - block_number, - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), + ProposalInit { height: block_number, ..Default::default() }, Duration::MAX, validate_receiver, ) @@ -79,6 +72,12 @@ async fn validate_proposal_success() { .unwrap(); assert_eq!(fin.0, block.header.block_hash); + if repropose { + let proposal_init = ProposalInit { height: block_number, ..Default::default() }; + // Context checks if the proposal exists in `self.valid_proposals` for retrieval and + // streaming. The user doesn't interact or see what's done with it. + papyrus_context.repropose(block.header.block_hash, proposal_init).await; + } } #[tokio::test] @@ -89,19 +88,14 @@ async fn validate_proposal_fail() { let different_block = get_test_block(4, None, None, None); let (mut validate_sender, validate_receiver) = mpsc::channel(5000); for tx in different_block.body.transactions.clone() { - let tx_part = ProposalPart::Transactions(TransactionBatch { - transactions: vec![tx], - tx_hashes: vec![], - }); + let tx_part = ProposalPart::Transactions(TransactionBatch { transactions: vec![tx] }); validate_sender.try_send(tx_part).unwrap(); } validate_sender.close_channel(); let fin = papyrus_context .validate_proposal( - block_number, - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), + ProposalInit { height: block_number, ..Default::default() }, Duration::MAX, validate_receiver, ) diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context.rs index 12ba86891a6..bf9e03d309e 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context.rs +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context.rs @@ -18,7 +18,6 @@ use papyrus_consensus::types::{ ProposalContentId, Round, ValidatorId, - DEFAULT_VALIDATOR_ID, }; use papyrus_network::network_manager::{BroadcastTopicClient, BroadcastTopicClientTrait}; use papyrus_protobuf::consensus::{ @@ -28,6 +27,7 @@ use papyrus_protobuf::consensus::{ ProposalPart, TransactionBatch, Vote, + DEFAULT_VALIDATOR_ID, }; use starknet_api::block::{ BlockHash, @@ -41,6 +41,7 @@ use starknet_api::block::{ }; use starknet_api::core::ChainId; use starknet_api::executable_transaction::Transaction as ExecutableTransaction; +use starknet_api::transaction::{Transaction, TransactionHash}; use starknet_batcher_types::batcher_types::{ DecisionReachedInput, GetProposalContent, @@ -54,9 +55,11 @@ use starknet_batcher_types::batcher_types::{ ValidateBlockInput, }; use starknet_batcher_types::communication::BatcherClient; -use tokio::sync::Notify; use tokio::task::JoinHandle; -use tracing::{debug, debug_span, error, info, trace, warn, Instrument}; +use tokio_util::sync::CancellationToken; +use tracing::{debug, debug_span, info, instrument, trace, warn, Instrument}; + +use crate::cende::{BlobParameters, CendeContext}; // TODO(Dan, Matan): Remove this once and replace with real gas prices. const TEMPORARY_GAS_PRICES: GasPrices = GasPrices { @@ -81,6 +84,18 @@ type ValidationParams = (BlockNumber, ValidatorId, Duration, mpsc::Receiver, validators: Vec, @@ -98,7 +113,7 @@ pub struct SequencerConsensusContext { // Building proposals are not tracked as active, as consensus can't move on to the next // height/round until building is done. Context only works on proposals for the // current round. - active_proposal: Option<(Arc, JoinHandle<()>)>, + active_proposal: Option<(CancellationToken, JoinHandle<()>)>, // Stores proposals for future rounds until the round is reached. queued_proposals: BTreeMap)>, @@ -107,6 +122,7 @@ pub struct SequencerConsensusContext { vote_broadcast_client: BroadcastTopicClient, // Used to convert Transaction to ExecutableTransaction. chain_id: ChainId, + cende_ambassador: Arc, } impl SequencerConsensusContext { @@ -116,6 +132,7 @@ impl SequencerConsensusContext { vote_broadcast_client: BroadcastTopicClient, num_validators: u64, chain_id: ChainId, + cende_ambassador: Arc, ) -> Self { Self { batcher, @@ -132,6 +149,7 @@ impl SequencerConsensusContext { active_proposal: None, queued_proposals: BTreeMap::new(), chain_id, + cende_ambassador, } } } @@ -140,17 +158,17 @@ impl SequencerConsensusContext { impl ConsensusContext for SequencerConsensusContext { type ProposalPart = ProposalPart; + #[instrument(level = "info", skip_all, fields(proposal_init))] async fn build_proposal( &mut self, proposal_init: ProposalInit, timeout: Duration, ) -> oneshot::Receiver { + info!("Building proposal: timeout={timeout:?}"); + let cende_write_success = + self.cende_ambassador.write_prev_height_blob(proposal_init.height); // Handles interrupting an active proposal from a previous height/round self.set_height_and_round(proposal_init.height, proposal_init.round).await; - debug!( - "Building proposal for height: {} with timeout: {:?}", - proposal_init.height, timeout - ); let (fin_sender, fin_receiver) = oneshot::channel(); let batcher = Arc::clone(&self.batcher); @@ -158,13 +176,14 @@ impl ConsensusContext for SequencerConsensusContext { let proposal_id = ProposalId(self.proposal_id); self.proposal_id += 1; - let timeout = - chrono::Duration::from_std(timeout).expect("Can't convert timeout to chrono::Duration"); + assert!(timeout > BUILD_PROPOSAL_MARGIN); + let batcher_timeout = chrono::Duration::from_std(timeout - BUILD_PROPOSAL_MARGIN) + .expect("Can't convert timeout to chrono::Duration"); let now = chrono::Utc::now(); let build_proposal_input = ProposeBlockInput { proposal_id, // TODO: Discuss with batcher team passing std Duration instead. - deadline: now + timeout, + deadline: now + batcher_timeout, // TODO: This is not part of Milestone 1. retrospective_block_hash: Some(BlockHashAndNumber { number: BlockNumber::default(), @@ -184,7 +203,7 @@ impl ConsensusContext for SequencerConsensusContext { // TODO: Should we be returning an error? // I think this implies defining an error type in this crate and moving the trait definition // here also. - debug!("Initiating proposal build: {build_proposal_input:?}"); + debug!("Initiating build proposal: {build_proposal_input:?}"); batcher .propose_block(build_proposal_input) .await @@ -197,7 +216,7 @@ impl ConsensusContext for SequencerConsensusContext { .await .expect("Failed to send proposal receiver"); proposal_sender - .send(ProposalPart::Init(proposal_init.clone())) + .send(ProposalPart::Init(proposal_init)) .await .expect("Failed to send proposal init"); tokio::spawn( @@ -208,6 +227,7 @@ impl ConsensusContext for SequencerConsensusContext { batcher, valid_proposals, proposal_sender, + cende_write_success, fin_sender, ) .await; @@ -220,27 +240,33 @@ impl ConsensusContext for SequencerConsensusContext { // Note: this function does not receive ProposalInit. // That part is consumed by the caller, so it can know the height/round. + #[instrument(level = "info", skip(self, timeout, content_receiver))] async fn validate_proposal( &mut self, - height: BlockNumber, - round: Round, - validator: ValidatorId, + proposal_init: ProposalInit, timeout: Duration, content_receiver: mpsc::Receiver, ) -> oneshot::Receiver<(ProposalContentId, ProposalFin)> { - assert_eq!(Some(height), self.current_height); + info!("Validating proposal: timeout={timeout:?}"); + assert_eq!(Some(proposal_init.height), self.current_height); let (fin_sender, fin_receiver) = oneshot::channel(); - match round.cmp(&self.current_round) { + match proposal_init.round.cmp(&self.current_round) { std::cmp::Ordering::Less => fin_receiver, std::cmp::Ordering::Greater => { - self.queued_proposals - .insert(round, ((height, validator, timeout, content_receiver), fin_sender)); + debug!("Queuing proposal for future round: current_round={}", self.current_round); + self.queued_proposals.insert( + proposal_init.round, + ( + (proposal_init.height, proposal_init.proposer, timeout, content_receiver), + fin_sender, + ), + ); fin_receiver } std::cmp::Ordering::Equal => { self.validate_current_round_proposal( - height, - validator, + proposal_init.height, + proposal_init.proposer, timeout, content_receiver, fin_sender, @@ -303,7 +329,13 @@ impl ConsensusContext for SequencerConsensusContext { proposal_id = proposals.get(&BlockNumber(height)).unwrap().get(&block).unwrap().1; proposals.retain(|&h, _| h > BlockNumber(height)); } + // TODO(dvir): return from the batcher's 'decision_reached' function the relevant data to + // build a blob. self.batcher.decision_reached(DecisionReachedInput { proposal_id }).await.unwrap(); + // TODO(dvir): pass here real `BlobParameters` info. + // TODO(dvir): when passing here the correct `BlobParameters`, also test that + // `prepare_blob_for_next_height` is called with the correct parameters. + self.cende_ambassador.prepare_blob_for_next_height(BlobParameters::default()).await; Ok(()) } @@ -355,15 +387,16 @@ impl ConsensusContext for SequencerConsensusContext { } impl SequencerConsensusContext { + #[instrument(level = "info", skip(self, timeout, content_receiver, fin_sender))] async fn validate_current_round_proposal( &mut self, height: BlockNumber, proposer: ValidatorId, timeout: Duration, - content_receiver: mpsc::Receiver, + mut content_receiver: mpsc::Receiver, fin_sender: oneshot::Sender<(ProposalContentId, ProposalFin)>, ) { - debug!("Validating proposal for height: {height} with timeout: {timeout:?}"); + info!("Validating proposal with timeout: {timeout:?}"); let batcher = Arc::clone(&self.batcher); let valid_proposals = Arc::clone(&self.valid_proposals); let proposal_id = ProposalId(self.proposal_id); @@ -391,40 +424,64 @@ impl SequencerConsensusContext { sequencer_address: proposer, }, }; + debug!("Initiating validate proposal: input={input:?}"); batcher.validate_block(input).await.expect("Failed to initiate proposal validation"); - let notify = Arc::new(Notify::new()); - let notify_clone = Arc::clone(¬ify); + let token = CancellationToken::new(); + let token_clone = token.clone(); let chain_id = self.chain_id.clone(); + let mut content = Vec::new(); - let handle = tokio::spawn( - async move { - let validate_fut = stream_validate_proposal( - height, - proposal_id, - batcher, - valid_proposals, - content_receiver, - fin_sender, - chain_id, - ); + let handle = tokio::spawn(async move { + let (built_block, received_fin) = loop { tokio::select! { - _ = notify_clone.notified() => {} - result = tokio::time::timeout(timeout, validate_fut) =>{ - if let Err(e) = result { - error!("Validation timed out. {e:?}"); + _ = token_clone.cancelled() => { + warn!("Proposal interrupted: {:?}", proposal_id); + batcher_abort_proposal(batcher.as_ref(), proposal_id).await; + return; + } + _ = tokio::time::sleep(timeout) => { + warn!("Validation timed out"); + batcher_abort_proposal(batcher.as_ref(), proposal_id).await; + return; + } + proposal_part = content_receiver.next() => { + match handle_proposal_part( + proposal_id, + batcher.as_ref(), + proposal_part, + &mut content, + chain_id.clone() + ).await { + HandledProposalPart::Finished(built_block, received_fin) => { + break (built_block, received_fin); + } + HandledProposalPart::Continue => {continue;} + HandledProposalPart::Failed(fail_reason) => { + warn!("Failed to handle proposal part: {proposal_id:?}, {fail_reason}"); + batcher_abort_proposal(batcher.as_ref(), proposal_id).await; + return; + } } } } + }; + // Update valid_proposals before sending fin to avoid a race condition + // with `get_proposal` being called before `valid_proposals` is updated. + // TODO(Matan): Consider validating the ProposalFin signature here. + let mut valid_proposals = valid_proposals.lock().unwrap(); + valid_proposals.entry(height).or_default().insert(built_block, (content, proposal_id)); + if fin_sender.send((built_block, received_fin)).is_err() { + // Consensus may exit early (e.g. sync). + warn!("Failed to send proposal content ids"); } - .instrument(debug_span!("consensus_validate_proposal")), - ); - self.active_proposal = Some((notify, handle)); + }); + self.active_proposal = Some((token, handle)); } fn interrupt_active_proposal(&self) { - if let Some((notify, _)) = &self.active_proposal { - notify.notify_one(); + if let Some((token, _)) = &self.active_proposal { + token.cancel(); } } } @@ -441,6 +498,7 @@ async fn stream_build_proposal( batcher: Arc, valid_proposals: Arc>, mut proposal_sender: mpsc::Sender, + mut cende_write_success: oneshot::Receiver, fin_sender: oneshot::Sender, ) { let mut content = Vec::new(); @@ -459,19 +517,16 @@ async fn stream_build_proposal( // TODO: Broadcast the transactions to the network. // TODO(matan): Convert to protobuf and make sure this isn't too large for a single // proto message (could this be a With adapter added to the channel in `new`?). - let mut transaction_hashes = Vec::with_capacity(txs.len()); - let mut transactions = Vec::with_capacity(txs.len()); - for tx in txs.into_iter() { - transaction_hashes.push(tx.tx_hash()); - transactions.push(tx.into()); - } + let transaction_hashes = + txs.iter().map(|tx| tx.tx_hash()).collect::>(); debug!("Broadcasting proposal content: {transaction_hashes:?}"); + + let transactions = + txs.into_iter().map(|tx| tx.into()).collect::>(); trace!("Broadcasting proposal content: {transactions:?}"); + proposal_sender - .send(ProposalPart::Transactions(TransactionBatch { - transactions, - tx_hashes: transaction_hashes, - })) + .send(ProposalPart::Transactions(TransactionBatch { transactions })) .await .expect("Failed to broadcast proposal content"); } @@ -486,6 +541,23 @@ async fn stream_build_proposal( height ); debug!("Broadcasting proposal fin: {proposal_content_id:?}"); + + // If the blob writing operation to Aerospike doesn't return a success status, we + // can't finish the proposal. + match cende_write_success.try_recv() { + Ok(Some(true)) => { + debug!("Writing blob to Aerospike completed."); + } + Ok(Some(false)) => { + debug!("Writing blob to Aerospike failed."); + return; + } + _ => { + debug!("Writing blob to Aerospike didn't return in time."); + return; + } + } + proposal_sender .send(ProposalPart::Fin(ProposalFin { proposal_content_id })) .await @@ -508,95 +580,77 @@ async fn stream_build_proposal( } // Handles receiving a proposal from another node without blocking consensus: -// 1. Receives the proposal content from the network. +// 1. Receives the proposal part from the network. // 2. Pass this to the batcher. // 3. Once finished, receive the commitment from the batcher. -// 4. Store the proposal for re-proposal. -// 5. Send the commitment to consensus. -async fn stream_validate_proposal( - height: BlockNumber, +async fn handle_proposal_part( proposal_id: ProposalId, - batcher: Arc, - valid_proposals: Arc>, - mut content_receiver: mpsc::Receiver, - fin_sender: oneshot::Sender<(ProposalContentId, ProposalFin)>, + batcher: &dyn BatcherClient, + proposal_part: Option, + content: &mut Vec, chain_id: ChainId, -) { - let mut content = Vec::new(); - let network_block_id = loop { - let Some(prop_part) = content_receiver.next().await else { - // TODO(Asmaa): Tell the batcher to abort. - warn!("Failed to receive proposal content: {proposal_id:?}"); - return; - }; - match prop_part { - ProposalPart::Transactions(TransactionBatch { transactions: txs, tx_hashes: _ }) => { - let exe_txs: Vec = txs - .into_iter() - .map(|tx| { - // An error means we have an invalid chain_id. - (tx, &chain_id) - .try_into() - .expect("Failed to convert transaction to executable_transation.") - }) - .collect(); - content.extend_from_slice(&exe_txs[..]); - let input = SendProposalContentInput { - proposal_id, - content: SendProposalContent::Txs(exe_txs), - }; - let response = batcher.send_proposal_content(input).await.unwrap_or_else(|e| { - panic!("Failed to send proposal content to batcher: {proposal_id:?}. {e:?}") - }); - match response.response { - ProposalStatus::Processing => {} - ProposalStatus::InvalidProposal => { - warn!("Proposal was invalid: {:?}", proposal_id); - return; - } - status => panic!("Unexpected status: for {proposal_id:?}, {status:?}"), +) -> HandledProposalPart { + match proposal_part { + None => HandledProposalPart::Failed("Failed to receive proposal content".to_string()), + Some(ProposalPart::Transactions(TransactionBatch { transactions: txs })) => { + let exe_txs: Vec = txs + .into_iter() + .map(|tx| { + // An error means we have an invalid chain_id. + (tx, &chain_id) + .try_into() + .expect("Failed to convert transaction to executable_transation.") + }) + .collect(); + content.extend_from_slice(&exe_txs[..]); + let input = SendProposalContentInput { + proposal_id, + content: SendProposalContent::Txs(exe_txs), + }; + let response = batcher.send_proposal_content(input).await.unwrap_or_else(|e| { + panic!("Failed to send proposal content to batcher: {proposal_id:?}. {e:?}") + }); + match response.response { + ProposalStatus::Processing => HandledProposalPart::Continue, + ProposalStatus::InvalidProposal => { + HandledProposalPart::Failed("Invalid proposal".to_string()) } + status => panic!("Unexpected status: for {proposal_id:?}, {status:?}"), } - ProposalPart::Fin(ProposalFin { proposal_content_id: id }) => { - // Output this along with the ID from batcher, to compare them. - break id; - } - _ => panic!("Invalid proposal part: {:?}", prop_part), } - }; - let input = SendProposalContentInput { proposal_id, content: SendProposalContent::Finish }; - let response = batcher - .send_proposal_content(input) - .await - .unwrap_or_else(|e| panic!("Failed to send Fin to batcher: {proposal_id:?}. {e:?}")); - let response_id = match response.response { - ProposalStatus::Finished(id) => id, - ProposalStatus::InvalidProposal => { - warn!("Proposal was invalid: {:?}", proposal_id); - return; + Some(ProposalPart::Fin(ProposalFin { proposal_content_id: id })) => { + // Output this along with the ID from batcher, to compare them. + let input = + SendProposalContentInput { proposal_id, content: SendProposalContent::Finish }; + let response = batcher.send_proposal_content(input).await.unwrap_or_else(|e| { + panic!("Failed to send Fin to batcher: {proposal_id:?}. {e:?}") + }); + let response_id = match response.response { + ProposalStatus::Finished(id) => id, + ProposalStatus::InvalidProposal => { + return HandledProposalPart::Failed("Invalid proposal".to_string()); + } + status => panic!("Unexpected status: for {proposal_id:?}, {status:?}"), + }; + let batcher_block_id = BlockHash(response_id.state_diff_commitment.0.0); + info!( + "Finished validating proposal {:?}: network_block_id: {:?}, batcher_block_id = \ + {:?}, num_txs = {:?}", + proposal_id, + id, + batcher_block_id, + content.len(), + ); + HandledProposalPart::Finished(batcher_block_id, ProposalFin { proposal_content_id: id }) } - status => panic!("Unexpected status: for {proposal_id:?}, {status:?}"), - }; - let batcher_block_id = BlockHash(response_id.state_diff_commitment.0.0); - info!( - "Finished validating proposal {:?}: network_block_id: {:?}, batcher_block_id = {:?}, \ - num_txs = {:?}, height = {:?}", - proposal_id, - network_block_id, - batcher_block_id, - content.len(), - height - ); - // Update valid_proposals before sending fin to avoid a race condition - // with `get_proposal` being called before `valid_proposals` is updated. - // TODO(Matan): Consider validating the ProposalFin signature here. - let mut valid_proposals = valid_proposals.lock().unwrap(); - valid_proposals.entry(height).or_default().insert(batcher_block_id, (content, proposal_id)); - if fin_sender - .send((batcher_block_id, ProposalFin { proposal_content_id: network_block_id })) - .is_err() - { - // Consensus may exit early (e.g. sync). - warn!("Failed to send proposal content ids"); + _ => panic!("Invalid proposal part: {:?}", proposal_part), } } + +async fn batcher_abort_proposal(batcher: &dyn BatcherClient, proposal_id: ProposalId) { + let input = SendProposalContentInput { proposal_id, content: SendProposalContent::Abort }; + batcher + .send_proposal_content(input) + .await + .unwrap_or_else(|e| panic!("Failed to send Abort to batcher: {proposal_id:?}. {e:?}")); +} diff --git a/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context_test.rs b/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context_test.rs index f72bde01da9..6187664965d 100644 --- a/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context_test.rs +++ b/crates/sequencing/papyrus_consensus_orchestrator/src/sequencer_consensus_context_test.rs @@ -2,11 +2,11 @@ use std::sync::{Arc, OnceLock}; use std::time::Duration; use std::vec; -use futures::channel::mpsc; +use futures::channel::{mpsc, oneshot}; use futures::{FutureExt, SinkExt}; use lazy_static::lazy_static; use papyrus_consensus::stream_handler::StreamHandler; -use papyrus_consensus::types::{ConsensusContext, ValidatorId, DEFAULT_VALIDATOR_ID}; +use papyrus_consensus::types::ConsensusContext; use papyrus_network::network_manager::test_utils::{ mock_register_broadcast_topic, BroadcastNetworkMock, @@ -27,7 +27,7 @@ use starknet_api::executable_transaction::Transaction as ExecutableTransaction; use starknet_api::felt; use starknet_api::hash::PoseidonHash; use starknet_api::test_utils::invoke::{invoke_tx, InvokeTxArgs}; -use starknet_api::transaction::{Transaction, TransactionHash}; +use starknet_api::transaction::Transaction; use starknet_batcher_types::batcher_types::{ GetProposalContent, GetProposalContentResponse, @@ -43,25 +43,26 @@ use starknet_batcher_types::batcher_types::{ use starknet_batcher_types::communication::MockBatcherClient; use starknet_types_core::felt::Felt; +use crate::cende::MockCendeContext; use crate::sequencer_consensus_context::SequencerConsensusContext; -const TIMEOUT: Duration = Duration::from_millis(100); +const TIMEOUT: Duration = Duration::from_millis(1200); const CHANNEL_SIZE: usize = 5000; const NUM_VALIDATORS: u64 = 4; const STATE_DIFF_COMMITMENT: StateDiffCommitment = StateDiffCommitment(PoseidonHash(Felt::ZERO)); const CHAIN_ID: ChainId = ChainId::Mainnet; lazy_static! { - static ref TX_BATCH: Vec = vec![generate_executable_invoke_tx()]; + static ref TX_BATCH: Vec = (0..3).map(generate_invoke_tx).collect(); + static ref EXECUTABLE_TX_BATCH: Vec = + TX_BATCH.iter().map(|tx| (tx.clone(), &CHAIN_ID).try_into().unwrap()).collect(); } -fn generate_invoke_tx() -> Transaction { - Transaction::Invoke(invoke_tx(InvokeTxArgs { nonce: Nonce(felt!(3_u8)), ..Default::default() })) -} - -fn generate_executable_invoke_tx() -> ExecutableTransaction { - let tx = generate_invoke_tx(); - (tx, &CHAIN_ID).try_into().unwrap() +fn generate_invoke_tx(nonce: u8) -> Transaction { + Transaction::Invoke(invoke_tx(InvokeTxArgs { + nonce: Nonce(felt!(nonce)), + ..Default::default() + })) } // Structs which aren't utilized but should not be dropped. @@ -70,7 +71,10 @@ struct NetworkDependencies { _new_proposal_network: BroadcastNetworkMock>, } -fn setup(batcher: MockBatcherClient) -> (SequencerConsensusContext, NetworkDependencies) { +fn setup( + batcher: MockBatcherClient, + cende_ambassador: MockCendeContext, +) -> (SequencerConsensusContext, NetworkDependencies) { let TestSubscriberChannels { mock_network: mock_proposal_stream_network, subscriber_channels } = mock_register_broadcast_topic().expect("Failed to create mock network"); let BroadcastTopicChannels { @@ -91,6 +95,7 @@ fn setup(batcher: MockBatcherClient) -> (SequencerConsensusContext, NetworkDepen votes_topic_client, NUM_VALIDATORS, CHAIN_ID, + Arc::new(cende_ambassador), ); let network_dependencies = NetworkDependencies { @@ -101,8 +106,10 @@ fn setup(batcher: MockBatcherClient) -> (SequencerConsensusContext, NetworkDepen (context, network_dependencies) } -#[tokio::test] -async fn build_proposal() { +// Setup for test of the `build_proposal` function. +async fn build_proposal_setup( + mock_cende_context: MockCendeContext, +) -> (oneshot::Receiver, NetworkDependencies) { let mut batcher = MockBatcherClient::new(); let proposal_id = Arc::new(OnceLock::new()); let proposal_id_clone = Arc::clone(&proposal_id); @@ -117,7 +124,9 @@ async fn build_proposal() { let proposal_id_clone = Arc::clone(&proposal_id); batcher.expect_get_proposal_content().times(1).returning(move |input| { assert_eq!(input.proposal_id, *proposal_id_clone.get().unwrap()); - Ok(GetProposalContentResponse { content: GetProposalContent::Txs(TX_BATCH.clone()) }) + Ok(GetProposalContentResponse { + content: GetProposalContent::Txs(EXECUTABLE_TX_BATCH.clone()), + }) }); let proposal_id_clone = Arc::clone(&proposal_id); batcher.expect_get_proposal_content().times(1).returning(move |input| { @@ -128,13 +137,23 @@ async fn build_proposal() { }), }) }); - let (mut context, _network) = setup(batcher); - let init = - ProposalInit { proposer: ValidatorId::from(DEFAULT_VALIDATOR_ID), ..Default::default() }; - // TODO(Asmaa): Test proposal content. - let fin_receiver = context.build_proposal(init, TIMEOUT).await; - assert_eq!(fin_receiver.await.unwrap().0, STATE_DIFF_COMMITMENT.0.0); + let (mut context, _network) = setup(batcher, mock_cende_context); + let init = ProposalInit::default(); + + (context.build_proposal(init, TIMEOUT).await, _network) +} + +// Returns a mock CendeContext that will return a successful write_prev_height_blob. +fn success_cende_ammbassador() -> MockCendeContext { + let mut mock_cende = MockCendeContext::new(); + mock_cende.expect_write_prev_height_blob().returning(|_height| { + let (sender, receiver) = oneshot::channel(); + sender.send(true).unwrap(); + receiver + }); + + mock_cende } #[tokio::test] @@ -157,7 +176,7 @@ async fn validate_proposal_success() { let SendProposalContent::Txs(txs) = input.content else { panic!("Expected SendProposalContent::Txs, got {:?}", input.content); }; - assert_eq!(txs, *TX_BATCH); + assert_eq!(txs, *EXECUTABLE_TX_BATCH); Ok(SendProposalContentResponse { response: ProposalStatus::Processing }) }, ); @@ -173,20 +192,14 @@ async fn validate_proposal_success() { }) }, ); - let (mut context, _network) = setup(batcher); + let (mut context, _network) = setup(batcher, success_cende_ammbassador()); // Initialize the context for a specific height, starting with round 0. context.set_height_and_round(BlockNumber(0), 0).await; let (mut content_sender, content_receiver) = mpsc::channel(CHANNEL_SIZE); - let tx_hash = TX_BATCH.first().unwrap().tx_hash(); - let txs = - TX_BATCH.clone().into_iter().map(starknet_api::transaction::Transaction::from).collect(); content_sender - .send(ProposalPart::Transactions(TransactionBatch { - transactions: txs, - tx_hashes: vec![tx_hash], - })) + .send(ProposalPart::Transactions(TransactionBatch { transactions: TX_BATCH.to_vec() })) .await .unwrap(); content_sender @@ -195,15 +208,8 @@ async fn validate_proposal_success() { })) .await .unwrap(); - let fin_receiver = context - .validate_proposal( - BlockNumber(0), - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), - TIMEOUT, - content_receiver, - ) - .await; + let fin_receiver = + context.validate_proposal(ProposalInit::default(), TIMEOUT, content_receiver).await; content_sender.close_channel(); assert_eq!(fin_receiver.await.unwrap().0.0, STATE_DIFF_COMMITMENT.0.0); } @@ -233,7 +239,7 @@ async fn repropose() { }) }, ); - let (mut context, _network) = setup(batcher); + let (mut context, _network) = setup(batcher, success_cende_ammbassador()); // Initialize the context for a specific height, starting with round 0. context.set_height_and_round(BlockNumber(0), 0).await; @@ -242,8 +248,7 @@ async fn repropose() { let (mut content_sender, content_receiver) = mpsc::channel(CHANNEL_SIZE); content_sender .send(ProposalPart::Transactions(TransactionBatch { - transactions: vec![generate_invoke_tx()], - tx_hashes: vec![TransactionHash(Felt::TWO)], + transactions: vec![generate_invoke_tx(2)], })) .await .unwrap(); @@ -253,25 +258,13 @@ async fn repropose() { })) .await .unwrap(); - let fin_receiver = context - .validate_proposal( - BlockNumber(0), - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), - TIMEOUT, - content_receiver, - ) - .await; + let fin_receiver = + context.validate_proposal(ProposalInit::default(), TIMEOUT, content_receiver).await; content_sender.close_channel(); assert_eq!(fin_receiver.await.unwrap().0.0, STATE_DIFF_COMMITMENT.0.0); // Re-proposal: Just asserts this is a known valid proposal. - context - .repropose( - BlockHash(STATE_DIFF_COMMITMENT.0.0), - ProposalInit { height: BlockNumber(0), ..Default::default() }, - ) - .await; + context.repropose(BlockHash(STATE_DIFF_COMMITMENT.0.0), ProposalInit::default()).await; } #[tokio::test] @@ -294,7 +287,7 @@ async fn proposals_from_different_rounds() { let SendProposalContent::Txs(txs) = input.content else { panic!("Expected SendProposalContent::Txs, got {:?}", input.content); }; - assert_eq!(txs, *TX_BATCH); + assert_eq!(txs, *EXECUTABLE_TX_BATCH); Ok(SendProposalContentResponse { response: ProposalStatus::Processing }) }, ); @@ -310,16 +303,14 @@ async fn proposals_from_different_rounds() { }) }, ); - let (mut context, _network) = setup(batcher); + let (mut context, _network) = setup(batcher, success_cende_ammbassador()); // Initialize the context for a specific height, starting with round 0. context.set_height_and_round(BlockNumber(0), 0).await; context.set_height_and_round(BlockNumber(0), 1).await; // Proposal parts sent in the proposals. - let prop_part_txs = ProposalPart::Transactions(TransactionBatch { - transactions: TX_BATCH.clone().into_iter().map(Transaction::from).collect(), - tx_hashes: vec![TX_BATCH[0].tx_hash()], - }); + let prop_part_txs = + ProposalPart::Transactions(TransactionBatch { transactions: TX_BATCH.to_vec() }); let prop_part_fin = ProposalPart::Fin(ProposalFin { proposal_content_id: BlockHash(STATE_DIFF_COMMITMENT.0.0), }); @@ -328,15 +319,8 @@ async fn proposals_from_different_rounds() { let (mut content_sender, content_receiver) = mpsc::channel(CHANNEL_SIZE); content_sender.send(prop_part_txs.clone()).await.unwrap(); - let fin_receiver_past_round = context - .validate_proposal( - BlockNumber(0), - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), - TIMEOUT, - content_receiver, - ) - .await; + let mut init = ProposalInit { round: 0, ..Default::default() }; + let fin_receiver_past_round = context.validate_proposal(init, TIMEOUT, content_receiver).await; // No fin was sent, channel remains open. assert!(fin_receiver_past_round.await.is_err()); @@ -344,15 +328,8 @@ async fn proposals_from_different_rounds() { let (mut content_sender, content_receiver) = mpsc::channel(CHANNEL_SIZE); content_sender.send(prop_part_txs.clone()).await.unwrap(); content_sender.send(prop_part_fin.clone()).await.unwrap(); - let fin_receiver_curr_round = context - .validate_proposal( - BlockNumber(0), - 1, - ValidatorId::from(DEFAULT_VALIDATOR_ID), - TIMEOUT, - content_receiver, - ) - .await; + init.round = 1; + let fin_receiver_curr_round = context.validate_proposal(init, TIMEOUT, content_receiver).await; assert_eq!(fin_receiver_curr_round.await.unwrap().0.0, STATE_DIFF_COMMITMENT.0.0); // The proposal from the future round should not be processed. @@ -361,9 +338,7 @@ async fn proposals_from_different_rounds() { content_sender.send(prop_part_fin.clone()).await.unwrap(); let fin_receiver_future_round = context .validate_proposal( - BlockNumber(0), - 2, - ValidatorId::from(DEFAULT_VALIDATOR_ID), + ProposalInit { round: 2, ..Default::default() }, TIMEOUT, content_receiver, ) @@ -394,7 +369,7 @@ async fn interrupt_active_proposal() { .expect_send_proposal_content() .withf(|input| { input.proposal_id == ProposalId(1) - && input.content == SendProposalContent::Txs(TX_BATCH.clone()) + && input.content == SendProposalContent::Txs(EXECUTABLE_TX_BATCH.clone()) }) .times(1) .returning(move |_| { @@ -414,29 +389,19 @@ async fn interrupt_active_proposal() { }), }) }); - let (mut context, _network) = setup(batcher); + let (mut context, _network) = setup(batcher, success_cende_ammbassador()); // Initialize the context for a specific height, starting with round 0. context.set_height_and_round(BlockNumber(0), 0).await; // Keep the sender open, as closing it or sending Fin would cause the validate to complete // without needing interrupt. let (mut _content_sender_0, content_receiver) = mpsc::channel(CHANNEL_SIZE); - let fin_receiver_0 = context - .validate_proposal( - BlockNumber(0), - 0, - ValidatorId::from(DEFAULT_VALIDATOR_ID), - TIMEOUT, - content_receiver, - ) - .await; + let fin_receiver_0 = + context.validate_proposal(ProposalInit::default(), TIMEOUT, content_receiver).await; let (mut content_sender_1, content_receiver) = mpsc::channel(CHANNEL_SIZE); content_sender_1 - .send(ProposalPart::Transactions(TransactionBatch { - transactions: TX_BATCH.clone().into_iter().map(Transaction::from).collect(), - tx_hashes: vec![TX_BATCH[0].tx_hash()], - })) + .send(ProposalPart::Transactions(TransactionBatch { transactions: TX_BATCH.to_vec() })) .await .unwrap(); content_sender_1 @@ -447,9 +412,7 @@ async fn interrupt_active_proposal() { .unwrap(); let fin_receiver_1 = context .validate_proposal( - BlockNumber(0), - 1, - ValidatorId::from(DEFAULT_VALIDATOR_ID), + ProposalInit { round: 1, ..Default::default() }, TIMEOUT, content_receiver, ) @@ -461,3 +424,36 @@ async fn interrupt_active_proposal() { assert!(fin_receiver_0.await.is_err()); assert_eq!(fin_receiver_1.await.unwrap().0.0, STATE_DIFF_COMMITMENT.0.0); } + +#[tokio::test] +async fn build_proposal() { + // TODO(Asmaa): Test proposal content. + let (fin_receiver, _network) = build_proposal_setup(success_cende_ammbassador()).await; + assert_eq!(fin_receiver.await.unwrap().0, STATE_DIFF_COMMITMENT.0.0); +} + +#[tokio::test] +async fn build_proposal_cende_failure() { + let mut mock_cende_context = MockCendeContext::new(); + mock_cende_context.expect_write_prev_height_blob().times(1).returning(|_height| { + let (sender, receiver) = oneshot::channel(); + sender.send(false).unwrap(); + receiver + }); + + let (fin_receiver, _network) = build_proposal_setup(mock_cende_context).await; + + assert_eq!(fin_receiver.await, Err(oneshot::Canceled)); +} + +#[tokio::test] +async fn build_proposal_cende_incomplete() { + let mut mock_cende_context = MockCendeContext::new(); + let (sender, receiver) = oneshot::channel(); + mock_cende_context.expect_write_prev_height_blob().times(1).return_once(|_height| receiver); + + let (fin_receiver, _network) = build_proposal_setup(mock_cende_context).await; + + assert_eq!(fin_receiver.await, Err(oneshot::Canceled)); + drop(sender); +} diff --git a/crates/starknet_api/Cargo.toml b/crates/starknet_api/Cargo.toml index 7efd7a2610b..da5b8915e30 100644 --- a/crates/starknet_api/Cargo.toml +++ b/crates/starknet_api/Cargo.toml @@ -7,7 +7,7 @@ license-file.workspace = true description = "Starknet Rust types related to computation and execution." [features] -testing = ["infra_utils"] +testing = ["starknet_infra_utils"] [dependencies] bitvec.workspace = true @@ -16,9 +16,9 @@ cairo-lang-starknet-classes.workspace = true derive_more.workspace = true hex.workspace = true indexmap = { workspace = true, features = ["serde"] } -infra_utils = { workspace = true, optional = true } itertools.workspace = true num-bigint.workspace = true +num-traits.workspace = true pretty_assertions.workspace = true primitive-types = { workspace = true, features = ["serde"] } semver.workspace = true @@ -27,6 +27,7 @@ serde_json.workspace = true sha3.workspace = true starknet-crypto.workspace = true starknet-types-core = { workspace = true, features = ["hash"] } +starknet_infra_utils = { workspace = true, optional = true } strum.workspace = true strum_macros.workspace = true thiserror.workspace = true @@ -34,7 +35,7 @@ thiserror.workspace = true [dev-dependencies] assert_matches.workspace = true rstest.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +starknet_api = { path = ".", features = ["testing"] } [lints] workspace = true diff --git a/crates/starknet_api/src/contract_class.rs b/crates/starknet_api/src/contract_class.rs index c8a295d57aa..4d4b742883f 100644 --- a/crates/starknet_api/src/contract_class.rs +++ b/crates/starknet_api/src/contract_class.rs @@ -30,25 +30,27 @@ pub enum EntryPointType { L1Handler, } +pub type VersionedCasm = (CasmContractClass, SierraVersion); + /// Represents a raw Starknet contract class. #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, derive_more::From)] pub enum ContractClass { V0(DeprecatedContractClass), - V1(CasmContractClass), + V1(VersionedCasm), } impl ContractClass { pub fn compiled_class_hash(&self) -> CompiledClassHash { match self { ContractClass::V0(_) => panic!("Cairo 0 doesn't have compiled class hash."), - ContractClass::V1(casm_contract_class) => { + ContractClass::V1((casm_contract_class, _sierra_version)) => { CompiledClassHash(casm_contract_class.compiled_class_hash()) } } } } -#[derive(Deref, Serialize, Deserialize, Clone, Debug, Eq, PartialEq)] +#[derive(Deref, Serialize, Deserialize, Clone, Debug, Eq, PartialEq, PartialOrd)] pub struct SierraVersion(Version); impl SierraVersion { @@ -116,6 +118,12 @@ impl FromStr for SierraVersion { } } +impl From<(u64, u64, u64)> for SierraVersion { + fn from((major, minor, patch): (u64, u64, u64)) -> Self { + Self::new(major, minor, patch) + } +} + /// All relevant information about a declared contract class, including the compiled contract class /// and other parameters derived from the original declare transaction required for billing. #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] @@ -132,7 +140,7 @@ impl ClassInfo { pub fn bytecode_length(&self) -> usize { match &self.contract_class { ContractClass::V0(contract_class) => contract_class.bytecode_length(), - ContractClass::V1(contract_class) => contract_class.bytecode.len(), + ContractClass::V1((contract_class, _sierra_version)) => contract_class.bytecode.len(), } } diff --git a/crates/starknet_api/src/core.rs b/crates/starknet_api/src/core.rs index 8b1a0554624..f75d0689b8e 100644 --- a/crates/starknet_api/src/core.rs +++ b/crates/starknet_api/src/core.rs @@ -5,6 +5,7 @@ mod core_test; use std::fmt::Debug; use std::sync::LazyLock; +use num_traits::ToPrimitive; use primitive_types::H160; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use starknet_types_core::felt::{Felt, NonZeroFelt}; @@ -23,6 +24,12 @@ pub fn ascii_as_felt(ascii_str: &str) -> Result { }) } +pub fn felt_to_u128(felt: &Felt) -> Result { + felt.to_u128().ok_or(StarknetApiError::OutOfRange { + string: format!("Felt {} is too big to convert to 'u128'", *felt,), + }) +} + /// A chain id. #[derive(Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord)] pub enum ChainId { @@ -354,9 +361,17 @@ pub const PATRICIA_KEY_UPPER_BOUND: &str = "0x800000000000000000000000000000000000000000000000000000000000000"; impl PatriciaKey { + pub const ZERO: Self = Self(StarkHash::ZERO); + pub const ONE: Self = Self(StarkHash::ONE); + pub const TWO: Self = Self(StarkHash::TWO); + pub fn key(&self) -> &StarkHash { &self.0 } + + pub const fn from_hex_unchecked(val: &str) -> Self { + Self(StarkHash::from_hex_unchecked(val)) + } } impl From for PatriciaKey { diff --git a/crates/starknet_api/src/core_test.rs b/crates/starknet_api/src/core_test.rs index 81221cce446..0443f9ffb48 100644 --- a/crates/starknet_api/src/core_test.rs +++ b/crates/starknet_api/src/core_test.rs @@ -1,10 +1,12 @@ use assert_matches::assert_matches; +use num_bigint::BigUint; use starknet_types_core::felt::Felt; use starknet_types_core::hash::{Pedersen, StarkHash as CoreStarkHash}; use crate::core::{ ascii_as_felt, calculate_contract_address, + felt_to_u128, ChainId, ContractAddress, EthAddress, @@ -111,3 +113,21 @@ fn test_ascii_as_felt() { let expected_sn_main = Felt::from(23448594291968334_u128); assert_eq!(sn_main_felt, expected_sn_main); } + +#[test] +fn test_value_too_large_for_type() { + // Happy flow. + let n = 1991_u128; + let n_as_felt = Felt::from(n); + felt_to_u128(&n_as_felt).unwrap(); + + // Value too large for type. + let overflowed_u128: BigUint = BigUint::from(1_u8) << 128; + let overflowed_u128_as_felt = Felt::from(overflowed_u128); + let error = felt_to_u128(&overflowed_u128_as_felt).unwrap_err(); + assert_eq!( + format!("{error}"), + "Out of range Felt 340282366920938463463374607431768211456 is too big to convert to \ + 'u128'." + ); +} diff --git a/crates/starknet_api/src/execution_resources.rs b/crates/starknet_api/src/execution_resources.rs index 63577a1cce0..21a573f2743 100644 --- a/crates/starknet_api/src/execution_resources.rs +++ b/crates/starknet_api/src/execution_resources.rs @@ -9,13 +9,17 @@ use crate::transaction::fields::{Fee, Resource}; #[cfg_attr( any(test, feature = "testing"), - derive(derive_more::Sum, derive_more::Div, derive_more::SubAssign) + derive( + derive_more::Sum, + derive_more::Div, + derive_more::SubAssign, + derive_more::Sub, + derive_more::Add, + derive_more::AddAssign, + ) )] #[derive( derive_more::Display, - derive_more::Sub, - derive_more::Add, - derive_more::AddAssign, Clone, Copy, Debug, @@ -158,48 +162,49 @@ impl GasVector { } sum } +} - /// Compute l1_gas estimation from gas_vector using the following formula: - /// One byte of data costs either 1 data gas (in blob mode) or 16 gas (in calldata - /// mode). For gas price GP and data gas price DGP, the discount for using blobs - /// would be DGP / (16 * GP). - /// X non-data-related gas consumption and Y bytes of data, in non-blob mode, would - /// cost (X + 16*Y) units of gas. Applying the discount ratio to the data-related - /// summand, we get total_gas = (X + Y * DGP / GP). - /// If this function is called with kzg_flag==false, then l1_data_gas==0, and this discount - /// function does nothing. - /// Panics on overflow. - pub fn to_discounted_l1_gas(&self, gas_prices: &GasPriceVector) -> GasAmount { - if self.l2_gas.0 > 0 { - // TODO(Yoni, 10/12/2024): convert L2 gas as well. - todo!(); - } - let l1_data_gas_fee = self - .l1_data_gas - .checked_mul(gas_prices.l1_data_gas_price.into()) - .unwrap_or_else(|| { - panic!( - "Discounted L1 gas cost overflowed: multiplication of L1 data gas ({}) by L1 \ - data gas price ({}) resulted in overflow.", - self.l1_data_gas, gas_prices.l1_data_gas_price - ); - }); - let l1_data_gas_in_l1_gas_units = - l1_data_gas_fee.checked_div_ceil(gas_prices.l1_gas_price).unwrap_or_else(|| { - panic!( - "Discounted L1 gas cost overflowed: division of L1 data fee ({}) by regular \ - L1 gas price ({}) resulted in overflow.", - l1_data_gas_fee, gas_prices.l1_gas_price - ); - }); - self.l1_gas.checked_add(l1_data_gas_in_l1_gas_units).unwrap_or_else(|| { +/// Computes the total L1 gas amount estimation from the different given L1 gas arguments using the +/// following formula: +/// One byte of data costs either 1 data gas (in blob mode) or 16 gas (in calldata +/// mode). For gas price GP and data gas price DGP, the discount for using blobs +/// would be DGP / (16 * GP). +/// X non-data-related gas consumption and Y bytes of data, in non-blob mode, would +/// cost (X + 16*Y) units of gas. Applying the discount ratio to the data-related +/// summand, we get total_gas = (X + Y * DGP / GP). +/// If this function is called with kzg_flag==false, then l1_data_gas==0, and this discount +/// function does nothing. +/// Panics on overflow. +/// Does not take L2 gas into account - more context is required to convert L2 gas units to L1 gas +/// units (context defined outside of the current crate). +pub fn to_discounted_l1_gas( + l1_gas_price: NonzeroGasPrice, + l1_data_gas_price: GasPrice, + l1_gas: GasAmount, + l1_data_gas: GasAmount, +) -> GasAmount { + let l1_data_gas_fee = l1_data_gas.checked_mul(l1_data_gas_price).unwrap_or_else(|| { + panic!( + "Discounted L1 gas cost overflowed: multiplication of L1 data gas ({}) by L1 data gas \ + price ({}) resulted in overflow.", + l1_data_gas, l1_data_gas_price + ); + }); + let l1_data_gas_in_l1_gas_units = + l1_data_gas_fee.checked_div_ceil(l1_gas_price).unwrap_or_else(|| { panic!( - "Overflow while computing discounted L1 gas: L1 gas ({}) + L1 data gas in L1 gas \ - units ({}) resulted in overflow.", - self.l1_gas, l1_data_gas_in_l1_gas_units - ) - }) - } + "Discounted L1 gas cost overflowed: division of L1 data fee ({}) by regular L1 \ + gas price ({}) resulted in overflow.", + l1_data_gas_fee, l1_gas_price + ); + }); + l1_gas.checked_add(l1_data_gas_in_l1_gas_units).unwrap_or_else(|| { + panic!( + "Overflow while computing discounted L1 gas: L1 gas ({}) + L1 data gas in L1 gas \ + units ({}) resulted in overflow.", + l1_gas, l1_data_gas_in_l1_gas_units + ) + }) } /// The execution resources used by a transaction. diff --git a/crates/starknet_api/src/rpc_transaction_test.rs b/crates/starknet_api/src/rpc_transaction_test.rs index 7854a5d9297..51eca7e25a2 100644 --- a/crates/starknet_api/src/rpc_transaction_test.rs +++ b/crates/starknet_api/src/rpc_transaction_test.rs @@ -1,25 +1,17 @@ -use std::sync::Arc; - use rstest::rstest; use starknet_types_core::felt::Felt; use crate::block::GasPrice; use crate::core::CompiledClassHash; use crate::execution_resources::GasAmount; -use crate::rpc_transaction::{ - DataAvailabilityMode, - RpcDeclareTransaction, - RpcDeclareTransactionV3, - RpcDeployAccountTransaction, - RpcDeployAccountTransactionV3, - RpcTransaction, -}; +use crate::rpc_transaction::{DataAvailabilityMode, RpcTransaction}; use crate::state::SierraContractClass; +use crate::test_utils::declare::{rpc_declare_tx, DeclareTxArgs}; +use crate::test_utils::deploy_account::{rpc_deploy_account_tx, DeployAccountTxArgs}; use crate::test_utils::invoke::{rpc_invoke_tx, InvokeTxArgs}; use crate::transaction::fields::{ AccountDeploymentData, AllResourceBounds, - Calldata, ContractAddressSalt, PaymasterData, ResourceBounds, @@ -38,38 +30,41 @@ fn create_resource_bounds_for_testing() -> AllResourceBounds { } } -fn create_declare_v3() -> RpcDeclareTransaction { - RpcDeclareTransaction::V3(RpcDeclareTransactionV3 { - contract_class: SierraContractClass::default(), - resource_bounds: create_resource_bounds_for_testing(), - tip: Tip(1), - signature: TransactionSignature(vec![Felt::ONE, Felt::TWO]), - nonce: nonce!(1), - compiled_class_hash: CompiledClassHash(Felt::TWO), - sender_address: contract_address!("0x3"), - nonce_data_availability_mode: DataAvailabilityMode::L1, - fee_data_availability_mode: DataAvailabilityMode::L2, - paymaster_data: PaymasterData(vec![Felt::ZERO]), - account_deployment_data: AccountDeploymentData(vec![Felt::THREE]), - }) +fn create_declare_tx() -> RpcTransaction { + rpc_declare_tx( + DeclareTxArgs { + resource_bounds: ValidResourceBounds::AllResources(create_resource_bounds_for_testing()), + tip: Tip(1), + signature: TransactionSignature(vec![felt!("0x1"), felt!("0x2")]), + sender_address: contract_address!("0x3"), + nonce: nonce!(1), + paymaster_data: PaymasterData(vec![felt!("0x0")]), + account_deployment_data: AccountDeploymentData(vec![felt!("0x3")]), + nonce_data_availability_mode: DataAvailabilityMode::L1, + fee_data_availability_mode: DataAvailabilityMode::L2, + compiled_class_hash: CompiledClassHash(felt!("0x2")), + ..Default::default() + }, + SierraContractClass::default(), + ) } -fn create_deploy_account_v3() -> RpcDeployAccountTransaction { - RpcDeployAccountTransaction::V3(RpcDeployAccountTransactionV3 { - resource_bounds: create_resource_bounds_for_testing(), - tip: Tip::default(), - contract_address_salt: ContractAddressSalt(felt!("0x23")), +fn create_deploy_account_tx() -> RpcTransaction { + rpc_deploy_account_tx(DeployAccountTxArgs { + resource_bounds: ValidResourceBounds::AllResources(create_resource_bounds_for_testing()), + contract_address_salt: ContractAddressSalt(felt!("0x1")), class_hash: class_hash!("0x2"), - constructor_calldata: Calldata(Arc::new(vec![Felt::ZERO])), - nonce: nonce!(60), - signature: TransactionSignature(vec![Felt::TWO]), + constructor_calldata: calldata![felt!("0x1")], + nonce: nonce!(1), + signature: TransactionSignature(vec![felt!("0x1")]), nonce_data_availability_mode: DataAvailabilityMode::L2, fee_data_availability_mode: DataAvailabilityMode::L1, - paymaster_data: PaymasterData(vec![Felt::TWO, Felt::ZERO]), + paymaster_data: PaymasterData(vec![felt!("0x2"), felt!("0x0")]), + ..Default::default() }) } -fn create_rpc_invoke_tx() -> RpcTransaction { +fn create_invoke_tx() -> RpcTransaction { rpc_invoke_tx(InvokeTxArgs { resource_bounds: ValidResourceBounds::AllResources(create_resource_bounds_for_testing()), calldata: calldata![felt!("0x1"), felt!("0x2")], @@ -83,9 +78,9 @@ fn create_rpc_invoke_tx() -> RpcTransaction { // Test the custom serde/deserde of RPC transactions. #[rstest] -#[case(RpcTransaction::Declare(create_declare_v3()))] -#[case(RpcTransaction::DeployAccount(create_deploy_account_v3()))] -#[case(create_rpc_invoke_tx())] +#[case(create_declare_tx())] +#[case(create_deploy_account_tx())] +#[case(create_invoke_tx())] fn test_rpc_transactions(#[case] tx: RpcTransaction) { let serialized = serde_json::to_string(&tx).unwrap(); let deserialized: RpcTransaction = serde_json::from_str(&serialized).unwrap(); diff --git a/crates/starknet_api/src/state.rs b/crates/starknet_api/src/state.rs index 782db70fad2..bb19154fea5 100644 --- a/crates/starknet_api/src/state.rs +++ b/crates/starknet_api/src/state.rs @@ -247,7 +247,7 @@ impl From for Sierra } } -/// An entry point of a [ContractClass](`crate::state::ContractClass`). +/// An entry point of a [SierraContractClass](`SierraContractClass`). #[derive(Debug, Default, Clone, Eq, PartialEq, Hash, Deserialize, Serialize, PartialOrd, Ord)] pub struct EntryPoint { pub function_idx: FunctionIndex, diff --git a/crates/starknet_api/src/test_utils.rs b/crates/starknet_api/src/test_utils.rs index 1d114beecdc..8f7cb77d9f7 100644 --- a/crates/starknet_api/src/test_utils.rs +++ b/crates/starknet_api/src/test_utils.rs @@ -2,14 +2,25 @@ use std::collections::HashMap; use std::fs::read_to_string; use std::path::{Path, PathBuf}; -use infra_utils::path::current_dir; use serde::{Deserialize, Serialize}; use serde_json::to_string_pretty; +use starknet_infra_utils::path::current_dir; use starknet_types_core::felt::Felt; -use crate::block::BlockNumber; +use crate::block::{ + BlockInfo, + BlockNumber, + BlockTimestamp, + GasPrice, + GasPriceVector, + GasPrices, + NonzeroGasPrice, +}; +use crate::contract_address; use crate::core::{ChainId, ContractAddress, Nonce}; +use crate::execution_resources::GasAmount; use crate::rpc_transaction::RpcTransaction; +use crate::transaction::fields::Fee; use crate::transaction::{Transaction, TransactionHash}; pub mod declare; @@ -17,6 +28,21 @@ pub mod deploy_account; pub mod invoke; pub mod l1_handler; +// TODO(Dori, 1/2/2024): Remove these constants once all tests use the `contracts` and +// `initial_test_state` modules for testing. +// Addresses. +pub const TEST_SEQUENCER_ADDRESS: &str = "0x1000"; +pub const TEST_ERC20_CONTRACT_ADDRESS: &str = "0x1001"; +pub const TEST_ERC20_CONTRACT_ADDRESS2: &str = "0x1002"; + +// The block number of the BlockContext being used for testing. +pub const CURRENT_BLOCK_NUMBER: u64 = 2001; +pub const CURRENT_BLOCK_NUMBER_FOR_VALIDATE: u64 = 2000; + +// The block timestamp of the BlockContext being used for testing. +pub const CURRENT_BLOCK_TIMESTAMP: u64 = 1072023; +pub const CURRENT_BLOCK_TIMESTAMP_FOR_VALIDATE: u64 = 1069200; + /// Returns the path to a file in the resources directory. This assumes the current working /// directory has a `resources` folder. The value for file_path should be the path to the required /// file in the folder "resources". @@ -113,3 +139,56 @@ pub fn rpc_tx_to_json(tx: &RpcTransaction) -> String { // Serialize back to pretty JSON string to_string_pretty(&tx_json).expect("Failed to serialize transaction") } + +// V3 transactions: +pub const DEFAULT_L1_GAS_AMOUNT: GasAmount = GasAmount(u64::pow(10, 6)); +pub const DEFAULT_L1_DATA_GAS_MAX_AMOUNT: GasAmount = GasAmount(u64::pow(10, 6)); +pub const DEFAULT_L2_GAS_MAX_AMOUNT: GasAmount = GasAmount(u64::pow(10, 9)); +pub const MAX_L1_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L1_GAS_PRICE; +pub const MAX_L2_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L2_GAS_PRICE; +pub const MAX_L1_DATA_GAS_PRICE: NonzeroGasPrice = DEFAULT_STRK_L1_DATA_GAS_PRICE; + +pub const DEFAULT_ETH_L1_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(100 * u128::pow(10, 9))); // Given in units of Wei. +pub const DEFAULT_STRK_L1_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(100 * u128::pow(10, 9))); // Given in units of Fri. +pub const DEFAULT_ETH_L1_DATA_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 6))); // Given in units of Wei. +pub const DEFAULT_STRK_L1_DATA_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 9))); // Given in units of Fri. +pub const DEFAULT_ETH_L2_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 6))); +pub const DEFAULT_STRK_L2_GAS_PRICE: NonzeroGasPrice = + NonzeroGasPrice::new_unchecked(GasPrice(u128::pow(10, 9))); + +pub const DEFAULT_GAS_PRICES: GasPrices = GasPrices { + eth_gas_prices: GasPriceVector { + l1_gas_price: DEFAULT_ETH_L1_GAS_PRICE, + l2_gas_price: DEFAULT_ETH_L2_GAS_PRICE, + l1_data_gas_price: DEFAULT_ETH_L1_DATA_GAS_PRICE, + }, + strk_gas_prices: GasPriceVector { + l1_gas_price: DEFAULT_STRK_L1_GAS_PRICE, + l2_gas_price: DEFAULT_STRK_L2_GAS_PRICE, + l1_data_gas_price: DEFAULT_STRK_L1_DATA_GAS_PRICE, + }, +}; + +// Deprecated transactions: +pub const MAX_FEE: Fee = DEFAULT_L1_GAS_AMOUNT.nonzero_saturating_mul(DEFAULT_ETH_L1_GAS_PRICE); + +impl BlockInfo { + pub fn create_for_testing() -> Self { + Self { + block_number: BlockNumber(CURRENT_BLOCK_NUMBER), + block_timestamp: BlockTimestamp(CURRENT_BLOCK_TIMESTAMP), + sequencer_address: contract_address!(TEST_SEQUENCER_ADDRESS), + gas_prices: DEFAULT_GAS_PRICES, + use_kzg_da: false, + } + } + + pub fn create_for_testing_with_kzg(use_kzg_da: bool) -> Self { + Self { use_kzg_da, ..Self::create_for_testing() } + } +} diff --git a/crates/starknet_api/src/test_utils/l1_handler.rs b/crates/starknet_api/src/test_utils/l1_handler.rs index 0610ac8711a..9177d19784d 100644 --- a/crates/starknet_api/src/test_utils/l1_handler.rs +++ b/crates/starknet_api/src/test_utils/l1_handler.rs @@ -1,11 +1,10 @@ use crate::core::{ContractAddress, EntryPointSelector, Nonce}; use crate::executable_transaction::L1HandlerTransaction as ExecutableL1HandlerTransaction; use crate::transaction::fields::{Calldata, Fee}; -use crate::transaction::{L1HandlerTransaction, TransactionHash, TransactionVersion}; +use crate::transaction::{L1HandlerTransaction, TransactionHash}; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct L1HandlerTxArgs { - pub version: TransactionVersion, pub nonce: Nonce, pub contract_address: ContractAddress, pub entry_point_selector: EntryPointSelector, @@ -14,20 +13,6 @@ pub struct L1HandlerTxArgs { pub paid_fee_on_l1: Fee, } -impl Default for L1HandlerTxArgs { - fn default() -> Self { - L1HandlerTxArgs { - version: TransactionVersion::THREE, - nonce: Nonce::default(), - contract_address: ContractAddress::default(), - entry_point_selector: EntryPointSelector::default(), - calldata: Calldata::default(), - tx_hash: TransactionHash::default(), - paid_fee_on_l1: Fee::default(), - } - } -} - /// Utility macro for creating `L1HandlerTransaction` to reduce boilerplate. #[macro_export] macro_rules! l1_handler_tx_args { @@ -50,7 +35,7 @@ pub fn executable_l1_handler_tx( ) -> ExecutableL1HandlerTransaction { ExecutableL1HandlerTransaction { tx: L1HandlerTransaction { - version: l1_handler_tx_args.version, + version: L1HandlerTransaction::VERSION, nonce: l1_handler_tx_args.nonce, contract_address: l1_handler_tx_args.contract_address, entry_point_selector: l1_handler_tx_args.entry_point_selector, diff --git a/crates/starknet_api/src/transaction.rs b/crates/starknet_api/src/transaction.rs index b2bf7e3808c..36980ca362a 100644 --- a/crates/starknet_api/src/transaction.rs +++ b/crates/starknet_api/src/transaction.rs @@ -685,6 +685,12 @@ pub struct L1HandlerTransaction { pub calldata: Calldata, } +impl L1HandlerTransaction { + /// The transaction version is considered 0 for L1-Handler transaction for hash calculation + /// purposes. + pub const VERSION: TransactionVersion = TransactionVersion::ZERO; +} + impl TransactionHasher for L1HandlerTransaction { fn calculate_transaction_hash( &self, diff --git a/crates/starknet_api/src/transaction/fields.rs b/crates/starknet_api/src/transaction/fields.rs index 5e1df8e112f..d5f45c3ee03 100644 --- a/crates/starknet_api/src/transaction/fields.rs +++ b/crates/starknet_api/src/transaction/fields.rs @@ -162,6 +162,7 @@ pub enum Resource { #[serde(rename = "L2_GAS")] L2Gas, #[serde(rename = "L1_DATA")] + #[serde(alias = "L1_DATA_GAS")] L1DataGas, } diff --git a/crates/starknet_batcher/Cargo.toml b/crates/starknet_batcher/Cargo.toml index 68d0c13c025..cffc6ae3b09 100644 --- a/crates/starknet_batcher/Cargo.toml +++ b/crates/starknet_batcher/Cargo.toml @@ -32,10 +32,10 @@ validator.workspace = true assert_matches.workspace = true chrono = { workspace = true } futures.workspace = true -mempool_test_utils.workspace = true +mempool_test_utils.path = "../mempool_test_utils" mockall.workspace = true rstest.workspace = true starknet-types-core.workspace = true -starknet_api = { workspace = true, features = ["testing"] } -starknet_l1_provider_types = { workspace = true, features = ["testing"] } -starknet_mempool_types = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } +starknet_l1_provider_types = { path = "../starknet_l1_provider_types", features = ["testing"] } +starknet_mempool_types = { path = "../starknet_mempool_types", features = ["testing"] } diff --git a/crates/starknet_batcher/src/batcher.rs b/crates/starknet_batcher/src/batcher.rs index 950ddce4f0a..796582e7b47 100644 --- a/crates/starknet_batcher/src/batcher.rs +++ b/crates/starknet_batcher/src/batcher.rs @@ -1,7 +1,7 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; -use blockifier::state::global_cache::GlobalContractCache; +use blockifier::state::contract_class_manager::ContractClassManager; #[cfg(test)] use mockall::automock; use papyrus_storage::state::{StateStorageReader, StateStorageWriter}; @@ -34,16 +34,18 @@ use starknet_mempool_types::communication::SharedMempoolClient; use starknet_mempool_types::mempool_types::CommitBlockArgs; use starknet_sequencer_infra::component_definitions::ComponentStarter; use starknet_state_sync_types::state_sync_types::SyncBlock; -use tracing::{debug, error, info, instrument, trace}; +use tokio::sync::Mutex; +use tracing::{debug, error, info, instrument, trace, Instrument}; use crate::block_builder::{ + BlockBuilderError, BlockBuilderExecutionParams, BlockBuilderFactory, BlockBuilderFactoryTrait, + BlockBuilderTrait, BlockMetadata, }; use crate::config::BatcherConfig; -use crate::proposal_manager::{GenerateProposalError, ProposalManager, ProposalManagerTrait}; use crate::transaction_provider::{ProposeTransactionProvider, ValidateTransactionProvider}; use crate::utils::{ deadline_as_instant, @@ -51,6 +53,7 @@ use crate::utils::{ verify_block_input, ProposalOutput, ProposalResult, + ProposalTask, }; type OutputStreamReceiver = tokio::sync::mpsc::UnboundedReceiver; @@ -63,11 +66,30 @@ pub struct Batcher { pub l1_provider_client: SharedL1ProviderClient, pub mempool_client: SharedMempoolClient, + // Used to create block builders. + // Using the factory pattern to allow for easier testing. + block_builder_factory: Box, + + // The height that the batcher is currently working on. + // All proposals are considered to be at this height. active_height: Option, - proposal_manager: Box, - block_builder_factory: Box, + // The block proposal that is currently being built, if any. + // At any given time, there can be only one proposal being actively executed (either proposed + // or validated). + active_proposal: Arc>>, + active_proposal_task: Option, + + // Holds all the proposals that completed execution in the current height. + executed_proposals: Arc>>>, + + // The propose blocks transaction streams, used to stream out the proposal transactions. + // Each stream is kept until all the transactions are streamed out, or a new height is started. propose_tx_streams: HashMap, + + // The validate blocks transaction streams, used to stream in the transactions to validate. + // Each stream is kept until SendProposalContent::Finish/Abort is received, or a new height is + // started. validate_tx_streams: HashMap, } @@ -79,7 +101,6 @@ impl Batcher { l1_provider_client: SharedL1ProviderClient, mempool_client: SharedMempoolClient, block_builder_factory: Box, - proposal_manager: Box, ) -> Self { Self { config: config.clone(), @@ -87,9 +108,11 @@ impl Batcher { storage_writer, l1_provider_client, mempool_client, - active_height: None, block_builder_factory, - proposal_manager, + active_height: None, + active_proposal: Arc::new(Mutex::new(None)), + active_proposal_task: None, + executed_proposals: Arc::new(Mutex::new(HashMap::new())), propose_tx_streams: HashMap::new(), validate_tx_streams: HashMap::new(), } @@ -135,6 +158,8 @@ impl Batcher { propose_block_input.retrospective_block_hash, )?; + self.set_active_proposal(propose_block_input.proposal_id).await?; + let tx_provider = ProposeTransactionProvider::new( self.mempool_client.clone(), self.l1_provider_client.clone(), @@ -160,8 +185,7 @@ impl Batcher { ) .map_err(|_| BatcherError::InternalError)?; - self.proposal_manager - .spawn_proposal(propose_block_input.proposal_id, block_builder, abort_signal_sender) + self.spawn_proposal(propose_block_input.proposal_id, block_builder, abort_signal_sender) .await?; self.propose_tx_streams.insert(propose_block_input.proposal_id, output_tx_receiver); @@ -180,6 +204,8 @@ impl Batcher { validate_block_input.retrospective_block_hash, )?; + self.set_active_proposal(validate_block_input.proposal_id).await?; + // A channel to send the transactions to include in the block being validated. let (input_tx_sender, input_tx_receiver) = tokio::sync::mpsc::channel(self.config.input_stream_content_buffer_size); @@ -205,8 +231,7 @@ impl Batcher { ) .map_err(|_| BatcherError::InternalError)?; - self.proposal_manager - .spawn_proposal(validate_block_input.proposal_id, block_builder, abort_signal_sender) + self.spawn_proposal(validate_block_input.proposal_id, block_builder, abort_signal_sender) .await?; self.validate_tx_streams.insert(validate_block_input.proposal_id, input_tx_sender); @@ -234,7 +259,8 @@ impl Batcher { /// Clear all the proposals from the previous height. async fn abort_active_height(&mut self) { - self.proposal_manager.reset().await; + self.abort_active_proposal().await; + self.executed_proposals.lock().await.clear(); self.propose_tx_streams.clear(); self.validate_tx_streams.clear(); } @@ -263,7 +289,7 @@ impl Batcher { let proposal_result = self.get_completed_proposal_result(proposal_id).await.expect("Proposal should exist."); match proposal_result { - Ok(_) => Err(BatcherError::ProposalAlreadyFinished { proposal_id }), + Ok(_) => panic!("Proposal finished validation before all transactions were sent."), Err(err) => Ok(SendProposalContentResponse { response: proposal_status_from(err)? }), } } @@ -274,9 +300,9 @@ impl Batcher { ) -> BatcherResult { debug!("Send proposal content done for {}", proposal_id); - self.close_input_transaction_stream(proposal_id)?; + self.validate_tx_streams.remove(&proposal_id).expect("validate tx stream should exist."); if self.is_active(proposal_id).await { - self.proposal_manager.await_active_proposal().await; + self.await_active_proposal().await; } let proposal_result = @@ -292,18 +318,17 @@ impl Batcher { &mut self, proposal_id: ProposalId, ) -> BatcherResult { - self.proposal_manager.abort_proposal(proposal_id).await; - self.close_input_transaction_stream(proposal_id)?; + if self.is_active(proposal_id).await { + self.abort_active_proposal().await; + self.executed_proposals + .lock() + .await + .insert(proposal_id, Err(Arc::new(BlockBuilderError::Aborted))); + } + self.validate_tx_streams.remove(&proposal_id); Ok(SendProposalContentResponse { response: ProposalStatus::Aborted }) } - fn close_input_transaction_stream(&mut self, proposal_id: ProposalId) -> BatcherResult<()> { - self.validate_tx_streams - .remove(&proposal_id) - .ok_or(BatcherError::ProposalNotFound { proposal_id })?; - Ok(()) - } - fn get_height_from_storage(&mut self) -> BatcherResult { self.storage_reader.height().map_err(|err| { error!("Failed to get height from storage: {}", err); @@ -360,12 +385,18 @@ impl Batcher { self.active_height = None; } - let SyncBlock { state_diff, transaction_hashes } = sync_block; + let SyncBlock { state_diff, transaction_hashes, block_number } = sync_block; let address_to_nonce = state_diff.nonces.iter().map(|(k, v)| (*k, *v)).collect(); let tx_hashes = transaction_hashes.into_iter().collect(); + let height = self.get_height_from_storage()?; + if height != block_number { + panic!( + "Synced block height {} does not match the current height {}.", + block_number, height + ); + } - // TODO(Arni): Assert the input `sync_block` corresponds to this `height`. - self.commit_proposal_and_block(state_diff, address_to_nonce, tx_hashes).await + self.commit_proposal_and_block(height, state_diff, address_to_nonce, tx_hashes).await } #[instrument(skip(self), err)] @@ -373,45 +404,103 @@ impl Batcher { &mut self, input: DecisionReachedInput, ) -> BatcherResult { + let height = self.active_height.ok_or(BatcherError::NoActiveHeight)?; + let proposal_id = input.proposal_id; - let proposal_output = self - .proposal_manager - .take_proposal_result(proposal_id) - .await - .ok_or(BatcherError::ExecutedProposalNotFound { proposal_id })? - .map_err(|_| BatcherError::InternalError)?; + let proposal_result = self.executed_proposals.lock().await.remove(&proposal_id); let ProposalOutput { state_diff, nonces: address_to_nonce, tx_hashes, .. } = - proposal_output; + proposal_result + .ok_or(BatcherError::ExecutedProposalNotFound { proposal_id })? + .map_err(|_| BatcherError::InternalError)?; - self.commit_proposal_and_block(state_diff.clone(), address_to_nonce, tx_hashes).await?; + self.commit_proposal_and_block(height, state_diff.clone(), address_to_nonce, tx_hashes) + .await?; Ok(DecisionReachedResponse { state_diff }) } async fn commit_proposal_and_block( &mut self, + height: BlockNumber, state_diff: ThinStateDiff, address_to_nonce: HashMap, tx_hashes: HashSet, ) -> BatcherResult<()> { - // TODO: Keep the height from start_height or get it from the input. - let height = self.get_height_from_storage()?; info!("Committing block at height {} and notifying mempool of the block.", height); trace!("Transactions: {:#?}, State diff: {:#?}.", tx_hashes, state_diff); + + // Commit the proposal to the storage and notify the mempool. self.storage_writer.commit_proposal(height, state_diff).map_err(|err| { error!("Failed to commit proposal to storage: {}", err); BatcherError::InternalError })?; - if let Err(mempool_err) = - self.mempool_client.commit_block(CommitBlockArgs { address_to_nonce, tx_hashes }).await - { + let mempool_result = + self.mempool_client.commit_block(CommitBlockArgs { address_to_nonce, tx_hashes }).await; + + if let Err(mempool_err) = mempool_result { error!("Failed to commit block to mempool: {}", mempool_err); // TODO: Should we rollback the state diff and return an error? - } + }; + Ok(()) } async fn is_active(&self, proposal_id: ProposalId) -> bool { - self.proposal_manager.get_active_proposal().await == Some(proposal_id) + *self.active_proposal.lock().await == Some(proposal_id) + } + + // Sets a new active proposal task. + // Fails if there is another proposal being currently generated, or a proposal with the same ID + // already exists. + async fn set_active_proposal(&mut self, proposal_id: ProposalId) -> BatcherResult<()> { + if self.executed_proposals.lock().await.contains_key(&proposal_id) { + return Err(BatcherError::ProposalAlreadyExists { proposal_id }); + } + + let mut active_proposal = self.active_proposal.lock().await; + if let Some(active_proposal_id) = *active_proposal { + return Err(BatcherError::ServerBusy { + active_proposal_id, + new_proposal_id: proposal_id, + }); + } + + debug!("Set proposal {} as the one being generated.", proposal_id); + *active_proposal = Some(proposal_id); + Ok(()) + } + + // Starts a new block proposal generation task for the given proposal_id. + // Uses the given block_builder to generate the proposal. + async fn spawn_proposal( + &mut self, + proposal_id: ProposalId, + mut block_builder: Box, + abort_signal_sender: tokio::sync::oneshot::Sender<()>, + ) -> BatcherResult<()> { + info!("Starting generation of a new proposal with id {}.", proposal_id); + + let active_proposal = self.active_proposal.clone(); + let executed_proposals = self.executed_proposals.clone(); + + let join_handle = tokio::spawn( + async move { + let result = + block_builder.build_block().await.map(ProposalOutput::from).map_err(Arc::new); + + // The proposal is done, clear the active proposal. + // Keep the proposal result only if it is the same as the active proposal. + // The active proposal might have changed if this proposal was aborted. + let mut active_proposal = active_proposal.lock().await; + if *active_proposal == Some(proposal_id) { + active_proposal.take(); + executed_proposals.lock().await.insert(proposal_id, result); + } + } + .in_current_span(), + ); + + self.active_proposal_task = Some(ProposalTask { abort_signal_sender, join_handle }); + Ok(()) } // Returns a completed proposal result, either its commitment or an error if the proposal @@ -420,8 +509,7 @@ impl Batcher { &self, proposal_id: ProposalId, ) -> Option> { - let completed_proposals = self.proposal_manager.get_completed_proposals().await; - let guard = completed_proposals.lock().await; + let guard = self.executed_proposals.lock().await; let proposal_result = guard.get(&proposal_id); match proposal_result { @@ -430,6 +518,21 @@ impl Batcher { None => None, } } + + // Ends the current active proposal. + // This call is non-blocking. + async fn abort_active_proposal(&mut self) { + self.active_proposal.lock().await.take(); + if let Some(proposal_task) = self.active_proposal_task.take() { + proposal_task.abort_signal_sender.send(()).ok(); + } + } + + pub async fn await_active_proposal(&mut self) { + if let Some(proposal_task) = self.active_proposal_task.take() { + proposal_task.join_handle.await.ok(); + } + } } pub fn create_batcher( @@ -443,11 +546,12 @@ pub fn create_batcher( let block_builder_factory = Box::new(BlockBuilderFactory { block_builder_config: config.block_builder_config.clone(), storage_reader: storage_reader.clone(), - global_class_hash_to_class: GlobalContractCache::new(config.global_contract_cache_size), + contract_class_manager: ContractClassManager::start( + config.contract_class_manager_config.clone(), + ), }); let storage_reader = Arc::new(storage_reader); let storage_writer = Box::new(storage_writer); - let proposal_manager = Box::new(ProposalManager::new()); Batcher::new( config, storage_reader, @@ -455,7 +559,6 @@ pub fn create_batcher( l1_provider_client, mempool_client, block_builder_factory, - proposal_manager, ) } @@ -491,23 +594,4 @@ impl BatcherStorageWriterTrait for papyrus_storage::StorageWriter { } } -impl From for BatcherError { - fn from(err: GenerateProposalError) -> Self { - match err { - GenerateProposalError::AlreadyGeneratingProposal { - current_generating_proposal_id, - new_proposal_id, - } => BatcherError::ServerBusy { - active_proposal_id: current_generating_proposal_id, - new_proposal_id, - }, - GenerateProposalError::BlockBuilderError(..) => BatcherError::InternalError, - GenerateProposalError::NoActiveHeight => BatcherError::NoActiveHeight, - GenerateProposalError::ProposalAlreadyExists { proposal_id } => { - BatcherError::ProposalAlreadyExists { proposal_id } - } - } - } -} - impl ComponentStarter for Batcher {} diff --git a/crates/starknet_batcher/src/batcher_test.rs b/crates/starknet_batcher/src/batcher_test.rs index d776e08abee..e6cbb72ad10 100644 --- a/crates/starknet_batcher/src/batcher_test.rs +++ b/crates/starknet_batcher/src/batcher_test.rs @@ -2,23 +2,17 @@ use std::collections::{HashMap, HashSet}; use std::sync::Arc; use assert_matches::assert_matches; -use async_trait::async_trait; use blockifier::abi::constants; -use blockifier::test_utils::struct_impls::BlockInfoExt; use chrono::Utc; -use futures::future::BoxFuture; -use futures::FutureExt; use indexmap::indexmap; -use mockall::automock; -use mockall::predicate::{always, eq}; +use mockall::predicate::eq; use rstest::rstest; use starknet_api::block::{BlockInfo, BlockNumber}; -use starknet_api::core::{ContractAddress, Nonce, StateDiffCommitment}; +use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::executable_transaction::Transaction; -use starknet_api::hash::PoseidonHash; use starknet_api::state::ThinStateDiff; use starknet_api::transaction::TransactionHash; -use starknet_api::{contract_address, felt, nonce, tx_hash}; +use starknet_api::{contract_address, nonce, tx_hash}; use starknet_batcher_types::batcher_types::{ DecisionReachedInput, GetHeightResponse, @@ -40,40 +34,35 @@ use starknet_l1_provider_types::MockL1ProviderClient; use starknet_mempool_types::communication::MockMempoolClient; use starknet_mempool_types::mempool_types::CommitBlockArgs; use starknet_state_sync_types::state_sync_types::SyncBlock; -use tokio::sync::Mutex; use crate::batcher::{Batcher, MockBatcherStorageReaderTrait, MockBatcherStorageWriterTrait}; use crate::block_builder::{ AbortSignalSender, BlockBuilderError, - BlockBuilderTrait, + BlockBuilderResult, + BlockExecutionArtifacts, FailOnErrorCause, MockBlockBuilderFactoryTrait, MockBlockBuilderTrait, }; use crate::config::BatcherConfig; -use crate::proposal_manager::{GenerateProposalError, ProposalManagerTrait}; use crate::test_utils::test_txs; use crate::transaction_provider::NextTxs; -use crate::utils::{ProposalOutput, ProposalResult}; +use crate::utils::ProposalOutput; const INITIAL_HEIGHT: BlockNumber = BlockNumber(3); const STREAMING_CHUNK_SIZE: usize = 3; const BLOCK_GENERATION_TIMEOUT: tokio::time::Duration = tokio::time::Duration::from_secs(1); const PROPOSAL_ID: ProposalId = ProposalId(0); +const BUILD_BLOCK_FAIL_ON_ERROR: BlockBuilderError = + BlockBuilderError::FailOnError(FailOnErrorCause::BlockFull); fn initial_block_info() -> BlockInfo { BlockInfo { block_number: INITIAL_HEIGHT, ..BlockInfo::create_for_testing() } } fn proposal_commitment() -> ProposalCommitment { - ProposalCommitment { - state_diff_commitment: StateDiffCommitment(PoseidonHash(felt!(u128::try_from(7).unwrap()))), - } -} - -fn proposal_output() -> ProposalOutput { - ProposalOutput { commitment: proposal_commitment(), ..Default::default() } + ProposalOutput::from(BlockExecutionArtifacts::create_for_testing()).commitment } fn deadline() -> chrono::DateTime { @@ -98,16 +87,11 @@ fn validate_block_input() -> ValidateBlockInput { } } -fn invalid_proposal_result() -> ProposalResult { - Err(Arc::new(BlockBuilderError::FailOnError(FailOnErrorCause::BlockFull))) -} - struct MockDependencies { storage_reader: MockBatcherStorageReaderTrait, storage_writer: MockBatcherStorageWriterTrait, mempool_client: MockMempoolClient, l1_provider_client: MockL1ProviderClient, - proposal_manager: MockProposalManagerTraitWrapper, block_builder_factory: MockBlockBuilderFactoryTrait, } @@ -120,7 +104,6 @@ impl Default for MockDependencies { storage_writer: MockBatcherStorageWriterTrait::new(), l1_provider_client: MockL1ProviderClient::new(), mempool_client: MockMempoolClient::new(), - proposal_manager: MockProposalManagerTraitWrapper::new(), block_builder_factory: MockBlockBuilderFactoryTrait::new(), } } @@ -134,7 +117,6 @@ fn create_batcher(mock_dependencies: MockDependencies) -> Batcher { Arc::new(mock_dependencies.l1_provider_client), Arc::new(mock_dependencies.mempool_client), Box::new(mock_dependencies.block_builder_factory), - Box::new(mock_dependencies.proposal_manager), ) } @@ -142,19 +124,25 @@ fn abort_signal_sender() -> AbortSignalSender { tokio::sync::oneshot::channel().0 } -fn mock_create_builder_for_validate_block() -> MockBlockBuilderFactoryTrait { +fn mock_create_builder_for_validate_block( + build_block_result: BlockBuilderResult, +) -> MockBlockBuilderFactoryTrait { let mut block_builder_factory = MockBlockBuilderFactoryTrait::new(); block_builder_factory.expect_create_block_builder().times(1).return_once( |_, _, mut tx_provider, _| { - // Spawn a task to keep tx_provider alive until all transactions are read. - // Without this, the provider would be dropped, causing the batcher to fail when sending - // transactions to it during the test. - tokio::spawn(async move { - while tx_provider.get_txs(1).await.is_ok_and(|v| v != NextTxs::End) { - tokio::task::yield_now().await; - } + let mut block_builder = MockBlockBuilderTrait::new(); + block_builder.expect_build_block().times(1).return_once(move || { + // Spawn a task to keep tx_provider alive until all transactions are read. + // Without this, the provider would be dropped, causing the batcher to fail when + // sending transactions to it during the test. + tokio::spawn(async move { + while tx_provider.get_txs(1).await.is_ok_and(|v| v != NextTxs::End) { + tokio::task::yield_now().await; + } + }); + build_block_result }); - Ok((Box::new(MockBlockBuilderTrait::new()), abort_signal_sender())) + Ok((Box::new(block_builder), abort_signal_sender())) }, ); block_builder_factory @@ -162,52 +150,32 @@ fn mock_create_builder_for_validate_block() -> MockBlockBuilderFactoryTrait { fn mock_create_builder_for_propose_block( output_txs: Vec, + build_block_result: BlockBuilderResult, ) -> MockBlockBuilderFactoryTrait { let mut block_builder_factory = MockBlockBuilderFactoryTrait::new(); block_builder_factory.expect_create_block_builder().times(1).return_once( |_, _, _, output_content_sender| { - // Simulate the streaming of the block builder output. - for tx in output_txs { - output_content_sender.as_ref().unwrap().send(tx).unwrap(); - } - Ok((Box::new(MockBlockBuilderTrait::new()), abort_signal_sender())) + let mut block_builder = MockBlockBuilderTrait::new(); + block_builder.expect_build_block().times(1).return_once(move || { + // Simulate the streaming of the block builder output. + for tx in output_txs { + output_content_sender.as_ref().unwrap().send(tx).unwrap(); + } + build_block_result + }); + Ok((Box::new(block_builder), abort_signal_sender())) }, ); block_builder_factory } -fn mock_start_proposal(proposal_manager: &mut MockProposalManagerTraitWrapper) { - proposal_manager.expect_wrap_reset().times(1).return_once(|| async {}.boxed()); - proposal_manager - .expect_wrap_spawn_proposal() - .times(1) - .with(eq(PROPOSAL_ID), always(), always()) - .return_once(|_, _, _| { async move { Ok(()) } }.boxed()); -} - -fn mock_completed_proposal( - proposal_manager: &mut MockProposalManagerTraitWrapper, - proposal_result: ProposalResult, -) { - proposal_manager.expect_wrap_get_completed_proposals().times(1).return_once(move || { - async move { Arc::new(Mutex::new(HashMap::from([(PROPOSAL_ID, proposal_result)]))) }.boxed() - }); -} - async fn batcher_with_validated_proposal( - proposal_result: ProposalResult, + build_block_result: BlockBuilderResult, ) -> Batcher { - let block_builder_factory = mock_create_builder_for_validate_block(); - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - mock_start_proposal(&mut proposal_manager); - mock_completed_proposal(&mut proposal_manager, proposal_result); - proposal_manager.expect_wrap_get_active_proposal().returning(|| async move { None }.boxed()); - - let mut batcher = create_batcher(MockDependencies { - proposal_manager, - block_builder_factory, - ..Default::default() - }); + let block_builder_factory = mock_create_builder_for_validate_block(build_block_result); + + let mut batcher = + create_batcher(MockDependencies { block_builder_factory, ..Default::default() }); batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await.unwrap(); @@ -216,27 +184,10 @@ async fn batcher_with_validated_proposal( batcher } -fn mock_proposal_manager_validate_flow() -> MockProposalManagerTraitWrapper { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - mock_start_proposal(&mut proposal_manager); - proposal_manager - .expect_wrap_get_active_proposal() - .returning(|| async move { Some(PROPOSAL_ID) }.boxed()); - proposal_manager - .expect_wrap_await_active_proposal() - .times(1) - .returning(|| async move { true }.boxed()); - mock_completed_proposal(&mut proposal_manager, Ok(proposal_output())); - proposal_manager -} - #[rstest] #[tokio::test] async fn start_height_success() { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager.expect_wrap_reset().times(1).return_once(|| async {}.boxed()); - - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies::default()); assert_eq!(batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await, Ok(())); } @@ -257,20 +208,14 @@ async fn start_height_success() { )] #[tokio::test] async fn start_height_fail(#[case] height: BlockNumber, #[case] expected_error: BatcherError) { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager.expect_wrap_reset().never(); - - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies::default()); assert_eq!(batcher.start_height(StartHeightInput { height }).await, Err(expected_error)); } #[rstest] #[tokio::test] async fn duplicate_start_height() { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager.expect_wrap_reset().times(1).return_once(|| async {}.boxed()); - - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies::default()); let initial_height = StartHeightInput { height: INITIAL_HEIGHT }; assert_eq!(batcher.start_height(initial_height.clone()).await, Ok(())); @@ -280,8 +225,7 @@ async fn duplicate_start_height() { #[rstest] #[tokio::test] async fn no_active_height() { - let proposal_manager = MockProposalManagerTraitWrapper::new(); - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies::default()); // Calling `propose_block` and `validate_block` without starting a height should fail. @@ -295,13 +239,10 @@ async fn no_active_height() { #[rstest] #[tokio::test] async fn validate_block_full_flow() { - let block_builder_factory = mock_create_builder_for_validate_block(); - let proposal_manager = mock_proposal_manager_validate_flow(); - let mut batcher = create_batcher(MockDependencies { - proposal_manager, - block_builder_factory, - ..Default::default() - }); + let block_builder_factory = + mock_create_builder_for_validate_block(Ok(BlockExecutionArtifacts::create_for_testing())); + let mut batcher = + create_batcher(MockDependencies { block_builder_factory, ..Default::default() }); batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await.unwrap(); batcher.validate_block(validate_block_input()).await.unwrap(); @@ -326,21 +267,6 @@ async fn validate_block_full_flow() { ); } -#[rstest] -#[tokio::test] -async fn send_content_after_proposal_already_finished() { - let successful_proposal_result = Ok(proposal_output()); - let mut batcher = batcher_with_validated_proposal(successful_proposal_result).await; - - // Send transactions after the proposal has finished. - let send_proposal_input_txs = SendProposalContentInput { - proposal_id: PROPOSAL_ID, - content: SendProposalContent::Txs(test_txs(0..1)), - }; - let result = batcher.send_proposal_content(send_proposal_input_txs).await; - assert_eq!(result, Err(BatcherError::ProposalAlreadyFinished { proposal_id: PROPOSAL_ID })); -} - #[rstest] #[tokio::test] async fn send_content_to_unknown_proposal() { @@ -364,7 +290,8 @@ async fn send_content_to_unknown_proposal() { #[rstest] #[tokio::test] async fn send_txs_to_an_invalid_proposal() { - let mut batcher = batcher_with_validated_proposal(invalid_proposal_result()).await; + let mut batcher = batcher_with_validated_proposal(Err(BUILD_BLOCK_FAIL_ON_ERROR)).await; + batcher.await_active_proposal().await; let send_proposal_input_txs = SendProposalContentInput { proposal_id: PROPOSAL_ID, @@ -377,7 +304,7 @@ async fn send_txs_to_an_invalid_proposal() { #[rstest] #[tokio::test] async fn send_finish_to_an_invalid_proposal() { - let mut batcher = batcher_with_validated_proposal(invalid_proposal_result()).await; + let mut batcher = batcher_with_validated_proposal(Err(BUILD_BLOCK_FAIL_ON_ERROR)).await; let send_proposal_input_txs = SendProposalContentInput { proposal_id: PROPOSAL_ID, content: SendProposalContent::Finish }; @@ -392,16 +319,13 @@ async fn propose_block_full_flow() { let expected_streamed_txs = test_txs(0..STREAMING_CHUNK_SIZE * 2 + 1); let txs_to_stream = expected_streamed_txs.clone(); - let block_builder_factory = mock_create_builder_for_propose_block(txs_to_stream); - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - mock_start_proposal(&mut proposal_manager); - mock_completed_proposal(&mut proposal_manager, Ok(proposal_output())); + let block_builder_factory = mock_create_builder_for_propose_block( + txs_to_stream, + Ok(BlockExecutionArtifacts::create_for_testing()), + ); - let mut batcher = create_batcher(MockDependencies { - proposal_manager, - block_builder_factory, - ..Default::default() - }); + let mut batcher = + create_batcher(MockDependencies { block_builder_factory, ..Default::default() }); batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await.unwrap(); batcher.propose_block(propose_block_input()).await.unwrap(); @@ -449,16 +373,12 @@ async fn get_height() { #[rstest] #[tokio::test] async fn propose_block_without_retrospective_block_hash() { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager.expect_wrap_reset().times(1).return_once(|| async {}.boxed()); - let mut storage_reader = MockBatcherStorageReaderTrait::new(); storage_reader .expect_height() .returning(|| Ok(BlockNumber(constants::STORED_BLOCK_HASH_BUFFER))); - let mut batcher = - create_batcher(MockDependencies { proposal_manager, storage_reader, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies { storage_reader, ..Default::default() }); batcher .start_height(StartHeightInput { height: BlockNumber(constants::STORED_BLOCK_HASH_BUFFER) }) @@ -472,10 +392,7 @@ async fn propose_block_without_retrospective_block_hash() { #[rstest] #[tokio::test] async fn get_content_from_unknown_proposal() { - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager.expect_wrap_get_completed_proposals().times(0); - - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); + let mut batcher = create_batcher(MockDependencies::default()); let get_proposal_content_input = GetProposalContentInput { proposal_id: PROPOSAL_ID }; let result = batcher.get_proposal_content(get_proposal_content_input).await; @@ -507,41 +424,41 @@ async fn add_sync_block() { let mut batcher = create_batcher(mock_dependencies); let sync_block = SyncBlock { + block_number: INITIAL_HEIGHT, state_diff: test_state_diff(), transaction_hashes: test_tx_hashes().into_iter().collect(), }; batcher.add_sync_block(sync_block).await.unwrap(); } +#[rstest] +#[tokio::test] +#[should_panic(expected = "Synced block height 4 does not match the current height 3.")] +async fn add_sync_block_mismatch_block_number() { + let mut batcher = create_batcher(MockDependencies::default()); + + let sync_block = SyncBlock { + block_number: INITIAL_HEIGHT.unchecked_next(), + state_diff: Default::default(), + transaction_hashes: Default::default(), + }; + batcher.add_sync_block(sync_block).await.unwrap(); +} + #[rstest] #[tokio::test] async fn decision_reached() { let mut mock_dependencies = MockDependencies::default(); - - mock_dependencies - .proposal_manager - .expect_wrap_take_proposal_result() - .times(1) - .with(eq(PROPOSAL_ID)) - .return_once(move |_| { - async move { - Some(Ok(ProposalOutput { - state_diff: test_state_diff(), - commitment: ProposalCommitment::default(), - tx_hashes: test_tx_hashes(), - nonces: test_contract_nonces(), - })) - } - .boxed() - }); + let expected_proposal_output = + ProposalOutput::from(BlockExecutionArtifacts::create_for_testing()); mock_dependencies .mempool_client .expect_commit_block() .times(1) .with(eq(CommitBlockArgs { - address_to_nonce: test_contract_nonces(), - tx_hashes: test_tx_hashes(), + address_to_nonce: expected_proposal_output.nonces, + tx_hashes: expected_proposal_output.tx_hashes, })) .returning(|_| Ok(())); @@ -549,14 +466,30 @@ async fn decision_reached() { .storage_writer .expect_commit_proposal() .times(1) - .with(eq(INITIAL_HEIGHT), eq(test_state_diff())) + .with(eq(INITIAL_HEIGHT), eq(expected_proposal_output.state_diff.clone())) .returning(|_, _| Ok(())); + mock_dependencies.block_builder_factory = mock_create_builder_for_propose_block( + vec![], + Ok(BlockExecutionArtifacts::create_for_testing()), + ); + let mut batcher = create_batcher(mock_dependencies); + batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await.unwrap(); + batcher + .propose_block(ProposeBlockInput { + proposal_id: PROPOSAL_ID, + retrospective_block_hash: None, + deadline: deadline(), + block_info: initial_block_info(), + }) + .await + .unwrap(); + batcher.await_active_proposal().await; let response = batcher.decision_reached(DecisionReachedInput { proposal_id: PROPOSAL_ID }).await.unwrap(); - assert_eq!(response.state_diff, test_state_diff()); + assert_eq!(response.state_diff, expected_proposal_output.state_diff.clone()); } #[rstest] @@ -564,89 +497,14 @@ async fn decision_reached() { async fn decision_reached_no_executed_proposal() { let expected_error = BatcherError::ExecutedProposalNotFound { proposal_id: PROPOSAL_ID }; - let mut proposal_manager = MockProposalManagerTraitWrapper::new(); - proposal_manager - .expect_wrap_take_proposal_result() - .times(1) - .with(eq(PROPOSAL_ID)) - .return_once(|_| async move { None }.boxed()); + let mut batcher = create_batcher(MockDependencies::default()); + batcher.start_height(StartHeightInput { height: INITIAL_HEIGHT }).await.unwrap(); - let mut batcher = create_batcher(MockDependencies { proposal_manager, ..Default::default() }); let decision_reached_result = batcher.decision_reached(DecisionReachedInput { proposal_id: PROPOSAL_ID }).await; assert_eq!(decision_reached_result, Err(expected_error)); } -// A wrapper trait to allow mocking the ProposalManagerTrait in tests. -#[automock] -trait ProposalManagerTraitWrapper: Send + Sync { - fn wrap_spawn_proposal( - &mut self, - proposal_id: ProposalId, - block_builder: Box, - abort_signal_sender: tokio::sync::oneshot::Sender<()>, - ) -> BoxFuture<'_, Result<(), GenerateProposalError>>; - - fn wrap_take_proposal_result( - &mut self, - proposal_id: ProposalId, - ) -> BoxFuture<'_, Option>>; - - fn wrap_get_active_proposal(&self) -> BoxFuture<'_, Option>; - - #[allow(clippy::type_complexity)] - fn wrap_get_completed_proposals( - &self, - ) -> BoxFuture<'_, Arc>>>>; - - fn wrap_await_active_proposal(&mut self) -> BoxFuture<'_, bool>; - - fn wrap_abort_proposal(&mut self, proposal_id: ProposalId) -> BoxFuture<'_, ()>; - - fn wrap_reset(&mut self) -> BoxFuture<'_, ()>; -} - -#[async_trait] -impl ProposalManagerTrait for T { - async fn spawn_proposal( - &mut self, - proposal_id: ProposalId, - block_builder: Box, - abort_signal_sender: tokio::sync::oneshot::Sender<()>, - ) -> Result<(), GenerateProposalError> { - self.wrap_spawn_proposal(proposal_id, block_builder, abort_signal_sender).await - } - - async fn take_proposal_result( - &mut self, - proposal_id: ProposalId, - ) -> Option> { - self.wrap_take_proposal_result(proposal_id).await - } - - async fn get_active_proposal(&self) -> Option { - self.wrap_get_active_proposal().await - } - - async fn get_completed_proposals( - &self, - ) -> Arc>>> { - self.wrap_get_completed_proposals().await - } - - async fn await_active_proposal(&mut self) -> bool { - self.wrap_await_active_proposal().await - } - - async fn abort_proposal(&mut self, proposal_id: ProposalId) { - self.wrap_abort_proposal(proposal_id).await - } - - async fn reset(&mut self) { - self.wrap_reset().await - } -} - fn test_tx_hashes() -> HashSet { (0..5u8).map(|i| tx_hash!(i + 12)).collect() } diff --git a/crates/starknet_batcher/src/block_builder.rs b/crates/starknet_batcher/src/block_builder.rs index c2e83e96b18..9be67a33a19 100644 --- a/crates/starknet_batcher/src/block_builder.rs +++ b/crates/starknet_batcher/src/block_builder.rs @@ -3,17 +3,16 @@ use std::collections::BTreeMap; use async_trait::async_trait; use blockifier::blockifier::config::TransactionExecutorConfig; use blockifier::blockifier::transaction_executor::{ + BlockExecutionSummary, TransactionExecutor, TransactionExecutorError as BlockifierTransactionExecutorError, TransactionExecutorResult, - VisitedSegmentsMapping, }; use blockifier::bouncer::{BouncerConfig, BouncerWeights}; use blockifier::context::{BlockContext, ChainInfo}; -use blockifier::execution::contract_class::VersionedRunnableCompiledClass; use blockifier::state::cached_state::CommitmentStateDiff; +use blockifier::state::contract_class_manager::ContractClassManager; use blockifier::state::errors::StateError; -use blockifier::state::global_cache::GlobalContractCache; use blockifier::transaction::objects::TransactionExecutionInfo; use blockifier::transaction::transaction_execution::Transaction as BlockifierTransaction; use blockifier::versioned_constants::{VersionedConstants, VersionedConstantsOverrides}; @@ -27,6 +26,7 @@ use papyrus_storage::StorageReader; use serde::{Deserialize, Serialize}; use starknet_api::block::{BlockHashAndNumber, BlockInfo}; use starknet_api::executable_transaction::Transaction; +use starknet_api::execution_resources::GasAmount; use starknet_api::transaction::TransactionHash; use thiserror::Error; use tracing::{debug, error, info, trace}; @@ -67,8 +67,8 @@ pub enum FailOnErrorCause { pub struct BlockExecutionArtifacts { pub execution_infos: IndexMap, pub commitment_state_diff: CommitmentStateDiff, - pub visited_segments_mapping: VisitedSegmentsMapping, pub bouncer_weights: BouncerWeights, + pub l2_gas_used: GasAmount, } /// The BlockBuilderTrait is responsible for building a new block from transactions provided by the @@ -122,6 +122,7 @@ impl BlockBuilderTrait for BlockBuilder { async fn build_block(&mut self) -> BlockBuilderResult { let mut block_is_full = false; let mut execution_infos = IndexMap::new(); + let mut l2_gas_used = GasAmount::ZERO; // TODO(yael 6/10/2024): delete the timeout condition once the executor has a timeout while !block_is_full { if tokio::time::Instant::now() >= self.execution_params.deadline { @@ -158,19 +159,20 @@ impl BlockBuilderTrait for BlockBuilder { block_is_full = collect_execution_results_and_stream_txs( next_tx_chunk, results, + &mut l2_gas_used, &mut execution_infos, &self.output_content_sender, self.execution_params.fail_on_err, ) .await?; } - let (commitment_state_diff, visited_segments_mapping, bouncer_weights) = + let BlockExecutionSummary { state_diff, bouncer_weights, .. } = self.executor.close_block()?; Ok(BlockExecutionArtifacts { execution_infos, - commitment_state_diff, - visited_segments_mapping, + commitment_state_diff: state_diff, bouncer_weights, + l2_gas_used, }) } } @@ -179,6 +181,7 @@ impl BlockBuilderTrait for BlockBuilder { async fn collect_execution_results_and_stream_txs( tx_chunk: Vec, results: Vec>, + l2_gas_used: &mut GasAmount, execution_infos: &mut IndexMap, output_content_sender: &Option>, fail_on_err: bool, @@ -186,6 +189,7 @@ async fn collect_execution_results_and_stream_txs( for (input_tx, result) in tx_chunk.into_iter().zip(results.into_iter()) { match result { Ok(tx_execution_info) => { + *l2_gas_used += tx_execution_info.receipt.gas.l2_gas; execution_infos.insert(input_tx.tx_hash(), tx_execution_info); if let Some(output_content_sender) = output_content_sender { output_content_sender.send(input_tx)?; @@ -277,7 +281,7 @@ impl SerializeConfig for BlockBuilderConfig { pub struct BlockBuilderFactory { pub block_builder_config: BlockBuilderConfig, pub storage_reader: StorageReader, - pub global_class_hash_to_class: GlobalContractCache, + pub contract_class_manager: ContractClassManager, } impl BlockBuilderFactory { @@ -300,7 +304,7 @@ impl BlockBuilderFactory { let state_reader = PapyrusReader::new( self.storage_reader.clone(), height, - self.global_class_hash_to_class.clone(), + self.contract_class_manager.clone(), ); let executor = TransactionExecutor::pre_process_and_create( diff --git a/crates/starknet_batcher/src/block_builder_test.rs b/crates/starknet_batcher/src/block_builder_test.rs index c378f8715b2..0e30e8ab6b3 100644 --- a/crates/starknet_batcher/src/block_builder_test.rs +++ b/crates/starknet_batcher/src/block_builder_test.rs @@ -1,7 +1,11 @@ use assert_matches::assert_matches; -use blockifier::blockifier::transaction_executor::TransactionExecutorError; +use blockifier::blockifier::transaction_executor::{ + BlockExecutionSummary, + TransactionExecutorError, +}; use blockifier::bouncer::BouncerWeights; use blockifier::fee::fee_checks::FeeCheckError; +use blockifier::fee::receipt::TransactionReceipt; use blockifier::state::errors::StateError; use blockifier::transaction::objects::{RevertError, TransactionExecutionInfo}; use blockifier::transaction::transaction_execution::Transaction as BlockifierTransaction; @@ -10,6 +14,7 @@ use mockall::predicate::eq; use mockall::Sequence; use rstest::rstest; use starknet_api::executable_transaction::Transaction; +use starknet_api::execution_resources::{GasAmount, GasVector}; use starknet_api::transaction::fields::Fee; use starknet_api::transaction::TransactionHash; use starknet_api::tx_hash; @@ -47,11 +52,13 @@ fn output_channel() -> (UnboundedSender, UnboundedReceiver, ) -> BlockExecutionArtifacts { + let l2_gas_used = GasAmount(execution_infos.len().try_into().unwrap()); BlockExecutionArtifacts { execution_infos, commitment_state_diff: Default::default(), - visited_segments_mapping: Default::default(), bouncer_weights: BouncerWeights { l1_gas: 100, ..BouncerWeights::empty() }, + // Each mock transaction uses 1 L2 gas so the total amount should be the number of txs. + l2_gas_used, } } @@ -62,6 +69,10 @@ fn execution_info() -> TransactionExecutionInfo { max_fee: Fee(100), actual_fee: Fee(101), })), + receipt: TransactionReceipt { + gas: GasVector { l2_gas: GasAmount(1), ..Default::default() }, + ..Default::default() + }, ..Default::default() } } @@ -253,11 +264,11 @@ fn transaction_failed_test_expectations() -> TestExpectations { let expected_block_artifacts = block_execution_artifacts(execution_infos_mapping); let expected_block_artifacts_copy = expected_block_artifacts.clone(); mock_transaction_executor.expect_close_block().times(1).return_once(move || { - Ok(( - expected_block_artifacts_copy.commitment_state_diff, - expected_block_artifacts_copy.visited_segments_mapping, - expected_block_artifacts_copy.bouncer_weights, - )) + Ok(BlockExecutionSummary { + state_diff: expected_block_artifacts_copy.commitment_state_diff, + compressed_state_diff: None, + bouncer_weights: expected_block_artifacts_copy.bouncer_weights, + }) }); let mock_tx_provider = mock_tx_provider_limitless_calls(1, vec![input_txs]); @@ -286,11 +297,11 @@ fn set_close_block_expectations( let output_block_artifacts = block_builder_expected_output(block_size); let output_block_artifacts_copy = output_block_artifacts.clone(); mock_transaction_executor.expect_close_block().times(1).return_once(move || { - Ok(( - output_block_artifacts.commitment_state_diff, - output_block_artifacts.visited_segments_mapping, - output_block_artifacts.bouncer_weights, - )) + Ok(BlockExecutionSummary { + state_diff: output_block_artifacts.commitment_state_diff, + compressed_state_diff: None, + bouncer_weights: output_block_artifacts.bouncer_weights, + }) }); output_block_artifacts_copy } @@ -544,3 +555,27 @@ async fn test_build_block_abort_immediately() { Err(BlockBuilderError::Aborted) ); } + +#[rstest] +#[tokio::test] +async fn test_l2_gas_used() { + let n_txs = 3; + let input_txs = test_txs(0..n_txs); + let (mock_transaction_executor, _) = one_chunk_mock_executor(&input_txs, input_txs.len()); + let mock_tx_provider = mock_tx_provider_stream_done(input_txs); + + let (_abort_sender, abort_receiver) = tokio::sync::oneshot::channel(); + let result_block_artifacts = run_build_block( + mock_transaction_executor, + mock_tx_provider, + None, + true, + abort_receiver, + BLOCK_GENERATION_DEADLINE_SECS, + ) + .await + .unwrap(); + + // Each mock transaction uses 1 L2 gas so the total amount should be the number of txs. + assert_eq!(result_block_artifacts.l2_gas_used, GasAmount(n_txs.try_into().unwrap())); +} diff --git a/crates/starknet_batcher/src/config.rs b/crates/starknet_batcher/src/config.rs index b25c2d7ea1c..a9cba90decf 100644 --- a/crates/starknet_batcher/src/config.rs +++ b/crates/starknet_batcher/src/config.rs @@ -1,5 +1,6 @@ use std::collections::BTreeMap; +use blockifier::blockifier::config::ContractClassManagerConfig; use papyrus_config::dumping::{append_sub_config_name, ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use serde::{Deserialize, Serialize}; @@ -15,7 +16,7 @@ pub struct BatcherConfig { pub outstream_content_buffer_size: usize, pub input_stream_content_buffer_size: usize, pub block_builder_config: BlockBuilderConfig, - pub global_contract_cache_size: usize, + pub contract_class_manager_config: ContractClassManagerConfig, pub max_l1_handler_txs_per_block_proposal: usize, } @@ -36,13 +37,6 @@ impl SerializeConfig for BatcherConfig { beyond this limit will block until space is available.", ParamPrivacyInput::Public, ), - ser_param( - "global_contract_cache_size", - &self.global_contract_cache_size, - "Cache size for the global_class_hash_to_class. Initialized with this size on \ - creation.", - ParamPrivacyInput::Public, - ), ser_param( "max_l1_handler_txs_per_block_proposal", &self.max_l1_handler_txs_per_block_proposal, @@ -55,6 +49,10 @@ impl SerializeConfig for BatcherConfig { self.block_builder_config.dump(), "block_builder_config", )); + dump.append(&mut append_sub_config_name( + self.contract_class_manager_config.dump(), + "contract_class_manager_config", + )); dump } } @@ -76,7 +74,7 @@ impl Default for BatcherConfig { outstream_content_buffer_size: 100, input_stream_content_buffer_size: 400, block_builder_config: BlockBuilderConfig::default(), - global_contract_cache_size: 400, + contract_class_manager_config: ContractClassManagerConfig::default(), max_l1_handler_txs_per_block_proposal: 3, } } diff --git a/crates/starknet_batcher/src/fee_market.rs b/crates/starknet_batcher/src/fee_market.rs index 71cba26a494..c0aa3a3c293 100644 --- a/crates/starknet_batcher/src/fee_market.rs +++ b/crates/starknet_batcher/src/fee_market.rs @@ -15,7 +15,7 @@ const MAX_BLOCK_SIZE: u64 = 4000000000; // In gas units. It's equivalent to 40M /// Calculate the base gas price for the next block according to EIP-1559. /// /// # Parameters -/// - `price`: The base fee of the current block. +/// - `price`: The base gas price of the current block. /// - `gas_used`: The total gas used in the current block. /// - `gas_target`: The target gas usage per block (usually half of the gas limit). pub fn calculate_next_base_gas_price(price: u64, gas_used: u64, gas_target: u64) -> u64 { diff --git a/crates/starknet_batcher/src/lib.rs b/crates/starknet_batcher/src/lib.rs index 199f3544695..a17a44409cd 100644 --- a/crates/starknet_batcher/src/lib.rs +++ b/crates/starknet_batcher/src/lib.rs @@ -7,9 +7,6 @@ mod block_builder_test; pub mod communication; pub mod config; pub mod fee_market; -mod proposal_manager; -#[cfg(test)] -mod proposal_manager_test; #[cfg(test)] mod test_utils; mod transaction_executor; diff --git a/crates/starknet_batcher/src/proposal_manager.rs b/crates/starknet_batcher/src/proposal_manager.rs deleted file mode 100644 index cb242d5af9e..00000000000 --- a/crates/starknet_batcher/src/proposal_manager.rs +++ /dev/null @@ -1,201 +0,0 @@ -use std::collections::HashMap; -use std::sync::Arc; - -use async_trait::async_trait; -use starknet_batcher_types::batcher_types::ProposalId; -use thiserror::Error; -use tokio::sync::Mutex; -use tracing::{debug, error, info, instrument, Instrument}; - -use crate::block_builder::{BlockBuilderError, BlockBuilderTrait}; -use crate::utils::{ProposalOutput, ProposalResult, ProposalTask}; - -#[derive(Debug, Error)] -pub enum GenerateProposalError { - #[error( - "Received proposal generation request with id {new_proposal_id} while already generating \ - proposal with id {current_generating_proposal_id}." - )] - AlreadyGeneratingProposal { - current_generating_proposal_id: ProposalId, - new_proposal_id: ProposalId, - }, - #[error(transparent)] - BlockBuilderError(#[from] BlockBuilderError), - #[error("No active height to work on.")] - NoActiveHeight, - #[error("Proposal with id {proposal_id} already exists.")] - ProposalAlreadyExists { proposal_id: ProposalId }, -} - -#[async_trait] -pub trait ProposalManagerTrait: Send + Sync { - async fn spawn_proposal( - &mut self, - proposal_id: ProposalId, - mut block_builder: Box, - abort_signal_sender: tokio::sync::oneshot::Sender<()>, - ) -> Result<(), GenerateProposalError>; - - async fn take_proposal_result( - &mut self, - proposal_id: ProposalId, - ) -> Option>; - - async fn get_active_proposal(&self) -> Option; - - async fn get_completed_proposals( - &self, - ) -> Arc>>>; - - async fn await_active_proposal(&mut self) -> bool; - - async fn abort_proposal(&mut self, proposal_id: ProposalId); - - // Resets the proposal manager, aborting any active proposal. - async fn reset(&mut self); -} - -/// Main struct for handling block proposals. -/// Taking care of: -/// - Proposing new blocks. -/// - Validating incoming proposals. -/// - Committing accepted proposals to the storage. -/// -/// Triggered by the consensus. -pub(crate) struct ProposalManager { - /// The block proposal that is currently being built, if any. - /// At any given time, there can be only one proposal being actively executed (either proposed - /// or validated). - active_proposal: Arc>>, - active_proposal_task: Option, - - executed_proposals: Arc>>>, -} - -#[async_trait] -impl ProposalManagerTrait for ProposalManager { - /// Starts a new block proposal generation task for the given proposal_id. - /// Uses the given block_builder to generate the proposal. - #[instrument(skip(self, block_builder), err)] - async fn spawn_proposal( - &mut self, - proposal_id: ProposalId, - mut block_builder: Box, - abort_signal_sender: tokio::sync::oneshot::Sender<()>, - ) -> Result<(), GenerateProposalError> { - self.set_active_proposal(proposal_id).await?; - - info!("Starting generation of a new proposal with id {}.", proposal_id); - - let active_proposal = self.active_proposal.clone(); - let executed_proposals = self.executed_proposals.clone(); - - let join_handle = tokio::spawn( - async move { - let result = - block_builder.build_block().await.map(ProposalOutput::from).map_err(Arc::new); - - // The proposal is done, clear the active proposal. - // Keep the proposal result only if it is the same as the active proposal. - // The active proposal might have changed if this proposal was aborted. - let mut active_proposal = active_proposal.lock().await; - if *active_proposal == Some(proposal_id) { - active_proposal.take(); - executed_proposals.lock().await.insert(proposal_id, result); - } - } - .in_current_span(), - ); - - self.active_proposal_task = Some(ProposalTask { abort_signal_sender, join_handle }); - Ok(()) - } - - async fn take_proposal_result( - &mut self, - proposal_id: ProposalId, - ) -> Option> { - self.executed_proposals.lock().await.remove(&proposal_id) - } - - async fn get_active_proposal(&self) -> Option { - *self.active_proposal.lock().await - } - - async fn get_completed_proposals( - &self, - ) -> Arc>>> { - self.executed_proposals.clone() - } - - // Awaits the active proposal. - // Returns true if there was an active proposal, and false otherwise. - async fn await_active_proposal(&mut self) -> bool { - if let Some(proposal_task) = self.active_proposal_task.take() { - proposal_task.join_handle.await.ok(); - return true; - } - false - } - - // Aborts the proposal with the given ID, if active. - // Should be used in validate flow, if the consensus decides to abort the proposal. - async fn abort_proposal(&mut self, proposal_id: ProposalId) { - if *self.active_proposal.lock().await == Some(proposal_id) { - self.abort_active_proposal().await; - self.executed_proposals - .lock() - .await - .insert(proposal_id, Err(Arc::new(BlockBuilderError::Aborted))); - } - } - - async fn reset(&mut self) { - self.abort_active_proposal().await; - self.executed_proposals.lock().await.clear(); - } -} - -impl ProposalManager { - pub fn new() -> Self { - Self { - active_proposal: Arc::new(Mutex::new(None)), - active_proposal_task: None, - executed_proposals: Arc::new(Mutex::new(HashMap::new())), - } - } - - // Sets a new active proposal task. - // Fails if either there is no active height, there is another proposal being generated, or a - // proposal with the same ID already exists. - async fn set_active_proposal( - &mut self, - proposal_id: ProposalId, - ) -> Result<(), GenerateProposalError> { - if self.executed_proposals.lock().await.contains_key(&proposal_id) { - return Err(GenerateProposalError::ProposalAlreadyExists { proposal_id }); - } - - let mut active_proposal = self.active_proposal.lock().await; - if let Some(current_generating_proposal_id) = *active_proposal { - return Err(GenerateProposalError::AlreadyGeneratingProposal { - current_generating_proposal_id, - new_proposal_id: proposal_id, - }); - } - - debug!("Set proposal {} as the one being generated.", proposal_id); - *active_proposal = Some(proposal_id); - Ok(()) - } - - // Ends the current active proposal. - // This call is non-blocking. - async fn abort_active_proposal(&mut self) { - self.active_proposal.lock().await.take(); - if let Some(proposal_task) = self.active_proposal_task.take() { - proposal_task.abort_signal_sender.send(()).ok(); - } - } -} diff --git a/crates/starknet_batcher/src/proposal_manager_test.rs b/crates/starknet_batcher/src/proposal_manager_test.rs deleted file mode 100644 index c43bfab7d31..00000000000 --- a/crates/starknet_batcher/src/proposal_manager_test.rs +++ /dev/null @@ -1,160 +0,0 @@ -use assert_matches::assert_matches; -use rstest::{fixture, rstest}; -use starknet_api::executable_transaction::Transaction; -use starknet_batcher_types::batcher_types::ProposalId; - -use crate::block_builder::{ - BlockBuilderError, - BlockBuilderTrait, - BlockExecutionArtifacts, - MockBlockBuilderTrait, -}; -use crate::proposal_manager::{GenerateProposalError, ProposalManager, ProposalManagerTrait}; -use crate::utils::ProposalOutput; - -const BLOCK_GENERATION_TIMEOUT: tokio::time::Duration = tokio::time::Duration::from_secs(1); - -#[fixture] -fn output_streaming() -> ( - tokio::sync::mpsc::UnboundedSender, - tokio::sync::mpsc::UnboundedReceiver, -) { - tokio::sync::mpsc::unbounded_channel() -} - -#[fixture] -fn proposal_manager() -> ProposalManager { - ProposalManager::new() -} - -fn mock_build_block() -> Box { - let mut mock_block_builder = MockBlockBuilderTrait::new(); - mock_block_builder - .expect_build_block() - .times(1) - .return_once(move || Ok(BlockExecutionArtifacts::create_for_testing())); - Box::new(mock_block_builder) -} - -// This function simulates a long build block operation. This is required for a test that -// tries to run other operations while a block is being built. -fn mock_long_build_block() -> Box { - let mut mock_block_builder = MockBlockBuilderTrait::new(); - mock_block_builder.expect_build_block().times(1).return_once(move || { - std::thread::sleep(BLOCK_GENERATION_TIMEOUT * 10); - Ok(BlockExecutionArtifacts::create_for_testing()) - }); - Box::new(mock_block_builder) -} - -async fn spawn_proposal_non_blocking( - proposal_manager: &mut ProposalManager, - proposal_id: ProposalId, - block_builder: Box, -) -> Result<(), GenerateProposalError> { - let (abort_sender, _rec) = tokio::sync::oneshot::channel(); - proposal_manager.spawn_proposal(proposal_id, block_builder, abort_sender).await -} - -async fn spawn_proposal( - proposal_manager: &mut ProposalManager, - proposal_id: ProposalId, - block_builder: Box, -) { - spawn_proposal_non_blocking(proposal_manager, proposal_id, block_builder).await.unwrap(); - assert!(proposal_manager.await_active_proposal().await); -} - -#[rstest] -#[tokio::test] -async fn spawn_proposal_success(mut proposal_manager: ProposalManager) { - spawn_proposal(&mut proposal_manager, ProposalId(0), mock_build_block()).await; - - proposal_manager.take_proposal_result(ProposalId(0)).await.unwrap().unwrap(); -} - -#[rstest] -#[tokio::test] -async fn consecutive_proposal_generations_success(mut proposal_manager: ProposalManager) { - // Build and validate multiple proposals consecutively (awaiting on them to - // make sure they finished successfully). - spawn_proposal(&mut proposal_manager, ProposalId(0), mock_build_block()).await; - spawn_proposal(&mut proposal_manager, ProposalId(1), mock_build_block()).await; -} - -// This test checks that trying to generate a proposal while another one is being generated will -// fail. First the test will generate a new proposal that takes a very long time, and during -// that time it will send another build proposal request. -#[rstest] -#[tokio::test] -async fn multiple_proposals_generation_fail(mut proposal_manager: ProposalManager) { - // Build a proposal that will take a very long time to finish. - spawn_proposal_non_blocking(&mut proposal_manager, ProposalId(0), mock_long_build_block()) - .await - .unwrap(); - - // Try to generate another proposal while the first one is still being generated. - let mut block_builder = MockBlockBuilderTrait::new(); - block_builder.expect_build_block().never(); - let another_generate_request = - spawn_proposal_non_blocking(&mut proposal_manager, ProposalId(1), Box::new(block_builder)) - .await; - - assert_matches!( - another_generate_request, - Err(GenerateProposalError::AlreadyGeneratingProposal { - current_generating_proposal_id, - new_proposal_id - }) if current_generating_proposal_id == ProposalId(0) && new_proposal_id == ProposalId(1) - ); -} - -#[rstest] -#[tokio::test] -async fn take_proposal_result_no_active_proposal(mut proposal_manager: ProposalManager) { - spawn_proposal(&mut proposal_manager, ProposalId(0), mock_build_block()).await; - - let expected_proposal_output = - ProposalOutput::from(BlockExecutionArtifacts::create_for_testing()); - assert_eq!( - proposal_manager.take_proposal_result(ProposalId(0)).await.unwrap().unwrap(), - expected_proposal_output - ); - assert_matches!(proposal_manager.take_proposal_result(ProposalId(0)).await, None); -} - -#[rstest] -#[tokio::test] -async fn abort_active_proposal(mut proposal_manager: ProposalManager) { - spawn_proposal_non_blocking(&mut proposal_manager, ProposalId(0), mock_long_build_block()) - .await - .unwrap(); - - proposal_manager.abort_proposal(ProposalId(0)).await; - - assert_matches!( - *proposal_manager.take_proposal_result(ProposalId(0)).await.unwrap().unwrap_err(), - BlockBuilderError::Aborted - ); - - // Make sure there is no active proposal. - assert!(!proposal_manager.await_active_proposal().await); -} - -#[rstest] -#[tokio::test] -async fn reset(mut proposal_manager: ProposalManager) { - // Create 2 proposals, one will remain active. - spawn_proposal(&mut proposal_manager, ProposalId(0), mock_build_block()).await; - spawn_proposal_non_blocking(&mut proposal_manager, ProposalId(1), mock_long_build_block()) - .await - .unwrap(); - - proposal_manager.reset().await; - - // Make sure executed proposals are deleted. - assert_matches!(proposal_manager.take_proposal_result(ProposalId(0)).await, None); - - // Make sure there is no active proposal. - assert!(!proposal_manager.await_active_proposal().await); -} diff --git a/crates/starknet_batcher/src/test_utils.rs b/crates/starknet_batcher/src/test_utils.rs index 73f251de039..e7f4f35cd8c 100644 --- a/crates/starknet_batcher/src/test_utils.rs +++ b/crates/starknet_batcher/src/test_utils.rs @@ -1,12 +1,12 @@ use std::ops::Range; -use blockifier::blockifier::transaction_executor::VisitedSegmentsMapping; use blockifier::bouncer::BouncerWeights; use blockifier::state::cached_state::CommitmentStateDiff; use indexmap::IndexMap; use starknet_api::executable_transaction::Transaction; +use starknet_api::execution_resources::GasAmount; use starknet_api::test_utils::invoke::{executable_invoke_tx, InvokeTxArgs}; -use starknet_api::tx_hash; +use starknet_api::{class_hash, contract_address, nonce, tx_hash}; use crate::block_builder::BlockExecutionArtifacts; @@ -23,11 +23,20 @@ pub fn test_txs(tx_hash_range: Range) -> Vec { impl BlockExecutionArtifacts { pub fn create_for_testing() -> Self { + // Use a non-empty commitment_state_diff to make the tests more realistic. Self { execution_infos: IndexMap::default(), - commitment_state_diff: CommitmentStateDiff::default(), - visited_segments_mapping: VisitedSegmentsMapping::default(), + commitment_state_diff: CommitmentStateDiff { + address_to_class_hash: IndexMap::from_iter([( + contract_address!("0x7"), + class_hash!("0x11111111"), + )]), + storage_updates: IndexMap::new(), + class_hash_to_compiled_class_hash: IndexMap::new(), + address_to_nonce: IndexMap::from_iter([(contract_address!("0x7"), nonce!(1_u64))]), + }, bouncer_weights: BouncerWeights::empty(), + l2_gas_used: GasAmount::default(), } } } diff --git a/crates/starknet_batcher/src/transaction_executor.rs b/crates/starknet_batcher/src/transaction_executor.rs index a781f81bd1c..e8413cccadb 100644 --- a/crates/starknet_batcher/src/transaction_executor.rs +++ b/crates/starknet_batcher/src/transaction_executor.rs @@ -1,10 +1,8 @@ use blockifier::blockifier::transaction_executor::{ + BlockExecutionSummary, TransactionExecutor, TransactionExecutorResult, - VisitedSegmentsMapping, }; -use blockifier::bouncer::BouncerWeights; -use blockifier::state::cached_state::CommitmentStateDiff; use blockifier::state::state_api::StateReader; use blockifier::transaction::objects::TransactionExecutionInfo; use blockifier::transaction::transaction_execution::Transaction as BlockifierTransaction; @@ -17,9 +15,7 @@ pub trait TransactionExecutorTrait: Send { &mut self, txs: &[BlockifierTransaction], ) -> Vec>; - fn close_block( - &mut self, - ) -> TransactionExecutorResult<(CommitmentStateDiff, VisitedSegmentsMapping, BouncerWeights)>; + fn close_block(&mut self) -> TransactionExecutorResult; } impl TransactionExecutorTrait for TransactionExecutor { @@ -32,10 +28,7 @@ impl TransactionExecutorTrait for TransactionExecu } /// Finalizes the block creation and returns the commitment state diff, visited /// segments mapping and bouncer. - fn close_block( - &mut self, - ) -> TransactionExecutorResult<(CommitmentStateDiff, VisitedSegmentsMapping, BouncerWeights)> - { + fn close_block(&mut self) -> TransactionExecutorResult { self.finalize() } } diff --git a/crates/starknet_batcher/src/utils.rs b/crates/starknet_batcher/src/utils.rs index 1d656d8edae..4ea923a4db9 100644 --- a/crates/starknet_batcher/src/utils.rs +++ b/crates/starknet_batcher/src/utils.rs @@ -67,8 +67,7 @@ pub(crate) fn deadline_as_instant( let time_to_deadline = deadline - chrono::Utc::now(); let as_duration = time_to_deadline.to_std().map_err(|_| BatcherError::TimeToDeadlineError { deadline })?; - // TODO(Matan): this is a temporary solution to the timeout issue. - Ok((std::time::Instant::now() + (as_duration / 2)).into()) + Ok((std::time::Instant::now() + as_duration).into()) } pub(crate) fn verify_block_input( diff --git a/crates/starknet_batcher_types/Cargo.toml b/crates/starknet_batcher_types/Cargo.toml index d8e890410bb..a4ca5b40864 100644 --- a/crates/starknet_batcher_types/Cargo.toml +++ b/crates/starknet_batcher_types/Cargo.toml @@ -26,4 +26,4 @@ thiserror.workspace = true [dev-dependencies] # Enable self with "testing" feature in tests. -starknet_batcher_types = { workspace = true, features = ["testing"] } +starknet_batcher_types = { path = ".", features = ["testing"] } diff --git a/crates/starknet_class_manager_types/Cargo.toml b/crates/starknet_class_manager_types/Cargo.toml new file mode 100644 index 00000000000..01a655bcd08 --- /dev/null +++ b/crates/starknet_class_manager_types/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "starknet_class_manager_types" +edition.workspace = true +license.workspace = true +repository.workspace = true +version.workspace = true + +[lints] +workspace = true + +[dependencies] +async-trait.workspace = true +cairo-lang-starknet-classes.workspace = true +papyrus_proc_macros.workspace = true +serde = { workspace = true, features = ["derive"] } +starknet_api.workspace = true +starknet_sequencer_infra.workspace = true +thiserror.workspace = true diff --git a/crates/starknet_class_manager_types/src/lib.rs b/crates/starknet_class_manager_types/src/lib.rs new file mode 100644 index 00000000000..52629a77b40 --- /dev/null +++ b/crates/starknet_class_manager_types/src/lib.rs @@ -0,0 +1,108 @@ +use async_trait::async_trait; +use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; +use papyrus_proc_macros::handle_response_variants; +use serde::{Deserialize, Serialize}; +use starknet_api::core::{ClassHash, CompiledClassHash}; +use starknet_api::state::SierraContractClass; +use starknet_sequencer_infra::component_client::ClientError; +use starknet_sequencer_infra::component_definitions::ComponentClient; +use thiserror::Error; + +pub type ClassManagerResult = Result; +pub type ClassManagerClientResult = Result; + +// TODO: export. +pub type ClassId = ClassHash; +pub type Class = SierraContractClass; +pub type ExecutableClass = CasmContractClass; +pub type ExecutableClassHash = CompiledClassHash; + +/// Serves as the class manager's shared interface. +/// Requires `Send + Sync` to allow transferring and sharing resources (inputs, futures) across +/// threads. +#[async_trait] +pub trait ClassManagerClient: Send + Sync { + // TODO(native): make generic in executable type. + async fn add_class( + &self, + class_id: ClassId, + class: Class, + ) -> ClassManagerClientResult; + + async fn get_executable(&self, class_id: ClassId) -> ClassManagerClientResult; + + async fn get_sierra(&self, class_id: ClassId) -> ClassManagerClientResult; +} + +#[derive(Clone, Debug, Error, Eq, PartialEq, Serialize, Deserialize)] +pub enum ClassManagerError { + #[error("Compilation failed: {0}")] + CompilationUtilError(String), + #[error("Class of hash: {class_id} not found")] + ClassNotFound { class_id: ClassId }, +} + +#[derive(Clone, Debug, Error)] +pub enum ClassManagerClientError { + #[error(transparent)] + ClientError(#[from] ClientError), + #[error(transparent)] + ClassManagerError(#[from] ClassManagerError), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum ClassManagerRequest { + AddClass(ClassId, Class), + GetExecutable(ClassId), + GetSierra(ClassId), +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub enum ClassManagerResponse { + AddClass(ClassManagerResult), + GetExecutable(ClassManagerResult), + GetSierra(ClassManagerResult), +} + +#[async_trait] +impl ClassManagerClient for ComponentClientType +where + ComponentClientType: Send + Sync + ComponentClient, +{ + async fn add_class( + &self, + class_id: ClassId, + class: Class, + ) -> ClassManagerClientResult { + let request = ClassManagerRequest::AddClass(class_id, class); + let response = self.send(request).await; + handle_response_variants!( + ClassManagerResponse, + AddClass, + ClassManagerClientError, + ClassManagerError + ) + } + + async fn get_executable(&self, class_id: ClassId) -> ClassManagerClientResult { + let request = ClassManagerRequest::GetExecutable(class_id); + let response = self.send(request).await; + handle_response_variants!( + ClassManagerResponse, + GetExecutable, + ClassManagerClientError, + ClassManagerError + ) + } + + async fn get_sierra(&self, class_id: ClassId) -> ClassManagerClientResult { + let request = ClassManagerRequest::GetSierra(class_id); + let response = self.send(request).await; + handle_response_variants!( + ClassManagerResponse, + GetSierra, + ClassManagerClientError, + ClassManagerError + ) + } +} diff --git a/crates/starknet_client/Cargo.toml b/crates/starknet_client/Cargo.toml index e326d8545f1..ee5cd3c1af1 100644 --- a/crates/starknet_client/Cargo.toml +++ b/crates/starknet_client/Cargo.toml @@ -46,8 +46,8 @@ rand.workspace = true rand_chacha.workspace = true pretty_assertions.workspace = true simple_logger.workspace = true -starknet_api = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +starknet_api = { path = "../starknet_api", features = ["testing"] } +papyrus_test_utils.path = "../papyrus_test_utils" [package.metadata.cargo-machete] # The `rand` and `rand_chacha` crates are used in the `testing` feature, which is optional. diff --git a/crates/starknet_client/resources/reader/block_post_0_13_4.json b/crates/starknet_client/resources/reader/block_post_0_13_4.json new file mode 100644 index 00000000000..aed0db13316 --- /dev/null +++ b/crates/starknet_client/resources/reader/block_post_0_13_4.json @@ -0,0 +1,340 @@ +{ + "block_hash": "0xdaf586a70f9c09289b920fa2914bd3fb8c92d034e382afa834ecf2cce24929", + "parent_block_hash": "0x10a6d52171db8f41abbd27f522beeaa2b1f8406473937a7a8626ac8e6cc9bd1", + "block_number": 64820, + "state_root": "0x7d8e10d62a5945de816b82b626cb2131c008539f324b410244a75c2cc368472", + "transaction_commitment": "0x1b7dbe66c42f8d90e0d12a41500122774b94014a23474ee98dd77626f8c785e", + "event_commitment": "0x7047a5e649af66a6c3d6081e88c80ea9c9a98070fc2e1689f98458c099c978a", + "receipt_commitment": "0x8684350ddac79aedd60b66ff3cd03c96cb92b981b48db9d0436ceeb9873f48", + "state_diff_commitment": "0x254e3f6ed4b8eebc182caa6c994634bf28ba870264e284d7f77f5aa2b394b1b", + "state_diff_length": 14, + "status": "ACCEPTED_ON_L2", + "l1_da_mode": "BLOB", + "l1_gas_price": { + "price_in_wei": "0x58fe7705c", + "price_in_fri": "0xa4277658199c" + }, + "l1_data_gas_price": { + "price_in_wei": "0xf00cef70", + "price_in_fri": "0x1bac93100f36" + }, + "l2_gas_price": { + "price_in_wei": "0x91ced", + "price_in_fri": "0x10cf33d99" + }, + "transactions": [ + { + "transaction_hash": "0x45a51f77d38e6f7eab91d0545e812a3d6b60a806b38907746eeea2c327f5fec", + "version": "0x3", + "signature": [ + "0x2ded30230942a00ae16f9472046e2d7f2779a3ea02c3bf5776f064f799d817e", + "0x563f9aff4f808b0edf5a526b17b34d4e0fa4ae06783c274fc498b2728f66386" + ], + "nonce": "0xe72", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_DATA_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L1_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L2_GAS": { + "max_amount": "0x5f5e100", + "max_price_per_unit": "0xba43b7400" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "calldata": [ + "0x2", + "0x4138fd51f90d171df37e9d4419c8cdb67d525840c58f8a5c347be93a1c5277d", + "0x3604cea1cdb094a73a31144f14a3e5861613c008e1e879939ebc4827d10cd50", + "0x5", + "0x5d4f123c53c7cfe4db2725ff77f52b7cc0293115175c4a6ae26b931bb33c973", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x15bbb8880e6edfef67f7fbcc2bd28c0e207c1df789c7ace4154257286cf704e", + "0x15824a49f8ce20b648a699c458cabf255363919efe34055c5dcf791ebc19923", + "0x28c62efb55444e72ba017fd975177c3960fc62a1c213713691dff28c0a81424", + "0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c", + "0x5", + "0x4138fd51f90d171df37e9d4419c8cdb67d525840c58f8a5c347be93a1c5277d", + "0x1a8e87e9d2008fcd3ce423ae5219c21e49be18d05d72825feb7e2bb687ba35c", + "0x2", + "0x71fcc19d63d870b8ac3d826e878cd752", + "0x93bb0859cc1a97cf8e44963d6a80314" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x20a6b5bc2fcd7c4fa68583c5714ac997da6aa512453f2dcd321ac83c402aabf", + "version": "0x3", + "signature": [ + "0x17772d362ff7d8f731cc7bca9622d8447c999695de7f6105dcd86215762eae5", + "0x446d7ede989c747dc10adf07eb6126c9b468f9b6b2685239c9cccefca74abaf" + ], + "nonce": "0xe73", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_DATA_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L1_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L2_GAS": { + "max_amount": "0x5f5e100", + "max_price_per_unit": "0xba43b7400" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "calldata": [ + "0x2", + "0x28c62efb55444e72ba017fd975177c3960fc62a1c213713691dff28c0a81424", + "0x27a4a7332e590dd789019a6d125ff2aacd358e453090978cbf81f0d85e4c045", + "0x2", + "0x3b360f46f5cca30d75a45d67c0a241bd4532412cf2bc75a19894e20e634576a", + "0x1b9b9d909de78c8e87f3460a59aa0a879a5ae5d0b0743295570fa7e47808a3d", + "0x28c62efb55444e72ba017fd975177c3960fc62a1c213713691dff28c0a81424", + "0x169f135eddda5ab51886052d777a57f2ea9c162d713691b5e04a6d4ed71d47f", + "0x4", + "0x5d4f123c53c7cfe4db2725ff77f52b7cc0293115175c4a6ae26b931bb33c973", + "0x7fadf2f7649d8b2e3d436a18aa825fbde7f34ccf07898fd7329ce06f892a4fa", + "0x0", + "0x0" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x3b7869de77438959db61644b709bd771fce950ae22d9cc583153e39183e0efe", + "version": "0x3", + "signature": [ + "0x4ebd6fb71da4338b2d8ec234accd0bd667f3ae5d10982d5a03412e92314dab6", + "0x44bd872c4b475af7c586905221655b9d74926845c4084f6c31a66397efcca0d" + ], + "nonce": "0xe74", + "nonce_data_availability_mode": 0, + "fee_data_availability_mode": 0, + "resource_bounds": { + "L1_DATA_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L1_GAS": { + "max_amount": "0x186a0", + "max_price_per_unit": "0x2d79883d20000" + }, + "L2_GAS": { + "max_amount": "0x5f5e100", + "max_price_per_unit": "0xba43b7400" + } + }, + "tip": "0x0", + "paymaster_data": [], + "sender_address": "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "calldata": [ + "0x1", + "0x28c62efb55444e72ba017fd975177c3960fc62a1c213713691dff28c0a81424", + "0x382be990ca34815134e64a9ac28f41a907c62e5ad10547f97174362ab94dc89", + "0x0" + ], + "account_deployment_data": [], + "type": "INVOKE_FUNCTION" + }, + { + "transaction_hash": "0x21d28c5d64ddc242cb6337b07bff970425fc2173245660580b705c0afb4a90d", + "version": "0x1", + "max_fee": "0x11c37937e08000", + "signature": [ + "0x790c36229fac8a6bab2fb2892de6100fcbfe965079d5434354e3ba22191ab20", + "0x6d588d2c9ac82bfe07176b1cd79df19836144d1cb7eba3e3b14b1cd252449cb" + ], + "nonce": "0xe75", + "sender_address": "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "calldata": [ + "0x1", + "0x4138fd51f90d171df37e9d4419c8cdb67d525840c58f8a5c347be93a1c5277d", + "0x2468d193cd15b621b24c2a602b8dbcfa5eaa14f88416c40c09d7fd12592cb4b", + "0x0" + ], + "type": "INVOKE_FUNCTION" + } + ], + "timestamp": 1736860560, + "sequencer_address": "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8", + "transaction_receipts": [ + { + "execution_status": "SUCCEEDED", + "transaction_index": 0, + "transaction_hash": "0x45a51f77d38e6f7eab91d0545e812a3d6b60a806b38907746eeea2c327f5fec", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x376ba0d9af89e3", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 5051, + "builtin_instance_counter": { + "poseidon_builtin": 5, + "pedersen_builtin": 31, + "range_check_builtin": 205 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 256, + "l2_gas": 0 + }, + "total_gas_consumed": { + "l1_gas": 0, + "l1_data_gas": 288, + "l2_gas": 1515035 + } + }, + "actual_fee": "0x376ba0d9af89e3" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 1, + "transaction_hash": "0x20a6b5bc2fcd7c4fa68583c5714ac997da6aa512453f2dcd321ac83c402aabf", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x4676bba3b24d89", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 5588, + "builtin_instance_counter": { + "range_check_builtin": 290, + "poseidon_builtin": 7, + "pedersen_builtin": 27 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 416, + "l2_gas": 0 + }, + "total_gas_consumed": { + "l1_gas": 0, + "l1_data_gas": 480, + "l2_gas": 1158705 + } + }, + "actual_fee": "0x4676bba3b24d89" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 2, + "transaction_hash": "0x3b7869de77438959db61644b709bd771fce950ae22d9cc583153e39183e0efe", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0x277bcbedda7560", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 4459, + "builtin_instance_counter": { + "pedersen_builtin": 18, + "poseidon_builtin": 3, + "range_check_builtin": 137 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 128, + "l2_gas": 0 + }, + "total_gas_consumed": { + "l1_gas": 0, + "l1_data_gas": 128, + "l2_gas": 1599840 + } + }, + "actual_fee": "0x277bcbedda7560" + }, + { + "execution_status": "SUCCEEDED", + "transaction_index": 3, + "transaction_hash": "0x21d28c5d64ddc242cb6337b07bff970425fc2173245660580b705c0afb4a90d", + "l2_to_l1_messages": [], + "events": [ + { + "from_address": "0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7", + "keys": [ + "0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9", + "0x745d525a3582e91299d8d7c71730ffc4b1f191f5b219d800334bc0edad0983b", + "0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8" + ], + "data": [ + "0xdc24bd9e78", + "0x0" + ] + } + ], + "execution_resources": { + "n_steps": 4459, + "builtin_instance_counter": { + "range_check_builtin": 137, + "poseidon_builtin": 3, + "pedersen_builtin": 18 + }, + "n_memory_holes": 0, + "data_availability": { + "l1_gas": 0, + "l1_data_gas": 128, + "l2_gas": 0 + }, + "total_gas_consumed": { + "l1_gas": 18, + "l1_data_gas": 128, + "l2_gas": 0 + } + }, + "actual_fee": "0xdc24bd9e78" + } + ], + "starknet_version": "0.13.4" +} diff --git a/crates/starknet_client/src/reader/objects/block_test.rs b/crates/starknet_client/src/reader/objects/block_test.rs index 8e0657252ad..ae10cde001a 100644 --- a/crates/starknet_client/src/reader/objects/block_test.rs +++ b/crates/starknet_client/src/reader/objects/block_test.rs @@ -26,6 +26,7 @@ fn load_block_succeeds() { // TODO(Tzahi): Replace block_post_0_13_3 (copied from 0_13_2 and added additional fields) with // live data once available. for block_path in [ + "reader/block_post_0_13_4.json", "reader/block_post_0_13_3.json", "reader/block_post_0_13_2.json", "reader/block_post_0_13_1.json", diff --git a/crates/starknet_consensus_manager/Cargo.toml b/crates/starknet_consensus_manager/Cargo.toml index a6a4c8b16a6..607633bbdea 100644 --- a/crates/starknet_consensus_manager/Cargo.toml +++ b/crates/starknet_consensus_manager/Cargo.toml @@ -17,7 +17,9 @@ papyrus_consensus_orchestrator.workspace = true papyrus_network.workspace = true papyrus_protobuf.workspace = true serde.workspace = true +starknet_api.workspace = true starknet_batcher_types.workspace = true +starknet_infra_utils.workspace = true starknet_sequencer_infra.workspace = true starknet_state_sync_types.workspace = true tokio.workspace = true diff --git a/crates/starknet_consensus_manager/src/consensus_manager.rs b/crates/starknet_consensus_manager/src/consensus_manager.rs index 9a6991e7970..6514116a898 100644 --- a/crates/starknet_consensus_manager/src/consensus_manager.rs +++ b/crates/starknet_consensus_manager/src/consensus_manager.rs @@ -1,14 +1,16 @@ -use std::any::type_name; use std::sync::Arc; use async_trait::async_trait; use papyrus_consensus::stream_handler::StreamHandler; use papyrus_consensus::types::ConsensusError; +use papyrus_consensus_orchestrator::cende::CendeAmbassador; use papyrus_consensus_orchestrator::sequencer_consensus_context::SequencerConsensusContext; use papyrus_network::gossipsub_impl::Topic; use papyrus_network::network_manager::{BroadcastTopicChannels, NetworkManager}; use papyrus_protobuf::consensus::{ConsensusMessage, ProposalPart, StreamMessage}; +use starknet_api::block::BlockNumber; use starknet_batcher_types::communication::SharedBatcherClient; +use starknet_infra_utils::type_name::short_type_name; use starknet_sequencer_infra::component_definitions::ComponentStarter; use starknet_sequencer_infra::errors::ComponentError; use starknet_state_sync_types::communication::SharedStateSyncClient; @@ -63,20 +65,35 @@ impl ConsensusManager { let (outbound_internal_sender, inbound_internal_receiver, mut stream_handler_task_handle) = StreamHandler::get_channels(inbound_network_receiver, outbound_network_sender); + let observer_height = + self.batcher_client.get_height().await.map(|h| h.height).map_err(|e| { + error!("Failed to get height from batcher: {:?}", e); + ConsensusError::Other("Failed to get height from batcher".to_string()) + })?; + let active_height = if self.config.consensus_config.start_height == observer_height { + // Setting `start_height` is only used to enable consensus starting immediately without + // observing the first height. This means consensus may return to a height + // it has already voted on, risking equivocation. This is only safe to do if we + // restart all nodes at this height. + observer_height + } else { + BlockNumber(observer_height.0 + 1) + }; + let context = SequencerConsensusContext::new( Arc::clone(&self.batcher_client), outbound_internal_sender, votes_broadcast_channels.broadcast_topic_client.clone(), self.config.consensus_config.num_validators, self.config.consensus_config.chain_id.clone(), + Arc::new(CendeAmbassador::new()), ); let mut network_handle = tokio::task::spawn(network_manager.run()); let consensus_task = papyrus_consensus::run_consensus( context, - self.config.consensus_config.start_height, - // TODO(Asmaa): replace with the correct value. - self.config.consensus_config.start_height, + active_height, + observer_height, self.config.consensus_config.validator_id, self.config.consensus_config.consensus_delay, self.config.consensus_config.timeouts.clone(), @@ -113,7 +130,7 @@ pub fn create_consensus_manager( #[async_trait] impl ComponentStarter for ConsensusManager { async fn start(&mut self) -> Result<(), ComponentError> { - info!("Starting component {}.", type_name::()); + info!("Starting component {}.", short_type_name::()); self.run().await.map_err(|e| { error!("Error running component ConsensusManager: {:?}", e); ComponentError::InternalComponentError diff --git a/crates/starknet_gateway/Cargo.toml b/crates/starknet_gateway/Cargo.toml index 611f9e9b6cf..d1b42603809 100644 --- a/crates/starknet_gateway/Cargo.toml +++ b/crates/starknet_gateway/Cargo.toml @@ -16,6 +16,7 @@ async-trait.workspace = true axum.workspace = true blockifier = { workspace = true, features = ["testing"] } cairo-lang-starknet-classes.workspace = true +futures.workspace = true mempool_test_utils.workspace = true papyrus_config.workspace = true papyrus_network_types.workspace = true @@ -28,7 +29,8 @@ starknet_api.workspace = true starknet_gateway_types.workspace = true starknet_mempool_types.workspace = true starknet_sequencer_infra.workspace = true -starknet_sierra_compile.workspace = true +starknet_sierra_multicompile.workspace = true +starknet_state_sync_types.workspace = true thiserror.workspace = true tokio.workspace = true tracing.workspace = true @@ -40,10 +42,10 @@ cairo-lang-sierra-to-casm.workspace = true mockall.workspace = true mockito.workspace = true num-bigint.workspace = true -papyrus_network_types = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +papyrus_network_types = { path = "../papyrus_network_types", features = ["testing"] } +papyrus_test_utils.path = "../papyrus_test_utils" pretty_assertions.workspace = true rstest.workspace = true -starknet_mempool.workspace = true -starknet_mempool_types = { workspace = true, features = ["testing"] } +starknet_mempool.path = "../starknet_mempool" +starknet_mempool_types = { path = "../starknet_mempool_types", features = ["testing"] } tracing-test.workspace = true diff --git a/crates/starknet_gateway/src/compilation.rs b/crates/starknet_gateway/src/compilation.rs index b446aa7fb07..71d5da58a06 100644 --- a/crates/starknet_gateway/src/compilation.rs +++ b/crates/starknet_gateway/src/compilation.rs @@ -5,10 +5,10 @@ use cairo_lang_starknet_classes::contract_class::ContractClass as CairoLangContr use starknet_api::contract_class::{ClassInfo, ContractClass, SierraVersion}; use starknet_api::rpc_transaction::RpcDeclareTransaction; use starknet_gateway_types::errors::GatewaySpecError; -use starknet_sierra_compile::command_line_compiler::CommandLineCompiler; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; -use starknet_sierra_compile::utils::into_contract_class_for_compilation; -use starknet_sierra_compile::SierraToCasmCompiler; +use starknet_sierra_multicompile::command_line_compiler::CommandLineCompiler; +use starknet_sierra_multicompile::config::SierraCompilationConfig; +use starknet_sierra_multicompile::utils::into_contract_class_for_compilation; +use starknet_sierra_multicompile::SierraToCasmCompiler; use tracing::{debug, error}; use crate::errors::GatewayResult; @@ -24,7 +24,7 @@ pub struct GatewayCompiler { } impl GatewayCompiler { - pub fn new_command_line_compiler(config: SierraToCasmCompilationConfig) -> Self { + pub fn new_command_line_compiler(config: SierraCompilationConfig) -> Self { Self { sierra_to_casm_compiler: Arc::new(CommandLineCompiler::new(config)) } } @@ -39,12 +39,13 @@ impl GatewayCompiler { let rpc_contract_class = &tx.contract_class; let cairo_lang_contract_class = into_contract_class_for_compilation(rpc_contract_class); - let casm_contract_class = self.compile(cairo_lang_contract_class)?; - let sierra_version = SierraVersion::extract_from_program(&rpc_contract_class.sierra_program) .map_err(|e| GatewaySpecError::UnexpectedError { data: (e.to_string()) })?; + let casm_contract_class = + (self.compile(cairo_lang_contract_class)?, sierra_version.clone()); + Ok(ClassInfo { contract_class: ContractClass::V1(casm_contract_class), sierra_program_length: rpc_contract_class.sierra_program.len(), @@ -59,7 +60,9 @@ impl GatewayCompiler { ) -> GatewayResult { match self.sierra_to_casm_compiler.compile(cairo_lang_contract_class) { Ok(casm_contract_class) => Ok(casm_contract_class), - Err(starknet_sierra_compile::errors::CompilationUtilError::UnexpectedError(error)) => { + Err(starknet_sierra_multicompile::errors::CompilationUtilError::UnexpectedError( + error, + )) => { error!("Compilation panicked. Error: {:?}", error); Err(GatewaySpecError::UnexpectedError { data: "Internal server error.".to_owned() }) } diff --git a/crates/starknet_gateway/src/compilation_test.rs b/crates/starknet_gateway/src/compilation_test.rs index 0958884ee6e..d6f0b157ed6 100644 --- a/crates/starknet_gateway/src/compilation_test.rs +++ b/crates/starknet_gateway/src/compilation_test.rs @@ -10,15 +10,15 @@ use starknet_api::rpc_transaction::{ RpcTransaction, }; use starknet_gateway_types::errors::GatewaySpecError; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; -use starknet_sierra_compile::errors::CompilationUtilError; +use starknet_sierra_multicompile::config::SierraCompilationConfig; +use starknet_sierra_multicompile::errors::CompilationUtilError; use tracing_test::traced_test; use crate::compilation::GatewayCompiler; #[fixture] fn gateway_compiler() -> GatewayCompiler { - GatewayCompiler::new_command_line_compiler(SierraToCasmCompilationConfig::default()) + GatewayCompiler::new_command_line_compiler(SierraCompilationConfig::default()) } #[fixture] @@ -33,15 +33,17 @@ fn declare_tx_v3() -> RpcDeclareTransactionV3 { #[traced_test] #[rstest] fn test_compile_contract_class_bytecode_size_validation(declare_tx_v3: RpcDeclareTransactionV3) { - let gateway_compiler = - GatewayCompiler::new_command_line_compiler(SierraToCasmCompilationConfig { - max_bytecode_size: 1, - }); + let gateway_compiler = GatewayCompiler::new_command_line_compiler(SierraCompilationConfig { + max_casm_bytecode_size: 1, + ..SierraCompilationConfig::default() + }); let result = gateway_compiler.process_declare_tx(&RpcDeclareTransaction::V3(declare_tx_v3)); assert_matches!(result.unwrap_err(), GatewaySpecError::CompilationFailed); let expected_compilation_error = CompilationUtilError::CompilationError( - "Error: Compilation failed.\n\nCaused by:\n Code size limit exceeded.\n".to_owned(), + "Exit status: exit status: 1\n Stderr: Error: Compilation failed.\n\nCaused by:\n Code \ + size limit exceeded.\n" + .to_owned(), ); assert!(logs_contain(format!("Compilation failed: {:?}", expected_compilation_error).as_str())); } @@ -60,8 +62,9 @@ fn test_compile_contract_class_bad_sierra( let err = gateway_compiler.process_declare_tx(&declare_tx).unwrap_err(); assert_eq!(err, GatewaySpecError::CompilationFailed); - let expected_compilation_error = - CompilationUtilError::CompilationError("Error: Invalid Sierra program.\n".to_owned()); + let expected_compilation_error = CompilationUtilError::CompilationError( + "Exit status: exit status: 1\n Stderr: Error: Invalid Sierra program.\n".to_owned(), + ); assert!(logs_contain(format!("Compilation failed: {:?}", expected_compilation_error).as_str())); } diff --git a/crates/starknet_gateway/src/compiler_version.rs b/crates/starknet_gateway/src/compiler_version.rs index ce6fa55c23f..2b3dbcc6c40 100644 --- a/crates/starknet_gateway/src/compiler_version.rs +++ b/crates/starknet_gateway/src/compiler_version.rs @@ -5,7 +5,7 @@ use cairo_lang_starknet_classes::contract_class::version_id_from_serialized_sier use papyrus_config::dumping::{ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use serde::{Deserialize, Serialize}; -use starknet_sierra_compile::utils::sierra_program_as_felts_to_big_uint_as_hex; +use starknet_sierra_multicompile::utils::sierra_program_as_felts_to_big_uint_as_hex; use starknet_types_core::felt::Felt; use thiserror::Error; diff --git a/crates/starknet_gateway/src/gateway.rs b/crates/starknet_gateway/src/gateway.rs index 5c720b7247a..88f21ea6573 100644 --- a/crates/starknet_gateway/src/gateway.rs +++ b/crates/starknet_gateway/src/gateway.rs @@ -10,8 +10,8 @@ use starknet_gateway_types::errors::GatewaySpecError; use starknet_mempool_types::communication::{AddTransactionArgsWrapper, SharedMempoolClient}; use starknet_mempool_types::mempool_types::{AccountState, AddTransactionArgs}; use starknet_sequencer_infra::component_definitions::ComponentStarter; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; -use tracing::{error, instrument, Span}; +use starknet_sierra_multicompile::config::SierraCompilationConfig; +use tracing::{error, info, instrument, Span}; use crate::compilation::GatewayCompiler; use crate::config::{GatewayConfig, RpcStateReaderConfig}; @@ -58,12 +58,13 @@ impl Gateway { } } - #[instrument(skip(self))] + #[instrument(skip(self), ret)] pub async fn add_tx( &self, tx: RpcTransaction, p2p_message_metadata: Option, ) -> GatewayResult { + info!("Processing tx"); let blocking_task = ProcessTxBlockingTask::new(self, tx); // Run the blocking task in the current span. let curr_span = Span::current(); @@ -148,7 +149,7 @@ impl ProcessTxBlockingTask { pub fn create_gateway( config: GatewayConfig, rpc_state_reader_config: RpcStateReaderConfig, - compiler_config: SierraToCasmCompilationConfig, + compiler_config: SierraCompilationConfig, mempool_client: SharedMempoolClient, ) -> Gateway { let state_reader_factory = Arc::new(RpcStateReaderFactory { config: rpc_state_reader_config }); diff --git a/crates/starknet_gateway/src/gateway_test.rs b/crates/starknet_gateway/src/gateway_test.rs index e8502f43ae5..abcbefc01cb 100644 --- a/crates/starknet_gateway/src/gateway_test.rs +++ b/crates/starknet_gateway/src/gateway_test.rs @@ -14,7 +14,7 @@ use starknet_api::rpc_transaction::{RpcDeclareTransaction, RpcTransaction}; use starknet_gateway_types::errors::GatewaySpecError; use starknet_mempool_types::communication::{AddTransactionArgsWrapper, MockMempoolClient}; use starknet_mempool_types::mempool_types::{AccountState, AddTransactionArgs}; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; +use starknet_sierra_multicompile::config::SierraCompilationConfig; use crate::compilation::GatewayCompiler; use crate::config::{ @@ -36,7 +36,7 @@ fn config() -> GatewayConfig { #[fixture] fn compiler() -> GatewayCompiler { - GatewayCompiler::new_command_line_compiler(SierraToCasmCompilationConfig::default()) + GatewayCompiler::new_command_line_compiler(SierraCompilationConfig::default()) } #[fixture] diff --git a/crates/starknet_gateway/src/lib.rs b/crates/starknet_gateway/src/lib.rs index fe5bc05321a..057e1cef10c 100644 --- a/crates/starknet_gateway/src/lib.rs +++ b/crates/starknet_gateway/src/lib.rs @@ -13,6 +13,7 @@ pub mod state_reader; mod state_reader_test_utils; mod stateful_transaction_validator; mod stateless_transaction_validator; +mod sync_state_reader; #[cfg(test)] mod test_utils; mod utils; diff --git a/crates/starknet_gateway/src/rpc_state_reader.rs b/crates/starknet_gateway/src/rpc_state_reader.rs index 62e637a2925..e6abf8cd0a1 100644 --- a/crates/starknet_gateway/src/rpc_state_reader.rs +++ b/crates/starknet_gateway/src/rpc_state_reader.rs @@ -33,6 +33,7 @@ use crate::rpc_objects::{ }; use crate::state_reader::{MempoolStateReader, StateReaderFactory}; +#[derive(Clone)] pub struct RpcStateReader { pub config: RpcStateReaderConfig, pub block_id: BlockId, @@ -145,11 +146,12 @@ impl BlockifierStateReader for RpcStateReader { let result = self.send_rpc_request("starknet_getCompiledContractClass", get_compiled_class_params)?; - let (contract_class, _): (CompiledContractClass, SierraVersion) = + let (contract_class, sierra_version): (CompiledContractClass, SierraVersion) = serde_json::from_value(result).map_err(serde_err_to_state_err)?; match contract_class { CompiledContractClass::V1(contract_class_v1) => Ok(RunnableCompiledClass::V1( - CompiledClassV1::try_from(contract_class_v1).map_err(StateError::ProgramError)?, + CompiledClassV1::try_from((contract_class_v1, sierra_version)) + .map_err(StateError::ProgramError)?, )), CompiledContractClass::V0(contract_class_v0) => Ok(RunnableCompiledClass::V0( CompiledClassV0::try_from(contract_class_v0).map_err(StateError::ProgramError)?, diff --git a/crates/starknet_gateway/src/rpc_state_reader_test.rs b/crates/starknet_gateway/src/rpc_state_reader_test.rs index 514518636ad..cc0a915554c 100644 --- a/crates/starknet_gateway/src/rpc_state_reader_test.rs +++ b/crates/starknet_gateway/src/rpc_state_reader_test.rs @@ -173,6 +173,8 @@ async fn test_get_compiled_class() { entry_points_by_type: Default::default(), }; + let expected_sierra_version = SierraVersion::default(); + let mock = mock_rpc_interaction( &mut server, &config.json_rpc_version, @@ -193,7 +195,10 @@ async fn test_get_compiled_class() { .await .unwrap() .unwrap(); - assert_eq!(result, RunnableCompiledClass::V1(expected_result.try_into().unwrap())); + assert_eq!( + result, + RunnableCompiledClass::V1((expected_result, expected_sierra_version).try_into().unwrap()) + ); mock.assert_async().await; } diff --git a/crates/starknet_gateway/src/sync_state_reader.rs b/crates/starknet_gateway/src/sync_state_reader.rs new file mode 100644 index 00000000000..17c9dba8200 --- /dev/null +++ b/crates/starknet_gateway/src/sync_state_reader.rs @@ -0,0 +1,101 @@ +use blockifier::execution::contract_class::RunnableCompiledClass; +use blockifier::state::errors::StateError; +use blockifier::state::state_api::{StateReader as BlockifierStateReader, StateResult}; +use futures::executor::block_on; +use starknet_api::block::{BlockInfo, BlockNumber}; +use starknet_api::contract_class::ContractClass; +use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce}; +use starknet_api::state::StorageKey; +use starknet_state_sync_types::communication::SharedStateSyncClient; +use starknet_types_core::felt::Felt; + +use crate::state_reader::{MempoolStateReader, StateReaderFactory}; + +#[allow(dead_code)] +struct SyncStateReader { + block_number: BlockNumber, + state_sync_client: SharedStateSyncClient, +} + +impl SyncStateReader { + pub fn from_number( + state_sync_client: SharedStateSyncClient, + block_number: BlockNumber, + ) -> Self { + Self { block_number, state_sync_client } + } +} + +impl MempoolStateReader for SyncStateReader { + fn get_block_info(&self) -> StateResult { + todo!() + } +} + +impl BlockifierStateReader for SyncStateReader { + fn get_storage_at( + &self, + contract_address: ContractAddress, + key: StorageKey, + ) -> StateResult { + let res = block_on(self.state_sync_client.get_storage_at( + self.block_number, + contract_address, + key, + )) + .map_err(|e| StateError::StateReadError(e.to_string()))?; + + Ok(res) + } + + fn get_nonce_at(&self, contract_address: ContractAddress) -> StateResult { + let res = + block_on(self.state_sync_client.get_nonce_at(self.block_number, contract_address)) + .map_err(|e| StateError::StateReadError(e.to_string()))?; + + Ok(res) + } + + fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { + let contract_class = block_on( + self.state_sync_client.get_compiled_class_deprecated(self.block_number, class_hash), + ) + .map_err(|e| StateError::StateReadError(e.to_string()))?; + + match contract_class { + ContractClass::V1(casm_contract_class) => { + Ok(RunnableCompiledClass::V1(casm_contract_class.try_into()?)) + } + ContractClass::V0(deprecated_contract_class) => { + Ok(RunnableCompiledClass::V0(deprecated_contract_class.try_into()?)) + } + } + } + + fn get_class_hash_at(&self, contract_address: ContractAddress) -> StateResult { + let res = + block_on(self.state_sync_client.get_class_hash_at(self.block_number, contract_address)) + .map_err(|e| StateError::StateReadError(e.to_string()))?; + + Ok(res) + } + + fn get_compiled_class_hash(&self, _class_hash: ClassHash) -> StateResult { + todo!() + } +} + +pub struct SyncStateReaderFactory { + pub shared_state_sync_client: SharedStateSyncClient, +} + +impl StateReaderFactory for SyncStateReaderFactory { + // TODO(noamsp): Decide if we need this + fn get_state_reader_from_latest_block(&self) -> Box { + todo!() + } + + fn get_state_reader(&self, block_number: BlockNumber) -> Box { + Box::new(SyncStateReader::from_number(self.shared_state_sync_client.clone(), block_number)) + } +} diff --git a/crates/starknet_gateway_types/Cargo.toml b/crates/starknet_gateway_types/Cargo.toml index cc51db42a93..1cbc1ee9bd3 100644 --- a/crates/starknet_gateway_types/Cargo.toml +++ b/crates/starknet_gateway_types/Cargo.toml @@ -28,4 +28,4 @@ tracing.workspace = true [dev-dependencies] # Enable self with "testing" feature in tests. -starknet_gateway_types = { workspace = true, features = ["testing"] } +starknet_gateway_types = { path = ".", features = ["testing"] } diff --git a/crates/starknet_http_server/Cargo.toml b/crates/starknet_http_server/Cargo.toml index aab5cfec01c..c268fb755ac 100644 --- a/crates/starknet_http_server/Cargo.toml +++ b/crates/starknet_http_server/Cargo.toml @@ -19,6 +19,7 @@ reqwest = { workspace = true, optional = true } serde.workspace = true starknet_api.workspace = true starknet_gateway_types.workspace = true +starknet_infra_utils.workspace = true starknet_sequencer_infra.workspace = true thiserror.workspace = true tracing.workspace = true diff --git a/crates/starknet_http_server/src/http_server.rs b/crates/starknet_http_server/src/http_server.rs index 5ebd88c26bd..12e324fba16 100644 --- a/crates/starknet_http_server/src/http_server.rs +++ b/crates/starknet_http_server/src/http_server.rs @@ -1,4 +1,3 @@ -use std::any::type_name; use std::clone::Clone; use std::net::SocketAddr; @@ -10,6 +9,7 @@ use starknet_api::transaction::TransactionHash; use starknet_gateway_types::communication::SharedGatewayClient; use starknet_gateway_types::errors::GatewaySpecError; use starknet_gateway_types::gateway_types::GatewayInput; +use starknet_infra_utils::type_name::short_type_name; use starknet_sequencer_infra::component_definitions::ComponentStarter; use starknet_sequencer_infra::errors::ComponentError; use tracing::{error, info, instrument}; @@ -89,7 +89,7 @@ pub fn create_http_server( #[async_trait] impl ComponentStarter for HttpServer { async fn start(&mut self) -> Result<(), ComponentError> { - info!("Starting component {}.", type_name::()); + info!("Starting component {}.", short_type_name::()); self.run().await.map_err(|_| ComponentError::InternalComponentError) } } diff --git a/crates/starknet_http_server/src/test_utils.rs b/crates/starknet_http_server/src/test_utils.rs index 8faf1e302cf..e88c161404e 100644 --- a/crates/starknet_http_server/src/test_utils.rs +++ b/crates/starknet_http_server/src/test_utils.rs @@ -6,7 +6,6 @@ use starknet_api::rpc_transaction::RpcTransaction; use starknet_api::test_utils::rpc_tx_to_json; use starknet_api::transaction::TransactionHash; use starknet_gateway_types::errors::GatewaySpecError; -use starknet_sequencer_infra::test_utils::get_available_socket; use crate::config::HttpServerConfig; @@ -48,8 +47,6 @@ impl HttpTestClient { } } -pub async fn create_http_server_config() -> HttpServerConfig { - // TODO(Tsabary): use ser_generated_param. - let socket = get_available_socket().await; +pub async fn create_http_server_config(socket: SocketAddr) -> HttpServerConfig { HttpServerConfig { ip: socket.ip(), port: socket.port() } } diff --git a/crates/infra_utils/Cargo.toml b/crates/starknet_infra_utils/Cargo.toml similarity index 94% rename from crates/infra_utils/Cargo.toml rename to crates/starknet_infra_utils/Cargo.toml index c4cb9be5c95..7ee097c1a39 100644 --- a/crates/infra_utils/Cargo.toml +++ b/crates/starknet_infra_utils/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "infra_utils" +name = "starknet_infra_utils" version.workspace = true edition.workspace = true repository.workspace = true diff --git a/crates/infra_utils/src/command.rs b/crates/starknet_infra_utils/src/command.rs similarity index 100% rename from crates/infra_utils/src/command.rs rename to crates/starknet_infra_utils/src/command.rs diff --git a/crates/infra_utils/src/command_test.rs b/crates/starknet_infra_utils/src/command_test.rs similarity index 100% rename from crates/infra_utils/src/command_test.rs rename to crates/starknet_infra_utils/src/command_test.rs diff --git a/crates/infra_utils/src/lib.rs b/crates/starknet_infra_utils/src/lib.rs similarity index 77% rename from crates/infra_utils/src/lib.rs rename to crates/starknet_infra_utils/src/lib.rs index 40a4b1bf8af..129c5be816a 100644 --- a/crates/infra_utils/src/lib.rs +++ b/crates/starknet_infra_utils/src/lib.rs @@ -2,3 +2,4 @@ pub mod command; pub mod path; pub mod run_until; pub mod tracing; +pub mod type_name; diff --git a/crates/infra_utils/src/path.rs b/crates/starknet_infra_utils/src/path.rs similarity index 100% rename from crates/infra_utils/src/path.rs rename to crates/starknet_infra_utils/src/path.rs diff --git a/crates/infra_utils/src/path_test.rs b/crates/starknet_infra_utils/src/path_test.rs similarity index 100% rename from crates/infra_utils/src/path_test.rs rename to crates/starknet_infra_utils/src/path_test.rs diff --git a/crates/infra_utils/src/run_until.rs b/crates/starknet_infra_utils/src/run_until.rs similarity index 100% rename from crates/infra_utils/src/run_until.rs rename to crates/starknet_infra_utils/src/run_until.rs diff --git a/crates/infra_utils/src/run_until_test.rs b/crates/starknet_infra_utils/src/run_until_test.rs similarity index 100% rename from crates/infra_utils/src/run_until_test.rs rename to crates/starknet_infra_utils/src/run_until_test.rs diff --git a/crates/infra_utils/src/tracing.rs b/crates/starknet_infra_utils/src/tracing.rs similarity index 100% rename from crates/infra_utils/src/tracing.rs rename to crates/starknet_infra_utils/src/tracing.rs diff --git a/crates/infra_utils/src/tracing_test.rs b/crates/starknet_infra_utils/src/tracing_test.rs similarity index 100% rename from crates/infra_utils/src/tracing_test.rs rename to crates/starknet_infra_utils/src/tracing_test.rs diff --git a/crates/starknet_infra_utils/src/type_name.rs b/crates/starknet_infra_utils/src/type_name.rs new file mode 100644 index 00000000000..ffe817f865e --- /dev/null +++ b/crates/starknet_infra_utils/src/type_name.rs @@ -0,0 +1,83 @@ +use std::any::type_name; + +#[cfg(test)] +#[path = "type_name_test.rs"] +mod type_name_test; + +pub fn short_type_name() -> String { + let full_name = type_name::(); + truncate_type(full_name) +} + +/// Truncates a fully qualified Rust type name by removing module paths, leaving only the type +/// name and its generic parameters. +/// +/// # Description +/// This function processes a Rust type string containing module paths, type names, and generic +/// parameters, such as: +/// ```text +/// starknet_sequencer_infra::component_client::local_component_client::LocalComponentClient +/// ``` +/// It removes the module paths (`::module_name`) and keeps only the type name and its +/// generic parameters: +/// ```text +/// LocalComponentClient +/// ``` +/// +/// # Algorithm +/// - Iterates over the input string using a character iterator with indices. +/// - When encountering two consecutive colons (`::`), skips the preceding module path. +/// - When encountering delimiters (`<`, `,`, `>`), slices the substring from the current segment +/// start to the current index, appends it to the result, and resets the segment start. +/// - At the end, appends the remaining segment to the result. +/// +/// # Examples +/// ```rust,ignore +/// let input = "a::b::c::Type"; +/// let output = truncate_type(input); +/// assert_eq!(output, "Type"); +/// ``` +/// +/// # Panics +/// This function does not panic as it only operates on valid UTF-8 strings. +/// +/// # Complexity +/// The function runs in O(n) time, where `n` is the length of the input string. +/// +/// # Limitations +/// - The function assumes well-formed Rust type strings. Incorrectly formatted input may yield +/// unexpected results. +/// +/// # Returns +/// A new `String` with module paths removed and generic parameters preserved. +fn truncate_type(input: &str) -> String { + let mut result = String::new(); + let mut segment_start = 0; + let mut iter = input.char_indices().peekable(); + + while let Some((index, c)) = iter.next() { + if c == ':' { + if let Some((_, next_char)) = iter.peek() { + if *next_char == ':' { + // Skip the next ':' + iter.next(); + segment_start = index + 2; // Move `segment_start` after the second ':' + } + } + } else if c == '<' || c == ',' || c == '>' { + // Add the slice from `segment_start` to the current index to the result + if segment_start < index { + result.push_str(input[segment_start..index].trim()); + result.push(c); + } + segment_start = index + 1; // Move `segment_start` after the current delimiter + } + } + + // Add the final slice from `segment_start` to the end + if segment_start < input.len() { + result.push_str(input[segment_start..].trim()); + } + + result +} diff --git a/crates/starknet_infra_utils/src/type_name_test.rs b/crates/starknet_infra_utils/src/type_name_test.rs new file mode 100644 index 00000000000..c10379f61e7 --- /dev/null +++ b/crates/starknet_infra_utils/src/type_name_test.rs @@ -0,0 +1,23 @@ +use pretty_assertions::assert_eq; + +use crate::type_name::short_type_name; + +struct TestStruct {} + +struct GenericTestStruct { + _placeholder: T, +} + +mod submodule { + pub struct SubmoduleStruct {} +} + +#[test] +fn resolve_project_relative_path_success() { + assert_eq!(short_type_name::().as_str(), "TestStruct"); + assert_eq!(short_type_name::>().as_str(), "GenericTestStruct"); + assert_eq!( + short_type_name::>().as_str(), + "GenericTestStruct" + ); +} diff --git a/crates/starknet_integration_tests/Cargo.toml b/crates/starknet_integration_tests/Cargo.toml index 95a07bf215a..c5ade44ba0b 100644 --- a/crates/starknet_integration_tests/Cargo.toml +++ b/crates/starknet_integration_tests/Cargo.toml @@ -9,15 +9,14 @@ license.workspace = true workspace = true [dependencies] -anyhow.workspace = true assert_matches.workspace = true blockifier.workspace = true cairo-lang-starknet-classes.workspace = true futures.workspace = true indexmap.workspace = true -infra_utils.workspace = true mempool_test_utils.workspace = true papyrus_common.workspace = true +papyrus_config.workspace = true papyrus_consensus.workspace = true papyrus_execution.workspace = true papyrus_network = { workspace = true, features = ["testing"] } @@ -33,6 +32,7 @@ starknet_consensus_manager.workspace = true starknet_gateway = { workspace = true, features = ["testing"] } starknet_gateway_types.workspace = true starknet_http_server = { workspace = true, features = ["testing"] } +starknet_infra_utils.workspace = true starknet_mempool_p2p.workspace = true starknet_monitoring_endpoint = { workspace = true, features = ["testing"] } starknet_sequencer_infra = { workspace = true, features = ["testing"] } @@ -48,4 +48,4 @@ futures.workspace = true itertools.workspace = true pretty_assertions.workspace = true rstest.workspace = true -starknet_sequencer_infra.workspace = true +starknet_sequencer_infra.path = "../starknet_sequencer_infra" diff --git a/crates/starknet_integration_tests/src/config_utils.rs b/crates/starknet_integration_tests/src/config_utils.rs index de792df7336..82dcd367003 100644 --- a/crates/starknet_integration_tests/src/config_utils.rs +++ b/crates/starknet_integration_tests/src/config_utils.rs @@ -1,24 +1,17 @@ use std::fs::File; use std::io::Write; -use std::net::SocketAddr; use std::path::PathBuf; -use serde_json::{json, Value}; -use starknet_sequencer_infra::component_definitions::{ - LocalServerConfig, - RemoteClientConfig, - RemoteServerConfig, +use papyrus_config::dumping::{combine_config_map_and_pointers, SerializeConfig}; +use serde_json::{json, Map, Value}; +use starknet_sequencer_node::config::node_config::{ + SequencerNodeConfig, + CONFIG_NON_POINTERS_WHITELIST, + CONFIG_POINTERS, }; -use starknet_sequencer_infra::test_utils::get_available_socket; -use starknet_sequencer_node::config::component_config::ComponentConfig; -use starknet_sequencer_node::config::component_execution_config::{ - ActiveComponentExecutionConfig, - ReactiveComponentExecutionConfig, - ReactiveComponentExecutionMode, -}; -use starknet_sequencer_node::config::node_config::SequencerNodeConfig; use starknet_sequencer_node::config::test_utils::RequiredParams; use tracing::info; + // TODO(Tsabary): Move here all config-related functions from "integration_test_utils.rs". const NODE_CONFIG_CHANGES_FILE_PATH: &str = "node_integration_test_config_changes.json"; @@ -47,7 +40,7 @@ macro_rules! config_fields_to_json { }; } -/// Creates a config file for the sequencer node for the end to end integration test. +/// Creates a config file for the sequencer node for an integration test. pub(crate) fn dump_config_file_changes( config: &SequencerNodeConfig, required_params: RequiredParams, @@ -55,22 +48,30 @@ pub(crate) fn dump_config_file_changes( ) -> PathBuf { // Dump config changes file for the sequencer node. // TODO(Tsabary): auto dump the entirety of RequiredParams fields. - let json_data = config_fields_to_json!( + let required_params_json = config_fields_to_json!( required_params.chain_id, required_params.eth_fee_token_address, required_params.strk_fee_token_address, required_params.validator_id, - config.rpc_state_reader_config.url, - config.batcher_config.storage.db_config.path_prefix, - config.http_server_config.ip, - config.http_server_config.port, - config.consensus_manager_config.consensus_config.start_height, - config.state_sync_config.storage_config.db_config.path_prefix, - config.state_sync_config.network_config.tcp_port, ); - let node_config_path = dump_json_data(json_data, NODE_CONFIG_CHANGES_FILE_PATH, dir); - assert!(node_config_path.exists(), "File does not exist: {:?}", node_config_path); + // Create the entire mapping of the config and the pointers, without the required params. + let config_as_map = combine_config_map_and_pointers( + config.dump(), + &CONFIG_POINTERS, + &CONFIG_NON_POINTERS_WHITELIST, + ) + .unwrap(); + + // Extract only the required fields from the config map. + let mut preset = config_to_preset(&config_as_map); + + // Add the required params to the preset. + add_required_params_to_preset(&mut preset, &required_params_json); + + // Dump the preset to a file, return its path. + let node_config_path = dump_json_data(preset, NODE_CONFIG_CHANGES_FILE_PATH, dir); + assert!(node_config_path.exists(), "File does not exist: {:?}", node_config_path); node_config_path } @@ -96,64 +97,75 @@ fn strip_config_prefix(input: &str) -> &str { .unwrap_or(input) } -// TODO(Nadin): Refactor the following functions to be static methods of -// ReactiveComponentExecutionConfig. -pub fn get_disabled_component_config() -> ReactiveComponentExecutionConfig { - ReactiveComponentExecutionConfig { - execution_mode: ReactiveComponentExecutionMode::Disabled, - local_server_config: None, - remote_client_config: None, - remote_server_config: None, - } -} - -pub fn get_remote_component_config(socket: SocketAddr) -> ReactiveComponentExecutionConfig { - ReactiveComponentExecutionConfig { - execution_mode: ReactiveComponentExecutionMode::Remote, - local_server_config: None, - remote_client_config: Some(RemoteClientConfig { socket, ..RemoteClientConfig::default() }), - remote_server_config: None, - } -} +/// Transforms a nested JSON dictionary object into a simplified JSON dictionary object by +/// extracting specific values from the inner dictionaries. +/// +/// # Parameters +/// - `config_map`: A reference to a `serde_json::Value` that must be a JSON dictionary object. Each +/// key in the object maps to another JSON dictionary object. +/// +/// # Returns +/// - A `serde_json::Value` dictionary object where: +/// - Each key is preserved from the top-level dictionary. +/// - Each value corresponds to the `"value"` field of the nested JSON dictionary under the +/// original key. +/// +/// # Panics +/// This function panics if the provided `config_map` is not a JSON dictionary object. +fn config_to_preset(config_map: &Value) -> Value { + // Ensure the config_map is a JSON object. + if let Value::Object(map) = config_map { + let mut result = Map::new(); -pub fn get_local_with_remote_enabled_component_config( - socket: SocketAddr, -) -> ReactiveComponentExecutionConfig { - ReactiveComponentExecutionConfig { - execution_mode: ReactiveComponentExecutionMode::LocalExecutionWithRemoteEnabled, - local_server_config: Some(LocalServerConfig::default()), - remote_client_config: None, - remote_server_config: Some(RemoteServerConfig { socket }), - } -} + for (key, value) in map { + if let Value::Object(inner_map) = value { + // Extract the value. + if let Some(inner_value) = inner_map.get("value") { + // Add it to the result map + result.insert(key.clone(), inner_value.clone()); + } + } + } -pub async fn get_http_only_component_config(gateway_socket: SocketAddr) -> ComponentConfig { - ComponentConfig { - http_server: ActiveComponentExecutionConfig::default(), - gateway: get_remote_component_config(gateway_socket), - monitoring_endpoint: Default::default(), - batcher: get_disabled_component_config(), - consensus_manager: ActiveComponentExecutionConfig::disabled(), - mempool: get_disabled_component_config(), - mempool_p2p: get_disabled_component_config(), - state_sync: get_disabled_component_config(), - l1_provider: get_disabled_component_config(), + // Return the transformed result as a JSON object. + Value::Object(result) + } else { + panic!("Config map is not a JSON object: {:?}", config_map); } } -pub async fn get_non_http_component_config(gateway_socket: SocketAddr) -> ComponentConfig { - ComponentConfig { - http_server: ActiveComponentExecutionConfig::disabled(), - monitoring_endpoint: Default::default(), - gateway: get_local_with_remote_enabled_component_config(gateway_socket), - ..ComponentConfig::default() +/// Merges required parameters into an existing preset JSON object. +/// +/// # Parameters +/// - `preset`: A mutable reference to a `serde_json::Value` representing the preset. It must be a +/// JSON dictionary object where additional parameters will be added. +/// - `required_params`: A reference to a `serde_json::Value` representing the required parameters. +/// It must also be a JSON dictionary object. Its keys and values will be merged into the +/// `preset`. +/// +/// # Behavior +/// - For each key-value pair in `required_params`, the pair is inserted into `preset`. +/// - If a key already exists in `preset`, its value will be overwritten by the value from +/// `required_params`. +/// - Both `preset` and `required_params` must be JSON dictionary objects; otherwise, the function +/// panics. +/// +/// # Panics +/// This function panics if either `preset` or `required_params` is not a JSON dictionary object, or +/// if the `preset` already contains a key from the `required_params`. +fn add_required_params_to_preset(preset: &mut Value, required_params: &Value) { + if let (Value::Object(preset_map), Value::Object(required_params_map)) = + (preset, required_params) + { + for (key, value) in required_params_map { + assert!( + !preset_map.contains_key(key), + "Required parameter already exists in the preset: {:?}", + key + ); + preset_map.insert(key.clone(), value.clone()); + } + } else { + panic!("Expecting JSON object dictionary objects"); } } - -pub async fn get_remote_flow_test_config() -> Vec { - let gateway_socket = get_available_socket().await; - vec![ - get_http_only_component_config(gateway_socket).await, - get_non_http_component_config(gateway_socket).await, - ] -} diff --git a/crates/starknet_integration_tests/src/end_to_end_integration.rs b/crates/starknet_integration_tests/src/end_to_end_integration.rs index b257166de41..b9f45138b1c 100644 --- a/crates/starknet_integration_tests/src/end_to_end_integration.rs +++ b/crates/starknet_integration_tests/src/end_to_end_integration.rs @@ -1,4 +1,5 @@ -use infra_utils::run_until::run_until; +use std::net::SocketAddr; + use mempool_test_utils::starknet_api_test_utils::{AccountId, MultiAccountTransactionGenerator}; use papyrus_execution::execution_utils::get_nonce_at; use papyrus_storage::state::StateStorageReader; @@ -6,13 +7,24 @@ use papyrus_storage::StorageReader; use starknet_api::block::BlockNumber; use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::state::StateNumber; -use starknet_sequencer_node::test_utils::node_runner::{get_node_executable_path, spawn_run_node}; +use starknet_infra_utils::run_until::run_until; +use starknet_infra_utils::tracing::{CustomLogger, TraceLevel}; +use starknet_sequencer_infra::test_utils::get_available_socket; +use starknet_sequencer_node::config::component_config::ComponentConfig; +use starknet_sequencer_node::config::component_execution_config::{ + ActiveComponentExecutionConfig, + ReactiveComponentExecutionConfig, +}; +use starknet_sequencer_node::test_utils::node_runner::get_node_executable_path; use starknet_types_core::felt::Felt; use tracing::info; use crate::integration_test_setup::IntegrationTestSetup; +use crate::test_identifiers::TestIdentifier; use crate::utils::send_account_txs; +const N_SEQUENCERS: usize = 4; + /// Reads the latest block number from the storage. fn get_latest_block_number(storage_reader: &StorageReader) -> BlockNumber { let txn = storage_reader.begin_ro_txn().unwrap(); @@ -43,7 +55,12 @@ async fn await_block( let condition = |&latest_block_number: &BlockNumber| latest_block_number >= target_block_number; let get_latest_block_number_closure = || async move { get_latest_block_number(storage_reader) }; - run_until(interval, max_attempts, get_latest_block_number_closure, condition, None) + let logger = CustomLogger::new( + TraceLevel::Info, + Some("Waiting for storage to include block".to_string()), + ); + + run_until(interval, max_attempts, get_latest_block_number_closure, condition, Some(logger)) .await .ok_or(()) } @@ -56,51 +73,67 @@ pub async fn end_to_end_integration(mut tx_generator: MultiAccountTransactionGen info!("Running integration test setup."); // Creating the storage for the test. - let integration_test_setup = IntegrationTestSetup::new_from_tx_generator(&tx_generator).await; + let integration_test_setup = IntegrationTestSetup::run( + N_SEQUENCERS, + &tx_generator, + TestIdentifier::EndToEndIntegrationTest.into(), + ) + .await; - info!("Running sequencer node."); - let node_run_handle = spawn_run_node(integration_test_setup.node_config_path).await; - - // Wait for the node to start. - integration_test_setup - .is_alive_test_client - .await_alive(5000, 50) - .await - .expect("Node should be alive."); + // Wait for the nodes to start. + integration_test_setup.await_alive(5000, 50).await; info!("Running integration test simulator."); - - let send_rpc_tx_fn = - &mut |rpc_tx| integration_test_setup.add_tx_http_client.assert_add_tx_success(rpc_tx); + let send_rpc_tx_fn = &mut |rpc_tx| integration_test_setup.send_rpc_tx_fn(rpc_tx); const ACCOUNT_ID_0: AccountId = 0; let n_txs = 50; let sender_address = tx_generator.account_with_id(ACCOUNT_ID_0).sender_address(); info!("Sending {n_txs} txs."); let tx_hashes = send_account_txs(tx_generator, ACCOUNT_ID_0, n_txs, send_rpc_tx_fn).await; + assert_eq!(tx_hashes.len(), n_txs); info!("Awaiting until {EXPECTED_BLOCK_NUMBER} blocks have been created."); - let (batcher_storage_reader, _) = - papyrus_storage::open_storage(integration_test_setup.batcher_storage_config) - .expect("Failed to open batcher's storage"); + // TODO: Consider checking all sequencer storage readers. + let batcher_storage_reader = integration_test_setup.batcher_storage_reader(); - await_block(5000, EXPECTED_BLOCK_NUMBER, 15, &batcher_storage_reader) + await_block(5000, EXPECTED_BLOCK_NUMBER, 30, &batcher_storage_reader) .await .expect("Block number should have been reached."); - info!("Shutting the node down."); - node_run_handle.abort(); - let res = node_run_handle.await; - assert!( - res.expect_err("Node should have been stopped.").is_cancelled(), - "Node should have been stopped." - ); + info!("Shutting down nodes."); + integration_test_setup.shutdown_nodes(); info!("Verifying tx sender account nonce."); - let expected_nonce_value = tx_hashes.len() + 1; + let expected_nonce_value = n_txs + 1; let expected_nonce = Nonce(Felt::from_hex_unchecked(format!("0x{:X}", expected_nonce_value).as_str())); let nonce = get_account_nonce(&batcher_storage_reader, sender_address); assert_eq!(nonce, expected_nonce); } + +pub async fn get_http_only_component_config(gateway_socket: SocketAddr) -> ComponentConfig { + let mut config = ComponentConfig::disabled(); + config.http_server = ActiveComponentExecutionConfig::default(); + config.gateway = ReactiveComponentExecutionConfig::remote(gateway_socket); + config.monitoring_endpoint = ActiveComponentExecutionConfig::default(); + config +} + +async fn get_non_http_component_config(gateway_socket: SocketAddr) -> ComponentConfig { + ComponentConfig { + http_server: ActiveComponentExecutionConfig::disabled(), + monitoring_endpoint: Default::default(), + gateway: ReactiveComponentExecutionConfig::local_with_remote_enabled(gateway_socket), + ..ComponentConfig::default() + } +} + +pub async fn get_remote_test_config() -> Vec { + let gateway_socket = get_available_socket().await; + vec![ + get_http_only_component_config(gateway_socket).await, + get_non_http_component_config(gateway_socket).await, + ] +} diff --git a/crates/starknet_integration_tests/src/flow_test_setup.rs b/crates/starknet_integration_tests/src/flow_test_setup.rs index c81c68c1d6c..e3564b551a0 100644 --- a/crates/starknet_integration_tests/src/flow_test_setup.rs +++ b/crates/starknet_integration_tests/src/flow_test_setup.rs @@ -11,11 +11,13 @@ use starknet_gateway_types::errors::GatewaySpecError; use starknet_http_server::config::HttpServerConfig; use starknet_http_server::test_utils::HttpTestClient; use starknet_mempool_p2p::config::MempoolP2pConfig; +use starknet_monitoring_endpoint::config::MonitoringEndpointConfig; +use starknet_monitoring_endpoint::test_utils::IsAliveClient; +use starknet_sequencer_infra::test_utils::AvailablePorts; use starknet_sequencer_node::config::node_config::SequencerNodeConfig; use starknet_sequencer_node::servers::run_component_servers; use starknet_sequencer_node::utils::create_node_modules; use tempfile::TempDir; -use tokio::task::JoinHandle; use tracing::{debug, instrument}; use crate::state_reader::{spawn_test_rpc_state_reader, StorageTestSetup}; @@ -31,8 +33,8 @@ const SEQUENCER_1: usize = 1; const SEQUENCER_INDICES: [usize; 2] = [SEQUENCER_0, SEQUENCER_1]; pub struct FlowTestSetup { - pub sequencer_0: SequencerSetup, - pub sequencer_1: SequencerSetup, + pub sequencer_0: FlowSequencerSetup, + pub sequencer_1: FlowSequencerSetup, // Channels for consensus proposals, used for asserting the right transactions are proposed. pub consensus_proposals_channels: BroadcastTopicChannels>, @@ -40,35 +42,48 @@ pub struct FlowTestSetup { impl FlowTestSetup { #[instrument(skip(tx_generator), level = "debug")] - pub async fn new_from_tx_generator(tx_generator: &MultiAccountTransactionGenerator) -> Self { + pub async fn new_from_tx_generator( + tx_generator: &MultiAccountTransactionGenerator, + test_unique_index: u16, + ) -> Self { let chain_info = create_chain_info(); + let mut available_ports = AvailablePorts::new(test_unique_index, 0); let accounts = tx_generator.accounts(); let (consensus_manager_configs, consensus_proposals_channels) = - create_consensus_manager_configs_and_channels(SEQUENCER_INDICES.len()); + create_consensus_manager_configs_and_channels( + SEQUENCER_INDICES.len(), + &mut available_ports, + ); let [sequencer_0_consensus_manager_config, sequencer_1_consensus_manager_config]: [ConsensusManagerConfig; 2] = consensus_manager_configs.try_into().unwrap(); - let mempool_p2p_configs = - create_mempool_p2p_configs(SEQUENCER_INDICES.len(), chain_info.chain_id.clone()); + let mempool_p2p_configs = create_mempool_p2p_configs( + SEQUENCER_INDICES.len(), + chain_info.chain_id.clone(), + &mut available_ports, + ); let [sequencer_0_mempool_p2p_config, sequencer_1_mempool_p2p_config]: [MempoolP2pConfig; 2] = mempool_p2p_configs.try_into().unwrap(); // Create nodes one after the other in order to make sure the ports are not overlapping. - let sequencer_0 = SequencerSetup::new( + let sequencer_0 = FlowSequencerSetup::new( accounts.clone(), SEQUENCER_0, chain_info.clone(), sequencer_0_consensus_manager_config, sequencer_0_mempool_p2p_config, + AvailablePorts::new(test_unique_index, 1), ) .await; - let sequencer_1 = SequencerSetup::new( + + let sequencer_1 = FlowSequencerSetup::new( accounts, SEQUENCER_1, chain_info, sequencer_1_consensus_manager_config, sequencer_1_mempool_p2p_config, + AvailablePorts::new(test_unique_index, 2), ) .await; @@ -80,7 +95,7 @@ impl FlowTestSetup { } } -pub struct SequencerSetup { +pub struct FlowSequencerSetup { /// Used to differentiate between different sequencer nodes. pub sequencer_index: usize, @@ -92,13 +107,14 @@ pub struct SequencerSetup { pub rpc_storage_file_handle: TempDir, pub state_sync_storage_file_handle: TempDir, - // Handle of the sequencer node. - pub sequencer_node_handle: JoinHandle>, - + // Node configuration. pub config: SequencerNodeConfig, + + // Monitoring client. + pub is_alive_test_client: IsAliveClient, } -impl SequencerSetup { +impl FlowSequencerSetup { #[instrument(skip(accounts, chain_info, consensus_manager_config), level = "debug")] pub async fn new( accounts: Vec, @@ -106,6 +122,7 @@ impl SequencerSetup { chain_info: ChainInfo, consensus_manager_config: ConsensusManagerConfig, mempool_p2p_config: MempoolP2pConfig, + mut available_ports: AvailablePorts, ) -> Self { let storage_for_test = StorageTestSetup::new(accounts, &chain_info); @@ -118,6 +135,7 @@ impl SequencerSetup { // Derive the configuration for the sequencer node. let (config, _required_params) = create_config( + &mut available_ports, sequencer_index, chain_info, rpc_server_addr, @@ -129,20 +147,16 @@ impl SequencerSetup { .await; debug!("Sequencer config: {:#?}", config); - let (_clients, servers) = create_node_modules(&config); + let MonitoringEndpointConfig { ip, port, .. } = config.monitoring_endpoint_config; + let is_alive_test_client = IsAliveClient::new(SocketAddr::from((ip, port))); + let HttpServerConfig { ip, port } = config.http_server_config; let add_tx_http_client = HttpTestClient::new(SocketAddr::from((ip, port))); - // Build and run the sequencer node. - let sequencer_node_future = run_component_servers(servers); - let sequencer_node_handle = tokio::spawn(sequencer_node_future); - - // Wait for server to spin up. - // TODO(Gilad): Replace with a persistent Client with a built-in retry to protect against CI - // flakiness. - tokio::time::sleep(std::time::Duration::from_millis(100)).await; + // Run the sequencer node. + tokio::spawn(run_component_servers(servers)); Self { sequencer_index, @@ -150,8 +164,8 @@ impl SequencerSetup { batcher_storage_file_handle: storage_for_test.batcher_storage_handle, rpc_storage_file_handle: storage_for_test.rpc_storage_handle, state_sync_storage_file_handle: storage_for_test.state_sync_storage_handle, - sequencer_node_handle, config, + is_alive_test_client, } } diff --git a/crates/starknet_integration_tests/src/integration_test_setup.rs b/crates/starknet_integration_tests/src/integration_test_setup.rs index 8ea1f40e673..b0378fc111a 100644 --- a/crates/starknet_integration_tests/src/integration_test_setup.rs +++ b/crates/starknet_integration_tests/src/integration_test_setup.rs @@ -1,16 +1,27 @@ use std::net::SocketAddr; use std::path::PathBuf; -use mempool_test_utils::starknet_api_test_utils::MultiAccountTransactionGenerator; -use papyrus_storage::StorageConfig; +use blockifier::context::ChainInfo; +use mempool_test_utils::starknet_api_test_utils::{Contract, MultiAccountTransactionGenerator}; +use papyrus_network::network_manager::BroadcastTopicChannels; +use papyrus_protobuf::consensus::{ProposalPart, StreamMessage}; +use papyrus_storage::{StorageConfig, StorageReader}; +use starknet_api::rpc_transaction::RpcTransaction; +use starknet_api::transaction::TransactionHash; +use starknet_consensus_manager::config::ConsensusManagerConfig; use starknet_http_server::config::HttpServerConfig; use starknet_http_server::test_utils::HttpTestClient; +use starknet_mempool_p2p::config::MempoolP2pConfig; use starknet_monitoring_endpoint::config::MonitoringEndpointConfig; use starknet_monitoring_endpoint::test_utils::IsAliveClient; +use starknet_sequencer_infra::test_utils::AvailablePorts; +use starknet_sequencer_node::test_utils::node_runner::spawn_run_node; use tempfile::{tempdir, TempDir}; +use tokio::task::JoinHandle; +use tracing::{info, instrument}; use crate::config_utils::dump_config_file_changes; -use crate::state_reader::{spawn_test_rpc_state_reader, StorageTestSetup}; +use crate::state_reader::{spawn_test_rpc_state_reader_with_socket, StorageTestSetup}; use crate::utils::{ create_chain_info, create_config, @@ -18,12 +29,95 @@ use crate::utils::{ create_mempool_p2p_configs, }; -const SEQUENCER_INDEX: usize = 0; -const SEQUENCER_INDICES: [usize; 1] = [SEQUENCER_INDEX]; - pub struct IntegrationTestSetup { + pub sequencers: Vec, + pub sequencer_run_handles: Vec>, + + // TODO: To validate test results instead of reading storage - delete this and use monitoring + // or use this. + // Channels for consensus proposals, used for validating test results. + pub consensus_proposals_channels: BroadcastTopicChannels>, +} + +impl IntegrationTestSetup { + pub async fn run( + n_sequencers: usize, + tx_generator: &MultiAccountTransactionGenerator, + test_unique_index: u16, + ) -> Self { + let mut available_ports = AvailablePorts::new(test_unique_index, 0); + let chain_info = create_chain_info(); + let accounts = tx_generator.accounts(); + + let (mut consensus_manager_configs, consensus_proposals_channels) = + create_consensus_manager_configs_and_channels(n_sequencers, &mut available_ports); + let mut mempool_p2p_configs = create_mempool_p2p_configs( + n_sequencers, + chain_info.chain_id.clone(), + &mut available_ports, + ); + + let mut sequencers = vec![]; + for sequencer_id in 0..n_sequencers { + let consensus_manager_config = consensus_manager_configs.remove(0); + let mempool_p2p_config = mempool_p2p_configs.remove(0); + let sequencer = IntegrationSequencerSetup::new( + accounts.clone(), + sequencer_id, + chain_info.clone(), + consensus_manager_config, + mempool_p2p_config, + &mut available_ports, + ) + .await; + sequencers.push(sequencer); + } + + info!("Running sequencers."); + let sequencer_run_handles = sequencers + .iter() + .map(|sequencer| spawn_run_node(sequencer.node_config_path.clone())) + .collect::>(); + + Self { sequencers, sequencer_run_handles, consensus_proposals_channels } + } + + pub async fn await_alive(&self, interval: u64, max_attempts: usize) { + for (sequencer_index, sequencer) in self.sequencers.iter().enumerate() { + sequencer + .is_alive_test_client + .await_alive(interval, max_attempts) + .await + .unwrap_or_else(|_| panic!("Node {} should be alive.", sequencer_index)); + } + } + + pub async fn send_rpc_tx_fn(&self, rpc_tx: RpcTransaction) -> TransactionHash { + self.sequencers[0].assert_add_tx_success(rpc_tx).await + } + + pub fn batcher_storage_reader(&self) -> StorageReader { + let (batcher_storage_reader, _) = + papyrus_storage::open_storage(self.sequencers[0].batcher_storage_config.clone()) + .expect("Failed to open batcher's storage"); + batcher_storage_reader + } + + pub fn shutdown_nodes(&self) { + self.sequencer_run_handles.iter().for_each(|handle| { + assert!(!handle.is_finished(), "Node should still be running."); + handle.abort() + }); + } +} + +pub struct IntegrationSequencerSetup { + /// Used to differentiate between different sequencer nodes. + pub sequencer_index: usize, + // Client for adding transactions to the sequencer node. pub add_tx_http_client: HttpTestClient, + // Client for checking liveness of the sequencer node. pub is_alive_test_client: IsAliveClient, // Path to the node configuration file. @@ -45,33 +139,37 @@ pub struct IntegrationTestSetup { state_sync_storage_handle: TempDir, } -impl IntegrationTestSetup { - pub async fn new_from_tx_generator(tx_generator: &MultiAccountTransactionGenerator) -> Self { - let chain_info = create_chain_info(); +impl IntegrationSequencerSetup { + #[instrument(skip(accounts, chain_info, consensus_manager_config), level = "debug")] + pub async fn new( + accounts: Vec, + sequencer_index: usize, + chain_info: ChainInfo, + consensus_manager_config: ConsensusManagerConfig, + mempool_p2p_config: MempoolP2pConfig, + available_ports: &mut AvailablePorts, + ) -> Self { // Creating the storage for the test. - let storage_for_test = StorageTestSetup::new(tx_generator.accounts(), &chain_info); + let storage_for_test = StorageTestSetup::new(accounts, &chain_info); // Spawn a papyrus rpc server for a papyrus storage reader. - let rpc_server_addr = spawn_test_rpc_state_reader( + let rpc_server_addr = spawn_test_rpc_state_reader_with_socket( storage_for_test.rpc_storage_reader, chain_info.chain_id.clone(), + available_ports.get_next_local_host_socket(), ) .await; - let (mut consensus_manager_configs, _consensus_proposals_channels) = - create_consensus_manager_configs_and_channels(SEQUENCER_INDICES.len()); - let mut mempool_p2p_configs = - create_mempool_p2p_configs(SEQUENCER_INDICES.len(), chain_info.chain_id.clone()); - // Derive the configuration for the sequencer node. let (config, required_params) = create_config( - SEQUENCER_INDEX, + available_ports, + sequencer_index, chain_info, rpc_server_addr, storage_for_test.batcher_storage_config, storage_for_test.state_sync_storage_config, - consensus_manager_configs.pop().unwrap(), - mempool_p2p_configs.pop().unwrap(), + consensus_manager_config, + mempool_p2p_config, ) .await; @@ -89,7 +187,8 @@ impl IntegrationTestSetup { let HttpServerConfig { ip, port } = config.http_server_config; let add_tx_http_client = HttpTestClient::new(SocketAddr::from((ip, port))); - IntegrationTestSetup { + Self { + sequencer_index, add_tx_http_client, is_alive_test_client, batcher_storage_handle: storage_for_test.batcher_storage_handle, @@ -101,4 +200,8 @@ impl IntegrationTestSetup { state_sync_storage_config: config.state_sync_config.storage_config, } } + + pub async fn assert_add_tx_success(&self, tx: RpcTransaction) -> TransactionHash { + self.add_tx_http_client.assert_add_tx_success(tx).await + } } diff --git a/crates/starknet_integration_tests/src/lib.rs b/crates/starknet_integration_tests/src/lib.rs index d2555c76bdd..051acd4df21 100644 --- a/crates/starknet_integration_tests/src/lib.rs +++ b/crates/starknet_integration_tests/src/lib.rs @@ -3,4 +3,5 @@ pub mod end_to_end_integration; pub mod flow_test_setup; pub mod integration_test_setup; pub mod state_reader; +pub mod test_identifiers; pub mod utils; diff --git a/crates/starknet_integration_tests/src/state_reader.rs b/crates/starknet_integration_tests/src/state_reader.rs index 7462991e161..e75ea8cd0c2 100644 --- a/crates/starknet_integration_tests/src/state_reader.rs +++ b/crates/starknet_integration_tests/src/state_reader.rs @@ -4,15 +4,7 @@ use std::sync::Arc; use assert_matches::assert_matches; use blockifier::context::ChainInfo; use blockifier::test_utils::contracts::FeatureContract; -use blockifier::test_utils::{ - CairoVersion, - RunnableCairo1, - BALANCE, - CURRENT_BLOCK_TIMESTAMP, - DEFAULT_ETH_L1_GAS_PRICE, - DEFAULT_STRK_L1_GAS_PRICE, - TEST_SEQUENCER_ADDRESS, -}; +use blockifier::test_utils::{CairoVersion, RunnableCairo1, BALANCE}; use blockifier::versioned_constants::VersionedConstants; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use indexmap::IndexMap; @@ -39,6 +31,12 @@ use starknet_api::block::{ use starknet_api::core::{ChainId, ClassHash, ContractAddress, Nonce, SequencerContractAddress}; use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; use starknet_api::state::{SierraContractClass, StorageKey, ThinStateDiff}; +use starknet_api::test_utils::{ + CURRENT_BLOCK_TIMESTAMP, + DEFAULT_ETH_L1_GAS_PRICE, + DEFAULT_STRK_L1_GAS_PRICE, + TEST_SEQUENCER_ADDRESS, +}; use starknet_api::transaction::fields::Fee; use starknet_api::{contract_address, felt}; use starknet_client::reader::PendingData; @@ -276,17 +274,25 @@ fn test_block_header(block_number: BlockNumber) -> BlockHeader { } } -/// Spawns a papyrus rpc server for given state reader. +/// Spawns a papyrus rpc server for given state reader and chain id. /// Returns the address of the rpc server. pub async fn spawn_test_rpc_state_reader( storage_reader: StorageReader, chain_id: ChainId, ) -> SocketAddr { - let rpc_config = RpcConfig { - chain_id, - server_address: get_available_socket().await.to_string(), - ..Default::default() - }; + let socket = get_available_socket().await; + spawn_test_rpc_state_reader_with_socket(storage_reader, chain_id, socket).await; + socket +} + +/// Spawns a papyrus rpc server for given state reader, chain id, and socket address. +pub async fn spawn_test_rpc_state_reader_with_socket( + storage_reader: StorageReader, + chain_id: ChainId, + socket: SocketAddr, +) -> SocketAddr { + let rpc_config = + RpcConfig { chain_id, server_address: socket.to_string(), ..Default::default() }; let (addr, handle) = run_server( &rpc_config, Arc::new(RwLock::new(None)), diff --git a/crates/starknet_integration_tests/src/test_identifiers.rs b/crates/starknet_integration_tests/src/test_identifiers.rs new file mode 100644 index 00000000000..9ec041c6e9c --- /dev/null +++ b/crates/starknet_integration_tests/src/test_identifiers.rs @@ -0,0 +1,18 @@ +#[derive(Debug)] +pub enum TestIdentifier { + EndToEndIntegrationTest, + EndToEndFlowTest, + MempoolSendsTxToOtherPeerTest, + MempoolReceivesTxFromOtherPeerTest, +} + +impl From for u16 { + fn from(variant: TestIdentifier) -> Self { + match variant { + TestIdentifier::EndToEndIntegrationTest => 0, + TestIdentifier::EndToEndFlowTest => 1, + TestIdentifier::MempoolSendsTxToOtherPeerTest => 2, + TestIdentifier::MempoolReceivesTxFromOtherPeerTest => 3, + } + } +} diff --git a/crates/starknet_integration_tests/src/utils.rs b/crates/starknet_integration_tests/src/utils.rs index 3ebd43355ee..f05a6793e3b 100644 --- a/crates/starknet_integration_tests/src/utils.rs +++ b/crates/starknet_integration_tests/src/utils.rs @@ -7,17 +7,16 @@ use blockifier::test_utils::contracts::FeatureContract; use blockifier::test_utils::{CairoVersion, RunnableCairo1}; use mempool_test_utils::starknet_api_test_utils::{AccountId, MultiAccountTransactionGenerator}; use papyrus_consensus::config::ConsensusConfig; -use papyrus_consensus::types::{ValidatorId, DEFAULT_VALIDATOR_ID}; +use papyrus_consensus::types::ValidatorId; use papyrus_network::network_manager::test_utils::{ create_connected_network_configs, create_network_configs_connected_to_broadcast_channels, }; use papyrus_network::network_manager::BroadcastTopicChannels; -use papyrus_network::NetworkConfig; use papyrus_protobuf::consensus::{ProposalPart, StreamMessage}; use papyrus_storage::StorageConfig; use starknet_api::block::BlockNumber; -use starknet_api::core::{ChainId, ContractAddress}; +use starknet_api::core::ChainId; use starknet_api::rpc_transaction::RpcTransaction; use starknet_api::transaction::TransactionHash; use starknet_batcher::block_builder::BlockBuilderConfig; @@ -30,17 +29,15 @@ use starknet_gateway::config::{ StatelessTransactionValidatorConfig, }; use starknet_http_server::config::HttpServerConfig; +use starknet_http_server::test_utils::create_http_server_config; use starknet_mempool_p2p::config::MempoolP2pConfig; use starknet_monitoring_endpoint::config::MonitoringEndpointConfig; -use starknet_sequencer_infra::test_utils::get_available_socket; +use starknet_sequencer_infra::test_utils::{get_available_socket, AvailablePorts}; use starknet_sequencer_node::config::node_config::SequencerNodeConfig; use starknet_sequencer_node::config::test_utils::RequiredParams; use starknet_state_sync::config::StateSyncConfig; use starknet_types_core::felt::Felt; -// TODO(Tsabary): Get rid of this constant once we have a better way to set the port for testing. -const STATE_SYNC_NETWORK_CONFIG_TCP_PORT_FOR_TESTING: u16 = 12345; - pub fn create_chain_info() -> ChainInfo { let mut chain_info = ChainInfo::create_for_testing(); // Note that the chain_id affects hashes of transactions and blocks, therefore affecting the @@ -49,9 +46,12 @@ pub fn create_chain_info() -> ChainInfo { chain_info } +// TODO(Tsabary/Shahak/Yair/AlonH): this function needs a proper cleaning. // TODO(yair, Tsabary): Create config presets for tests, then remove all the functions that modify // the config. +#[allow(clippy::too_many_arguments)] pub async fn create_config( + available_ports: &mut AvailablePorts, sequencer_index: usize, chain_info: ChainInfo, rpc_server_addr: SocketAddr, @@ -60,14 +60,17 @@ pub async fn create_config( mut consensus_manager_config: ConsensusManagerConfig, mempool_p2p_config: MempoolP2pConfig, ) -> (SequencerNodeConfig, RequiredParams) { - set_validator_id(&mut consensus_manager_config, sequencer_index); + let validator_id = set_validator_id(&mut consensus_manager_config, sequencer_index); let fee_token_addresses = chain_info.fee_token_addresses.clone(); let batcher_config = create_batcher_config(batcher_storage_config, chain_info.clone()); let gateway_config = create_gateway_config(chain_info.clone()).await; - let http_server_config = create_http_server_config().await; + let http_server_config = + create_http_server_config(available_ports.get_next_local_host_socket()).await; let rpc_state_reader_config = test_rpc_state_reader_config(rpc_server_addr); - let monitoring_endpoint_config = create_monitoring_endpoint_config(sequencer_index); - let state_sync_config = create_state_sync_config(state_sync_storage_config, sequencer_index); + let monitoring_endpoint_config = + MonitoringEndpointConfig { port: available_ports.get_next_port(), ..Default::default() }; + let state_sync_config = + create_state_sync_config(state_sync_storage_config, available_ports.get_next_port()); ( SequencerNodeConfig { @@ -85,13 +88,14 @@ pub async fn create_config( chain_id: chain_info.chain_id, eth_fee_token_address: fee_token_addresses.eth_fee_token_address, strk_fee_token_address: fee_token_addresses.strk_fee_token_address, - validator_id: ContractAddress::from(DEFAULT_VALIDATOR_ID), + validator_id, }, ) } pub fn create_consensus_manager_configs_and_channels( n_managers: usize, + available_ports: &mut AvailablePorts, ) -> (Vec, BroadcastTopicChannels>) { let (network_configs, broadcast_channels) = create_network_configs_connected_to_broadcast_channels( @@ -99,6 +103,7 @@ pub fn create_consensus_manager_configs_and_channels( papyrus_network::gossipsub_impl::Topic::new( starknet_consensus_manager::consensus_manager::CONSENSUS_PROPOSALS_TOPIC, ), + available_ports, ); // TODO: Need to also add a channel for votes, in addition to the proposals channel. @@ -115,7 +120,7 @@ pub fn create_consensus_manager_configs_and_channels( consensus_config: ConsensusConfig { start_height: BlockNumber(1), // TODO(Matan, Dan): Set the right amount - consensus_delay: Duration::from_secs(5), + consensus_delay: Duration::from_secs(15), network_config, num_validators: u64::try_from(n_managers).unwrap(), timeouts: timeouts.clone(), @@ -133,8 +138,12 @@ pub fn test_rpc_state_reader_config(rpc_server_addr: SocketAddr) -> RpcStateRead RpcStateReaderConfig::from_url(format!("http://{rpc_server_addr:?}/rpc/{RPC_SPEC_VERSION}")) } -pub fn create_mempool_p2p_configs(n_mempools: usize, chain_id: ChainId) -> Vec { - create_connected_network_configs(n_mempools) +pub fn create_mempool_p2p_configs( + n_mempools: usize, + chain_id: ChainId, + available_ports: &mut AvailablePorts, +) -> Vec { + create_connected_network_configs(n_mempools, available_ports) .into_iter() .map(|mut network_config| { network_config.chain_id = chain_id.clone(); @@ -232,7 +241,7 @@ pub async fn send_account_txs<'a, Fut>( where Fut: Future + 'a, { - let rpc_txs = create_account_txs(tx_generator, n_txs, account_id); + let rpc_txs = create_account_txs(tx_generator, account_id, n_txs); send_rpc_txs(rpc_txs, send_rpc_tx_fn).await } @@ -248,7 +257,8 @@ pub async fn create_gateway_config(chain_info: ChainInfo) -> GatewayConfig { GatewayConfig { stateless_tx_validator_config, stateful_tx_validator_config, chain_info } } -pub async fn create_http_server_config() -> HttpServerConfig { +// TODO(Tsabary): deprecate this function. +pub async fn create_http_server_config_to_be_deprecated() -> HttpServerConfig { // TODO(Tsabary): use ser_generated_param. let socket = get_available_socket().await; HttpServerConfig { ip: socket.ip(), port: socket.port() } @@ -266,31 +276,25 @@ pub fn create_batcher_config( } } -fn set_validator_id(consensus_manager_config: &mut ConsensusManagerConfig, sequencer_index: usize) { - consensus_manager_config.consensus_config.validator_id = ValidatorId::try_from( +fn set_validator_id( + consensus_manager_config: &mut ConsensusManagerConfig, + sequencer_index: usize, +) -> ValidatorId { + let validator_id = ValidatorId::try_from( Felt::from(consensus_manager_config.consensus_config.validator_id) + Felt::from(sequencer_index), ) .unwrap(); + consensus_manager_config.consensus_config.validator_id = validator_id; + validator_id } -fn create_monitoring_endpoint_config(sequencer_index: usize) -> MonitoringEndpointConfig { - let mut config = MonitoringEndpointConfig::default(); - config.port += u16::try_from(sequencer_index).unwrap(); - config -} - -pub fn create_state_sync_config( +fn create_state_sync_config( state_sync_storage_config: StorageConfig, - sequencer_index: usize, + port: u16, ) -> StateSyncConfig { - StateSyncConfig { - storage_config: state_sync_storage_config, - network_config: NetworkConfig { - tcp_port: STATE_SYNC_NETWORK_CONFIG_TCP_PORT_FOR_TESTING - + u16::try_from(sequencer_index).unwrap(), - ..Default::default() - }, - ..Default::default() - } + let mut config = + StateSyncConfig { storage_config: state_sync_storage_config, ..Default::default() }; + config.network_config.tcp_port = port; + config } diff --git a/crates/starknet_integration_tests/tests/end_to_end_flow_test.rs b/crates/starknet_integration_tests/tests/end_to_end_flow_test.rs index 64b1fc20478..6b350485c34 100644 --- a/crates/starknet_integration_tests/tests/end_to_end_flow_test.rs +++ b/crates/starknet_integration_tests/tests/end_to_end_flow_test.rs @@ -16,7 +16,8 @@ use pretty_assertions::assert_eq; use rstest::{fixture, rstest}; use starknet_api::block::{BlockHash, BlockNumber}; use starknet_api::transaction::TransactionHash; -use starknet_integration_tests::flow_test_setup::FlowTestSetup; +use starknet_integration_tests::flow_test_setup::{FlowSequencerSetup, FlowTestSetup}; +use starknet_integration_tests::test_identifiers::TestIdentifier; use starknet_integration_tests::utils::{ create_integration_test_tx_generator, run_integration_test_scenario, @@ -41,16 +42,25 @@ async fn end_to_end_flow(mut tx_generator: MultiAccountTransactionGenerator) { const LISTEN_TO_BROADCAST_MESSAGES_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(50); // Setup. - let mut mock_running_system = FlowTestSetup::new_from_tx_generator(&tx_generator).await; + let mut mock_running_system = FlowTestSetup::new_from_tx_generator( + &tx_generator, + TestIdentifier::EndToEndFlowTest.into(), + ) + .await; + + tokio::join!( + wait_for_sequencer_node(&mock_running_system.sequencer_0), + wait_for_sequencer_node(&mock_running_system.sequencer_1), + ); let next_height = INITIAL_HEIGHT.unchecked_next(); let heights_to_build = next_height.iter_up_to(LAST_HEIGHT.unchecked_next()); let expected_content_ids = [ Felt::from_hex_unchecked( - "0x457e9172b9c70fb4363bb3ff31bf778d8f83828184a9a3f9badadc497f2b954", + "0x58ad05a6987a675eda038663d8e7dcc8e1d91c9057dd57f16d9b3b9602fc840", ), Felt::from_hex_unchecked( - "0x572373fe992ac8c2413d5e727036316023ed6a2e8a2256b4952e223969e0221", + "0x79b59c5036c9427b5194796ede67bdfffed1f311a77382d715174fcfcc33003", ), ]; @@ -93,6 +103,10 @@ async fn end_to_end_flow(mut tx_generator: MultiAccountTransactionGenerator) { } } +async fn wait_for_sequencer_node(sequencer: &FlowSequencerSetup) { + sequencer.is_alive_test_client.await_alive(5000, 50).await.expect("Node should be alive."); +} + async fn listen_to_broadcasted_messages( consensus_proposals_channels: &mut BroadcastTopicChannels>, expected_batched_tx_hashes: &[TransactionHash], @@ -106,9 +120,8 @@ async fn listen_to_broadcasted_messages( // TODO (Dan, Guy): retrieve / calculate the expected proposal init and fin. let expected_proposal_init = ProposalInit { height: expected_height, - round: 0, - valid_round: None, proposer: expected_proposer_id, + ..Default::default() }; let expected_proposal_fin = ProposalFin { proposal_content_id: BlockHash(expected_content_id) }; diff --git a/crates/starknet_integration_tests/tests/mempool_p2p_flow_test.rs b/crates/starknet_integration_tests/tests/mempool_p2p_flow_test.rs index 32977ceadad..7b7d60fb6e6 100644 --- a/crates/starknet_integration_tests/tests/mempool_p2p_flow_test.rs +++ b/crates/starknet_integration_tests/tests/mempool_p2p_flow_test.rs @@ -19,17 +19,21 @@ use starknet_api::transaction::TransactionHash; use starknet_http_server::config::HttpServerConfig; use starknet_http_server::test_utils::HttpTestClient; use starknet_integration_tests::state_reader::{spawn_test_rpc_state_reader, StorageTestSetup}; +use starknet_integration_tests::test_identifiers::TestIdentifier; use starknet_integration_tests::utils::{ create_batcher_config, create_chain_info, create_gateway_config, - create_http_server_config, + create_http_server_config_to_be_deprecated, create_integration_test_tx_generator, run_integration_test_scenario, test_rpc_state_reader_config, }; use starknet_mempool_p2p::config::MempoolP2pConfig; use starknet_mempool_p2p::MEMPOOL_TOPIC; +use starknet_monitoring_endpoint::config::MonitoringEndpointConfig; +use starknet_monitoring_endpoint::test_utils::IsAliveClient; +use starknet_sequencer_infra::test_utils::AvailablePorts; use starknet_sequencer_node::config::component_config::ComponentConfig; use starknet_sequencer_node::config::component_execution_config::{ ActiveComponentExecutionConfig, @@ -45,13 +49,15 @@ fn tx_generator() -> MultiAccountTransactionGenerator { create_integration_test_tx_generator() } -// TODO: remove code duplication with FlowTestSetup +// TODO(Shahak/AlonLukatch): remove code duplication with FlowTestSetup. async fn setup( tx_generator: &MultiAccountTransactionGenerator, + test_identifier: TestIdentifier, ) -> (SequencerNodeConfig, BroadcastTopicChannels) { let accounts = tx_generator.accounts(); let chain_info = create_chain_info(); let storage_for_test = StorageTestSetup::new(accounts, &chain_info); + let mut available_ports = AvailablePorts::new(test_identifier.into(), 0); // Spawn a papyrus rpc server for a papyrus storage reader. let rpc_server_addr = spawn_test_rpc_state_reader( @@ -79,12 +85,13 @@ async fn setup( let batcher_config = create_batcher_config(storage_for_test.batcher_storage_config, chain_info.clone()); let gateway_config = create_gateway_config(chain_info).await; - let http_server_config = create_http_server_config().await; + let http_server_config = create_http_server_config_to_be_deprecated().await; let rpc_state_reader_config = test_rpc_state_reader_config(rpc_server_addr); let (mut network_configs, broadcast_channels) = create_network_configs_connected_to_broadcast_channels::( 1, Topic::new(MEMPOOL_TOPIC), + &mut available_ports, ); let network_config = network_configs.pop().unwrap(); let mempool_p2p_config = MempoolP2pConfig { network_config, ..Default::default() }; @@ -100,10 +107,18 @@ async fn setup( (config, broadcast_channels) } +async fn wait_for_sequencer_node(config: &SequencerNodeConfig) { + let MonitoringEndpointConfig { ip, port, .. } = config.monitoring_endpoint_config; + let is_alive_test_client = IsAliveClient::new(SocketAddr::from((ip, port))); + + is_alive_test_client.await_alive(5000, 50).await.expect("Node should be alive."); +} + #[rstest] #[tokio::test] async fn test_mempool_sends_tx_to_other_peer(mut tx_generator: MultiAccountTransactionGenerator) { - let (config, mut broadcast_channels) = setup(&tx_generator).await; + let (config, mut broadcast_channels) = + setup(&tx_generator, TestIdentifier::MempoolSendsTxToOtherPeerTest).await; let (_clients, servers) = create_node_modules(&config); let HttpServerConfig { ip, port } = config.http_server_config; @@ -114,9 +129,7 @@ async fn test_mempool_sends_tx_to_other_peer(mut tx_generator: MultiAccountTrans let _sequencer_node_handle = tokio::spawn(sequencer_node_future); // Wait for server to spin up and for p2p to discover other peer. - // TODO(Gilad): Replace with a persistent Client with a built-in retry to protect against CI - // flakiness. - tokio::time::sleep(std::time::Duration::from_millis(1000)).await; + wait_for_sequencer_node(&config).await; let mut expected_txs = HashSet::new(); @@ -143,16 +156,15 @@ async fn test_mempool_receives_tx_from_other_peer( const RECEIVED_TX_POLL_INTERVAL: u64 = 100; // milliseconds between calls to read received txs from the broadcast channel const TXS_RETRIVAL_TIMEOUT: u64 = 2000; // max milliseconds spent polling the received txs before timing out - let (config, mut broadcast_channels) = setup(&tx_generator).await; + let (config, mut broadcast_channels) = + setup(&tx_generator, TestIdentifier::MempoolReceivesTxFromOtherPeerTest).await; let (clients, servers) = create_node_modules(&config); let mempool_client = clients.get_mempool_shared_client().unwrap(); // Build and run the sequencer node. let sequencer_node_future = run_component_servers(servers); let _sequencer_node_handle = tokio::spawn(sequencer_node_future); // Wait for server to spin up and for p2p to discover other peer. - // TODO(Gilad): Replace with a persistent Client with a built-in retry to protect against CI - // flakiness. - tokio::time::sleep(std::time::Duration::from_millis(1000)).await; + wait_for_sequencer_node(&config).await; let mut expected_txs = HashSet::new(); diff --git a/crates/starknet_l1_provider/Cargo.toml b/crates/starknet_l1_provider/Cargo.toml index 89e98570a6e..bad709ee296 100644 --- a/crates/starknet_l1_provider/Cargo.toml +++ b/crates/starknet_l1_provider/Cargo.toml @@ -24,7 +24,7 @@ validator.workspace = true [dev-dependencies] assert_matches.workspace = true pretty_assertions.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } [lints] workspace = true diff --git a/crates/starknet_mempool/Cargo.toml b/crates/starknet_mempool/Cargo.toml index 7e1f90a524c..c408c3fe54b 100644 --- a/crates/starknet_mempool/Cargo.toml +++ b/crates/starknet_mempool/Cargo.toml @@ -26,14 +26,14 @@ tracing.workspace = true assert_matches.workspace = true itertools.workspace = true mockall.workspace = true -papyrus_network = { workspace = true, features = ["testing"] } -papyrus_network_types = { workspace = true, features = ["testing"] } -papyrus_test_utils.workspace = true +papyrus_network = { path = "../papyrus_network", features = ["testing"] } +papyrus_network_types = { path = "../papyrus_network_types", features = ["testing"] } +papyrus_test_utils.path = "../papyrus_test_utils" rstest.workspace = true -starknet_api = { workspace = true, features = ["testing"] } +starknet_api = { path = "../starknet_api", features = ["testing"] } # Enable test utils feature for integration tests. -starknet_mempool = { workspace = true, features = ["testing"] } -starknet_mempool_p2p_types = { workspace = true, features = ["testing"] } +starknet_mempool = { path = ".", features = ["testing"] } +starknet_mempool_p2p_types = { path = "../starknet_mempool_p2p_types", features = ["testing"] } [features] testing = ["mempool_test_utils", "pretty_assertions", "starknet-types-core"] diff --git a/crates/starknet_mempool/src/mempool.rs b/crates/starknet_mempool/src/mempool.rs index 2962e47ba91..0cfab9b7b12 100644 --- a/crates/starknet_mempool/src/mempool.rs +++ b/crates/starknet_mempool/src/mempool.rs @@ -12,6 +12,7 @@ use starknet_mempool_types::mempool_types::{ CommitBlockArgs, MempoolResult, }; +use tracing::{debug, info, instrument}; use crate::transaction_pool::TransactionPool; use crate::transaction_queue::TransactionQueue; @@ -154,7 +155,7 @@ impl Mempool { /// Transactions are guaranteed to be unique across calls until the block in-progress is /// created. // TODO: Consider renaming to `pop_txs` to be more consistent with the standard library. - #[tracing::instrument(skip(self), err)] + #[instrument(skip(self), err)] pub fn get_txs(&mut self, n_txs: usize) -> MempoolResult> { let mut eligible_tx_references: Vec = Vec::with_capacity(n_txs); let mut n_remaining_txs = n_txs; @@ -171,7 +172,7 @@ impl Mempool { self.state.stage(tx_reference)?; } - tracing::debug!( + info!( "Returned {} out of {n_txs} transactions, ready for sequencing.", eligible_tx_references.len() ); @@ -188,7 +189,7 @@ impl Mempool { } /// Adds a new transaction to the mempool. - #[tracing::instrument( + #[instrument( skip(self, args), fields( // Log subset of (informative) fields. tx_nonce = %args.tx.nonce(), @@ -201,6 +202,7 @@ impl Mempool { )] pub fn add_tx(&mut self, args: AddTransactionArgs) -> MempoolResult<()> { let AddTransactionArgs { tx, account_state } = args; + debug!("Adding transaction to mempool: {tx:#?}."); let tx_reference = TransactionReference::new(&tx); self.validate_incoming_tx(tx_reference)?; @@ -220,10 +222,10 @@ impl Mempool { /// Update the mempool's internal state according to the committed block (resolves nonce gaps, /// updates account balances). - #[tracing::instrument(skip(self, args), err)] + #[instrument(skip(self, args), err)] pub fn commit_block(&mut self, args: CommitBlockArgs) -> MempoolResult<()> { let CommitBlockArgs { address_to_nonce, tx_hashes } = args; - tracing::debug!("Committing block with {} transactions to mempool.", tx_hashes.len()); + debug!("Committing block with {} transactions to mempool.", tx_hashes.len()); // Align mempool data to committed nonces. for (&address, &next_nonce) in &address_to_nonce { @@ -264,7 +266,7 @@ impl Mempool { self.tx_queue.insert(*tx_reference); } - tracing::debug!("Aligned mempool to committed nonces."); + debug!("Aligned mempool to committed nonces."); // Hard-delete: finally, remove committed transactions from the mempool. for tx_hash in tx_hashes { @@ -275,7 +277,7 @@ impl Mempool { // TODO(clean_accounts): remove address with no transactions left after a block cycle / // TTL. } - tracing::debug!("Removed committed transactions known to mempool."); + debug!("Removed committed transactions known to mempool."); Ok(()) } @@ -307,7 +309,7 @@ impl Mempool { Ok(()) } - #[tracing::instrument(level = "debug", skip(self, incoming_tx), err)] + #[instrument(level = "debug", skip(self, incoming_tx), err)] fn handle_fee_escalation(&mut self, incoming_tx: &AccountTransaction) -> MempoolResult<()> { let incoming_tx_reference = TransactionReference::new(incoming_tx); let TransactionReference { address, nonce, .. } = incoming_tx_reference; @@ -327,7 +329,7 @@ impl Mempool { }; if !self.should_replace_tx(&existing_tx_reference, &incoming_tx_reference) { - tracing::debug!( + debug!( "{existing_tx_reference} was not replaced by {incoming_tx_reference} due to insufficient fee escalation." ); @@ -335,7 +337,7 @@ impl Mempool { return Err(MempoolError::DuplicateNonce { address, nonce }); } - tracing::debug!("{existing_tx_reference} will be replaced by {incoming_tx_reference}."); + debug!("{existing_tx_reference} will be replaced by {incoming_tx_reference}."); self.tx_queue.remove(address); self.tx_pool diff --git a/crates/starknet_mempool/src/mempool_test.rs b/crates/starknet_mempool/src/mempool_test.rs index be73d6a8af3..5517b90b663 100644 --- a/crates/starknet_mempool/src/mempool_test.rs +++ b/crates/starknet_mempool/src/mempool_test.rs @@ -141,6 +141,30 @@ impl FromIterator for TransactionPool { } } +#[track_caller] +fn builder_with_queue( + in_priority_queue: bool, + in_pending_queue: bool, + tx: &AccountTransaction, +) -> MempoolContentBuilder { + assert!( + !(in_priority_queue && in_pending_queue), + "A transaction can be in at most one queue at a time." + ); + + let mut builder = MempoolContentBuilder::new(); + + if in_priority_queue { + builder = builder.with_priority_queue([TransactionReference::new(tx)]); + } + + if in_pending_queue { + builder = builder.with_pending_queue([TransactionReference::new(tx)]); + } + + builder +} + #[track_caller] fn add_tx_and_verify_replacement( mut mempool: Mempool, @@ -148,21 +172,12 @@ fn add_tx_and_verify_replacement( in_priority_queue: bool, in_pending_queue: bool, ) { - // Ensure that the transaction is not in both queues. - assert!(!(in_priority_queue && in_pending_queue)); - add_tx(&mut mempool, &valid_replacement_input); // Verify transaction was replaced. - let mut builder = MempoolContentBuilder::new(); - if in_priority_queue { - builder = - builder.with_priority_queue([TransactionReference::new(&valid_replacement_input.tx)]); - } - if in_pending_queue { - builder = - builder.with_pending_queue([TransactionReference::new(&valid_replacement_input.tx)]); - } + let builder = + builder_with_queue(in_priority_queue, in_pending_queue, &valid_replacement_input.tx); + let expected_mempool_content = builder.with_pool([valid_replacement_input.tx]).build(); expected_mempool_content.assert_eq(&mempool); } @@ -187,6 +202,8 @@ fn add_txs_and_verify_no_replacement( mut mempool: Mempool, existing_tx: AccountTransaction, invalid_replacement_inputs: impl IntoIterator, + in_priority_queue: bool, + in_pending_queue: bool, ) { for input in invalid_replacement_inputs { add_tx_expect_error( @@ -200,10 +217,29 @@ fn add_txs_and_verify_no_replacement( } // Verify transaction was not replaced. - let expected_mempool_content = MempoolContentBuilder::new().with_pool([existing_tx]).build(); + let builder = builder_with_queue(in_priority_queue, in_pending_queue, &existing_tx); + + let expected_mempool_content = builder.with_pool([existing_tx]).build(); expected_mempool_content.assert_eq(&mempool); } +#[track_caller] +fn add_txs_and_verify_no_replacement_in_pool( + mempool: Mempool, + existing_tx: AccountTransaction, + invalid_replacement_inputs: impl IntoIterator, +) { + let in_priority_queue = false; + let in_pending_queue = false; + add_txs_and_verify_no_replacement( + mempool, + existing_tx, + invalid_replacement_inputs, + in_priority_queue, + in_pending_queue, + ); +} + // Fixtures. #[fixture] @@ -220,7 +256,7 @@ fn mempool() -> Mempool { #[case::test_get_exactly_all_eligible_txs(3)] #[case::test_get_more_than_all_eligible_txs(5)] #[case::test_get_less_than_all_eligible_txs(2)] -fn test_get_txs_returns_by_priority_order(#[case] n_requested_txs: usize) { +fn test_get_txs_returns_by_priority(#[case] n_requested_txs: usize) { // Setup. let tx_tip_20 = tx!(tx_hash: 1, address: "0x0", tip: 20); let tx_tip_30 = tx!(tx_hash: 2, address: "0x1", tip: 30); @@ -248,6 +284,21 @@ fn test_get_txs_returns_by_priority_order(#[case] n_requested_txs: usize) { expected_mempool_content.assert_eq(&mempool); } +#[rstest] +fn test_get_txs_returns_by_secondary_priority_on_tie() { + // Setup. + let tx_tip_10_hash_9 = tx!(tx_hash: 9, address: "0x2", tip: 10); + let tx_tip_10_hash_15 = tx!(tx_hash: 15, address: "0x0", tip: 10); + + let mut mempool = MempoolContentBuilder::new() + .with_pool([&tx_tip_10_hash_9, &tx_tip_10_hash_15].map(|tx| tx.clone())) + .with_priority_queue([&tx_tip_10_hash_9, &tx_tip_10_hash_15].map(TransactionReference::new)) + .build_into_mempool(); + + // Test and assert. + get_txs_and_assert_expected(&mut mempool, 2, &[tx_tip_10_hash_15, tx_tip_10_hash_9]); +} + #[rstest] fn test_get_txs_does_not_return_pending_txs() { // Setup. @@ -330,10 +381,12 @@ fn test_get_txs_with_nonce_gap() { // `add_tx` tests. #[rstest] -fn test_add_tx(mut mempool: Mempool) { +fn test_add_tx_insertion_sorted_by_priority(mut mempool: Mempool) { // Setup. let input_tip_50 = add_tx_input!(tx_hash: 1, address: "0x0", tx_nonce: 0, account_nonce: 0, tip: 50); + // The following transactions test a scenario with a higher tip and lower hash, covering + // both primary and secondary priority. let input_tip_100 = add_tx_input!(tx_hash: 2, address: "0x1", tx_nonce: 1, account_nonce: 1, tip: 100); let input_tip_80 = @@ -347,11 +400,8 @@ fn test_add_tx(mut mempool: Mempool) { // Assert: transactions are ordered by priority. let expected_queue_txs = [&input_tip_100.tx, &input_tip_80.tx, &input_tip_50.tx].map(TransactionReference::new); - let expected_pool_txs = [input_tip_50.tx, input_tip_100.tx, input_tip_80.tx]; - let expected_mempool_content = MempoolContentBuilder::new() - .with_pool(expected_pool_txs) - .with_priority_queue(expected_queue_txs) - .build(); + let expected_mempool_content = + MempoolContentBuilder::new().with_priority_queue(expected_queue_txs).build(); expected_mempool_content.assert_eq(&mempool); } @@ -384,7 +434,7 @@ fn test_add_tx_correctly_places_txs_in_queue_and_pool(mut mempool: Mempool) { // TODO(Elin): reconsider this test in a more realistic scenario. #[rstest] -fn test_add_tx_failure_on_duplicate_tx_hash(mut mempool: Mempool) { +fn test_add_tx_rejects_duplicate_tx_hash(mut mempool: Mempool) { // Setup. let input = add_tx_input!(tx_hash: 1, tx_nonce: 1, account_nonce: 0); // Same hash is possible if signature is different, for example. @@ -406,25 +456,21 @@ fn test_add_tx_failure_on_duplicate_tx_hash(mut mempool: Mempool) { } #[rstest] -fn test_add_tx_lower_than_queued_nonce(mut mempool: Mempool) { +#[case::lower_nonce(0, MempoolError::NonceTooOld { address: contract_address!("0x0"), nonce: nonce!(0) })] +#[case::equal_nonce(1, MempoolError::DuplicateNonce { address: contract_address!("0x0"), nonce: nonce!(1) })] +fn test_add_tx_rejects_tx_of_queued_nonce( + #[case] tx_nonce: u64, + #[case] expected_error: MempoolError, + mut mempool: Mempool, +) { // Setup. let input = add_tx_input!(tx_hash: 1, address: "0x0", tx_nonce: 1, account_nonce: 1); add_tx(&mut mempool, &input); // Test and assert: original transaction remains. - let invalid_input = add_tx_input!(tx_hash: 2, address: "0x0", tx_nonce: 0, account_nonce: 1); - add_tx_expect_error( - &mut mempool, - &invalid_input, - MempoolError::NonceTooOld { address: contract_address!("0x0"), nonce: nonce!(0) }, - ); - - let invalid_input = add_tx_input!(tx_hash: 2, address: "0x0", tx_nonce: 1, account_nonce: 1); - add_tx_expect_error( - &mut mempool, - &invalid_input, - MempoolError::DuplicateNonce { address: contract_address!("0x0"), nonce: nonce!(1) }, - ); + let invalid_input = + add_tx_input!(tx_hash: 2, address: "0x0", tx_nonce: tx_nonce, account_nonce: 1); + add_tx_expect_error(&mut mempool, &invalid_input, expected_error); } #[rstest] @@ -453,27 +499,6 @@ fn test_add_tx_with_identical_tip_succeeds(mut mempool: Mempool) { expected_mempool_content.assert_eq(&mempool); } -#[rstest] -fn test_add_tx_tip_priority_over_tx_hash(mut mempool: Mempool) { - // Setup. - let input_big_tip_small_hash = add_tx_input!(tx_hash: 1, address: "0x0", tip: 2); - // Create a transaction with identical tip, it should be allowed through since the priority - // queue tie-breaks identical tips by other tx-unique identifiers (for example tx hash). - let input_small_tip_big_hash = add_tx_input!(tx_hash: 2, address: "0x1", tip: 1); - - // Test. - for input in [&input_big_tip_small_hash, &input_small_tip_big_hash] { - add_tx(&mut mempool, input); - } - - // Assert: ensure that the transaction with the higher tip is prioritized higher. - let expected_queue_txs = - [&input_big_tip_small_hash.tx, &input_small_tip_big_hash.tx].map(TransactionReference::new); - let expected_mempool_content = - MempoolContentBuilder::new().with_priority_queue(expected_queue_txs).build(); - expected_mempool_content.assert_eq(&mempool); -} - #[rstest] fn test_add_tx_fills_nonce_gap(mut mempool: Mempool) { // Setup. @@ -579,16 +604,12 @@ fn test_fee_escalation_valid_replacement( for increased_value in increased_values { // Setup. let tx = tx!(tip: 90, max_l2_gas_price: 90); - let mut builder = MempoolContentBuilder::new().with_fee_escalation_percentage(10); - if in_priority_queue { - builder = builder.with_priority_queue([TransactionReference::new(&tx)]); - } + let mut builder = builder_with_queue(in_priority_queue, in_pending_queue, &tx) + .with_fee_escalation_percentage(10); if in_pending_queue { - builder = builder - .with_pending_queue([TransactionReference::new(&tx)]) - .with_gas_price_threshold(1000); + builder = builder.with_gas_price_threshold(1000); } let mempool = builder.with_pool([tx]).build_into_mempool(); @@ -607,13 +628,24 @@ fn test_fee_escalation_valid_replacement( } #[rstest] -fn test_fee_escalation_invalid_replacement() { +#[case::pool(false, false)] +#[case::pool_and_priority_queue(true, false)] +#[case::pool_and_pending_queue(false, true)] +fn test_fee_escalation_invalid_replacement( + #[case] in_priority_queue: bool, + #[case] in_pending_queue: bool, +) { // Setup. let existing_tx = tx!(tx_hash: 1, tip: 100, max_l2_gas_price: 100); - let mempool = MempoolContentBuilder::new() - .with_pool([existing_tx.clone()]) - .with_fee_escalation_percentage(10) - .build_into_mempool(); + + let mut builder = builder_with_queue(in_priority_queue, in_pending_queue, &existing_tx) + .with_fee_escalation_percentage(10); + + if in_pending_queue { + builder = builder.with_gas_price_threshold(1000); + } + + let mempool = builder.with_pool([existing_tx.clone()]).build_into_mempool(); let input_not_enough_tip = add_tx_input!(tx_hash: 3, tip: 109, max_l2_gas_price: 110); let input_not_enough_gas_price = add_tx_input!(tx_hash: 4, tip: 110, max_l2_gas_price: 109); @@ -622,7 +654,13 @@ fn test_fee_escalation_invalid_replacement() { // Test and assert. let invalid_replacement_inputs = [input_not_enough_tip, input_not_enough_gas_price, input_not_enough_both]; - add_txs_and_verify_no_replacement(mempool, existing_tx, invalid_replacement_inputs); + add_txs_and_verify_no_replacement( + mempool, + existing_tx, + invalid_replacement_inputs, + in_priority_queue, + in_pending_queue, + ); } #[rstest] @@ -678,7 +716,11 @@ fn test_fee_escalation_invalid_replacement_overflow_gracefully_handled() { // Test and assert: overflow gracefully handled. let invalid_replacement_input = add_tx_input!(tip: u64::MAX, max_l2_gas_price: u128::MAX); - add_txs_and_verify_no_replacement(mempool, existing_tx, [invalid_replacement_input]); + add_txs_and_verify_no_replacement_in_pool( + mempool, + existing_tx, + [invalid_replacement_input], + ); } // Large percentage. @@ -692,7 +734,7 @@ fn test_fee_escalation_invalid_replacement_overflow_gracefully_handled() { // Test and assert: overflow gracefully handled. let invalid_replacement_input = add_tx_input!(tip: u64::MAX, max_l2_gas_price: u128::MAX); - add_txs_and_verify_no_replacement(mempool, existing_tx, [invalid_replacement_input]); + add_txs_and_verify_no_replacement_in_pool(mempool, existing_tx, [invalid_replacement_input]); } // `update_gas_price_threshold` tests. diff --git a/crates/starknet_mempool_p2p/Cargo.toml b/crates/starknet_mempool_p2p/Cargo.toml index 5e5b278e499..a81e8c330d8 100644 --- a/crates/starknet_mempool_p2p/Cargo.toml +++ b/crates/starknet_mempool_p2p/Cargo.toml @@ -26,10 +26,11 @@ validator.workspace = true [dev-dependencies] futures.workspace = true -papyrus_network = { workspace = true, features = ["testing"] } -papyrus_network_types = { workspace = true, features = ["testing"] } -papyrus_protobuf.workspace = true -papyrus_test_utils.workspace = true +libp2p.workspace = true +papyrus_network = { path = "../papyrus_network", features = ["testing"] } +papyrus_network_types = { path = "../papyrus_network_types", features = ["testing"] } +papyrus_protobuf.path = "../papyrus_protobuf" +papyrus_test_utils.path = "../papyrus_test_utils" rand_chacha.workspace = true -starknet_api.workspace = true +starknet_api.path = "../starknet_api" tokio = { workspace = true, features = ["full", "sync", "test-util"] } diff --git a/crates/starknet_mempool_p2p/src/lib.rs b/crates/starknet_mempool_p2p/src/lib.rs index 08150ddebb5..5ffa5afcecc 100644 --- a/crates/starknet_mempool_p2p/src/lib.rs +++ b/crates/starknet_mempool_p2p/src/lib.rs @@ -2,6 +2,7 @@ pub mod config; pub mod propagator; pub mod runner; +use futures::FutureExt; use papyrus_network::gossipsub_impl::Topic; use papyrus_network::network_manager::{BroadcastTopicChannels, NetworkManager}; use starknet_gateway_types::communication::SharedGatewayClient; @@ -28,9 +29,10 @@ pub fn create_p2p_propagator_and_runner( mempool_p2p_config.network_buffer_size, ) .expect("Failed to register broadcast topic"); + let network_future = network_manager.run(); let mempool_p2p_propagator = MempoolP2pPropagator::new(broadcast_topic_client.clone()); let mempool_p2p_runner = MempoolP2pRunner::new( - Some(network_manager), + network_future.boxed(), broadcasted_messages_receiver, broadcast_topic_client, gateway_client, diff --git a/crates/starknet_mempool_p2p/src/runner/mod.rs b/crates/starknet_mempool_p2p/src/runner/mod.rs index 8f2e6563cbc..20ccd8359aa 100644 --- a/crates/starknet_mempool_p2p/src/runner/mod.rs +++ b/crates/starknet_mempool_p2p/src/runner/mod.rs @@ -2,13 +2,14 @@ mod test; use async_trait::async_trait; +use futures::future::BoxFuture; use futures::stream::FuturesUnordered; -use futures::{pin_mut, StreamExt, TryFutureExt}; +use futures::StreamExt; use papyrus_network::network_manager::{ BroadcastTopicClient, BroadcastTopicClientTrait, BroadcastTopicServer, - NetworkManager, + NetworkError, }; use papyrus_protobuf::mempool::RpcTransactionWrapper; use starknet_gateway_types::communication::{GatewayClientError, SharedGatewayClient}; @@ -20,7 +21,7 @@ use starknet_sequencer_infra::errors::ComponentError; use tracing::warn; pub struct MempoolP2pRunner { - network_manager: Option, + network_future: BoxFuture<'static, Result<(), NetworkError>>, broadcasted_topic_server: BroadcastTopicServer, broadcast_topic_client: BroadcastTopicClient, gateway_client: SharedGatewayClient, @@ -28,31 +29,23 @@ pub struct MempoolP2pRunner { impl MempoolP2pRunner { pub fn new( - network_manager: Option, + network_future: BoxFuture<'static, Result<(), NetworkError>>, broadcasted_topic_server: BroadcastTopicServer, broadcast_topic_client: BroadcastTopicClient, gateway_client: SharedGatewayClient, ) -> Self { - Self { network_manager, broadcasted_topic_server, broadcast_topic_client, gateway_client } + Self { network_future, broadcasted_topic_server, broadcast_topic_client, gateway_client } } } #[async_trait] impl ComponentStarter for MempoolP2pRunner { async fn start(&mut self) -> Result<(), ComponentError> { - let network_future = self - .network_manager - .take() - .expect("Network manager not found") - .run() - .map_err(|_| ComponentError::InternalComponentError); - pin_mut!(network_future); let mut gateway_futures = FuturesUnordered::new(); loop { tokio::select! { - result = &mut network_future => { - result?; - panic!("Network stopped unexpectedly"); + result = &mut self.network_future => { + return result.map_err(|_| ComponentError::InternalComponentError); } Some(result) = gateway_futures.next() => { match result { diff --git a/crates/starknet_mempool_p2p/src/runner/test.rs b/crates/starknet_mempool_p2p/src/runner/test.rs index e64f272c327..5ad655c6fd4 100644 --- a/crates/starknet_mempool_p2p/src/runner/test.rs +++ b/crates/starknet_mempool_p2p/src/runner/test.rs @@ -3,15 +3,15 @@ use std::time::Duration; use async_trait::async_trait; use futures::channel::mpsc::Sender; +use futures::future::{pending, ready, BoxFuture}; use futures::stream::StreamExt; -use futures::SinkExt; +use futures::{FutureExt, SinkExt}; use papyrus_network::network_manager::test_utils::{ mock_register_broadcast_topic, BroadcastNetworkMock, TestSubscriberChannels, }; -use papyrus_network::network_manager::{BroadcastTopicChannels, NetworkManager}; -use papyrus_network::NetworkConfig; +use papyrus_network::network_manager::{BroadcastTopicChannels, NetworkError}; use papyrus_network_types::network_types::BroadcastedMessageMetadata; use papyrus_protobuf::mempool::RpcTransactionWrapper; use papyrus_test_utils::{get_rng, GetTestInstance}; @@ -24,6 +24,42 @@ use tokio::time::sleep; use super::MempoolP2pRunner; +fn setup( + network_future: BoxFuture<'static, Result<(), NetworkError>>, + gateway_client: Arc, +) -> (MempoolP2pRunner, BroadcastNetworkMock) { + let TestSubscriberChannels { mock_network, subscriber_channels } = + mock_register_broadcast_topic().expect("Failed to create mock network"); + let BroadcastTopicChannels { broadcasted_messages_receiver, broadcast_topic_client } = + subscriber_channels; + let mempool_p2p_runner = MempoolP2pRunner::new( + network_future, + broadcasted_messages_receiver, + broadcast_topic_client, + gateway_client, + ); + (mempool_p2p_runner, mock_network) +} + +#[test] +fn run_returns_when_network_future_returns() { + let network_future = ready(Ok(())).boxed(); + let gateway_client = + Arc::new(MockGatewayClient { add_tx_sender: futures::channel::mpsc::channel(1).0 }); + let (mut mempool_p2p_runner, _) = setup(network_future, gateway_client); + mempool_p2p_runner.start().now_or_never().unwrap().unwrap(); +} + +#[test] +fn run_returns_error_when_network_future_returns_error() { + let network_future = + ready(Err(NetworkError::DialError(libp2p::swarm::DialError::Aborted))).boxed(); + let gateway_client = + Arc::new(MockGatewayClient { add_tx_sender: futures::channel::mpsc::channel(1).0 }); + let (mut mempool_p2p_runner, _) = setup(network_future, gateway_client); + mempool_p2p_runner.start().now_or_never().unwrap().unwrap_err(); +} + // TODO(eitan): Make it an automock #[derive(Clone)] struct MockGatewayClient { @@ -40,24 +76,14 @@ impl GatewayClient for MockGatewayClient { #[tokio::test] async fn start_component_receive_tx_happy_flow() { - let TestSubscriberChannels { mock_network, subscriber_channels } = - mock_register_broadcast_topic().expect("Failed to create mock network"); - let BroadcastTopicChannels { broadcasted_messages_receiver, broadcast_topic_client } = - subscriber_channels; + let network_future = pending().boxed(); + let (add_tx_sender, mut add_tx_receiver) = futures::channel::mpsc::channel(1); + let mock_gateway_client = Arc::new(MockGatewayClient { add_tx_sender }); + let (mut mempool_p2p_runner, mock_network) = setup(network_future, mock_gateway_client); let BroadcastNetworkMock { broadcasted_messages_sender: mut mock_broadcasted_messages_sender, .. } = mock_network; - // Creating a placeholder network manager with default config for init of a mempool receiver - let placeholder_network_manager = NetworkManager::new(NetworkConfig::default(), None); - let (add_tx_sender, mut add_tx_receiver) = futures::channel::mpsc::channel(1); - let mock_gateway_client = Arc::new(MockGatewayClient { add_tx_sender }); - let mut mempool_p2p_runner = MempoolP2pRunner::new( - Some(placeholder_network_manager), - broadcasted_messages_receiver, - broadcast_topic_client, - mock_gateway_client, - ); let message_metadata = BroadcastedMessageMetadata::get_test_instance(&mut get_rng()); let expected_rpc_transaction = RpcTransactionWrapper(RpcTransaction::get_test_instance(&mut get_rng())); diff --git a/crates/starknet_mempool_types/Cargo.toml b/crates/starknet_mempool_types/Cargo.toml index 93b3083c2fe..f6b0a740f1b 100644 --- a/crates/starknet_mempool_types/Cargo.toml +++ b/crates/starknet_mempool_types/Cargo.toml @@ -23,4 +23,4 @@ thiserror.workspace = true [dev-dependencies] # Enable self with "testing" feature in tests. -starknet_mempool_types = { workspace = true, features = ["testing"] } +starknet_mempool_types = { path = ".", features = ["testing"] } diff --git a/crates/starknet_monitoring_endpoint/Cargo.toml b/crates/starknet_monitoring_endpoint/Cargo.toml index 7c6f05a905d..cdf732e34e1 100644 --- a/crates/starknet_monitoring_endpoint/Cargo.toml +++ b/crates/starknet_monitoring_endpoint/Cargo.toml @@ -6,7 +6,7 @@ repository.workspace = true license-file.workspace = true [features] -testing = ["infra_utils", "tokio", "tower"] +testing = ["tokio", "tower"] [lints] workspace = true @@ -14,10 +14,10 @@ workspace = true [dependencies] axum.workspace = true hyper = { workspace = true } -infra_utils = { workspace = true, optional = true } metrics-exporter-prometheus.workspace = true papyrus_config.workspace = true serde.workspace = true +starknet_infra_utils.workspace = true starknet_sequencer_infra.workspace = true tokio = { workspace = true, optional = true } tower = { workspace = true, optional = true } diff --git a/crates/starknet_monitoring_endpoint/src/monitoring_endpoint.rs b/crates/starknet_monitoring_endpoint/src/monitoring_endpoint.rs index ff92ca0a541..e4a311accf1 100644 --- a/crates/starknet_monitoring_endpoint/src/monitoring_endpoint.rs +++ b/crates/starknet_monitoring_endpoint/src/monitoring_endpoint.rs @@ -1,4 +1,3 @@ -use std::any::type_name; use std::net::SocketAddr; use axum::http::StatusCode; @@ -7,6 +6,7 @@ use axum::routing::get; use axum::{async_trait, Router, Server}; use hyper::Error; use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle}; +use starknet_infra_utils::type_name::short_type_name; use starknet_sequencer_infra::component_definitions::ComponentStarter; use starknet_sequencer_infra::errors::ComponentError; use tracing::{info, instrument}; @@ -95,7 +95,7 @@ pub fn create_monitoring_endpoint( #[async_trait] impl ComponentStarter for MonitoringEndpoint { async fn start(&mut self) -> Result<(), ComponentError> { - info!("Starting component {}.", type_name::()); + info!("Starting component {}.", short_type_name::()); self.run().await.map_err(|_| ComponentError::InternalComponentError) } } diff --git a/crates/starknet_monitoring_endpoint/src/test_utils.rs b/crates/starknet_monitoring_endpoint/src/test_utils.rs index 8d284fc5aab..648df04e704 100644 --- a/crates/starknet_monitoring_endpoint/src/test_utils.rs +++ b/crates/starknet_monitoring_endpoint/src/test_utils.rs @@ -4,8 +4,8 @@ use axum::body::Body; use axum::http::Request; use hyper::client::HttpConnector; use hyper::Client; -use infra_utils::run_until::run_until; -use infra_utils::tracing::{CustomLogger, TraceLevel}; +use starknet_infra_utils::run_until::run_until; +use starknet_infra_utils::tracing::{CustomLogger, TraceLevel}; use tracing::info; use crate::monitoring_endpoint::{ALIVE, MONITORING_PREFIX}; diff --git a/crates/starknet_sequencer_infra/Cargo.toml b/crates/starknet_sequencer_infra/Cargo.toml index 6b44f2be4dc..08d60b14e8c 100644 --- a/crates/starknet_sequencer_infra/Cargo.toml +++ b/crates/starknet_sequencer_infra/Cargo.toml @@ -20,6 +20,7 @@ rstest.workspace = true serde = { workspace = true, features = ["derive"] } serde_json.workspace = true starknet_api.workspace = true +starknet_infra_utils.workspace = true thiserror.workspace = true tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } tracing.workspace = true diff --git a/crates/starknet_sequencer_infra/src/component_client/local_component_client.rs b/crates/starknet_sequencer_infra/src/component_client/local_component_client.rs index 4724f85b05c..8075c7f7368 100644 --- a/crates/starknet_sequencer_infra/src/component_client/local_component_client.rs +++ b/crates/starknet_sequencer_infra/src/component_client/local_component_client.rs @@ -1,10 +1,9 @@ -use std::any::type_name; - use async_trait::async_trait; use serde::de::DeserializeOwned; use serde::Serialize; +use starknet_infra_utils::type_name::short_type_name; use tokio::sync::mpsc::{channel, Sender}; -use tracing::info; +use tracing::warn; use crate::component_client::ClientResult; use crate::component_definitions::{ComponentClient, ComponentRequestAndResponseSender}; @@ -103,7 +102,7 @@ where Response: Send + Sync, { fn drop(&mut self) { - info!("Dropping LocalComponentClient {}.", type_name::()); + warn!("Dropping {}.", short_type_name::()); } } diff --git a/crates/starknet_sequencer_infra/src/component_definitions.rs b/crates/starknet_sequencer_infra/src/component_definitions.rs index 6fd199b08cf..bc4c6042e23 100644 --- a/crates/starknet_sequencer_infra/src/component_definitions.rs +++ b/crates/starknet_sequencer_infra/src/component_definitions.rs @@ -1,4 +1,3 @@ -use std::any::type_name; use std::collections::BTreeMap; use std::fmt::Debug; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; @@ -8,6 +7,7 @@ use papyrus_config::dumping::{ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; +use starknet_infra_utils::type_name::short_type_name; use thiserror::Error; use tokio::sync::mpsc::{Receiver, Sender}; use tracing::{error, info}; @@ -39,7 +39,7 @@ where #[async_trait] pub trait ComponentStarter { async fn start(&mut self) -> Result<(), ComponentError> { - info!("Starting component {} with the default starter.", type_name::()); + info!("Starting component {} with the default starter.", short_type_name::()); Ok(()) } } diff --git a/crates/starknet_sequencer_infra/src/component_server/empty_component_server.rs b/crates/starknet_sequencer_infra/src/component_server/empty_component_server.rs index aa4e9cd2d3a..65500cf12e8 100644 --- a/crates/starknet_sequencer_infra/src/component_server/empty_component_server.rs +++ b/crates/starknet_sequencer_infra/src/component_server/empty_component_server.rs @@ -1,6 +1,5 @@ -use std::any::type_name; - use async_trait::async_trait; +use starknet_infra_utils::type_name::short_type_name; use tracing::info; use crate::component_definitions::ComponentStarter; @@ -20,9 +19,9 @@ impl WrapperServer { #[async_trait] impl ComponentServerStarter for WrapperServer { async fn start(&mut self) -> Result<(), ComponentServerError> { - info!("Starting WrapperServer for {}.", type_name::()); + info!("Starting WrapperServer for {}.", short_type_name::()); let res = self.component.start().await.map_err(ComponentServerError::ComponentError); - info!("Finished running WrapperServer for {}.", type_name::()); + info!("Finished running WrapperServer for {}.", short_type_name::()); res } } diff --git a/crates/starknet_sequencer_infra/src/component_server/local_component_server.rs b/crates/starknet_sequencer_infra/src/component_server/local_component_server.rs index eeb4f02597e..c3bf9d8ffb6 100644 --- a/crates/starknet_sequencer_infra/src/component_server/local_component_server.rs +++ b/crates/starknet_sequencer_infra/src/component_server/local_component_server.rs @@ -1,10 +1,10 @@ -use std::any::type_name; use std::fmt::Debug; use std::marker::PhantomData; use async_trait::async_trait; +use starknet_infra_utils::type_name::short_type_name; use tokio::sync::mpsc::Receiver; -use tracing::{debug, error, info}; +use tracing::{debug, error, info, warn}; use crate::component_definitions::{ ComponentRequestAndResponseSender, @@ -126,10 +126,10 @@ where Response: Send + Sync + Debug, { async fn start(&mut self) -> Result<(), ComponentServerError> { - info!("Starting LocalComponentServer for {}.", type_name::()); + info!("Starting LocalComponentServer for {}.", short_type_name::()); self.component.start().await?; request_response_loop(&mut self.rx, &mut self.component).await; - info!("Finished LocalComponentServer for {}.", type_name::()); + info!("Finished LocalComponentServer for {}.", short_type_name::()); Ok(()) } } @@ -203,6 +203,18 @@ where } } +impl Drop + for BaseLocalComponentServer +where + Component: ComponentRequestHandler, + Request: Send + Sync, + Response: Send + Sync, +{ + fn drop(&mut self) { + warn!("Dropping {}.", short_type_name::()); + } +} + async fn request_response_loop( rx: &mut Receiver>, component: &mut Component, @@ -211,20 +223,20 @@ async fn request_response_loop( Request: Send + Sync + Debug, Response: Send + Sync + Debug, { - info!("Starting server for component {}", type_name::()); + info!("Starting server for component {}", short_type_name::()); while let Some(request_and_res_tx) = rx.recv().await { let request = request_and_res_tx.request; let tx = request_and_res_tx.tx; - debug!("Component {} received request {:?}", type_name::(), request); + debug!("Component {} received request {:?}", short_type_name::(), request); let response = component.handle_request(request).await; - debug!("Component {} is sending response {:?}", type_name::(), response); + debug!("Component {} is sending response {:?}", short_type_name::(), response); // Send the response to the client. This might result in a panic if the client has closed // the response channel, which is considered a bug. tx.send(response).await.expect("Response connection should be open."); } - info!("Stopping server for component {}", type_name::()); + info!("Stopping server for component {}", short_type_name::()); } diff --git a/crates/starknet_sequencer_infra/src/component_server/remote_component_server.rs b/crates/starknet_sequencer_infra/src/component_server/remote_component_server.rs index 7c16b9a05a9..91240d40825 100644 --- a/crates/starknet_sequencer_infra/src/component_server/remote_component_server.rs +++ b/crates/starknet_sequencer_infra/src/component_server/remote_component_server.rs @@ -9,6 +9,8 @@ use hyper::service::{make_service_fn, service_fn}; use hyper::{Body, Request as HyperRequest, Response as HyperResponse, Server, StatusCode}; use serde::de::DeserializeOwned; use serde::Serialize; +use starknet_infra_utils::type_name::short_type_name; +use tracing::warn; use crate::component_client::{ClientError, LocalComponentClient}; use crate::component_definitions::{ @@ -191,3 +193,13 @@ where Ok(()) } } + +impl Drop for RemoteComponentServer +where + Request: Serialize + DeserializeOwned + Send + Sync + 'static, + Response: Serialize + DeserializeOwned + Send + Sync + 'static, +{ + fn drop(&mut self) { + warn!("Dropping {}.", short_type_name::()); + } +} diff --git a/crates/starknet_sequencer_infra/src/test_utils.rs b/crates/starknet_sequencer_infra/src/test_utils.rs index 464af8c7083..5093860161c 100644 --- a/crates/starknet_sequencer_infra/src/test_utils.rs +++ b/crates/starknet_sequencer_infra/src/test_utils.rs @@ -1,7 +1,68 @@ -use std::net::SocketAddr; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use tokio::net::TcpListener; +const PORTS_PER_INSTANCE: u16 = 30; +const MAX_NUMBER_OF_INSTANCES_PER_TEST: u16 = 10; +const MAX_NUMBER_OF_TESTS: u16 = 10; +const BASE_PORT: u16 = 55000; + +// Ensure available ports don't exceed u16::MAX. +const _: () = { + assert!( + BASE_PORT + MAX_NUMBER_OF_TESTS * MAX_NUMBER_OF_INSTANCES_PER_TEST * PORTS_PER_INSTANCE + < u16::MAX, + "Port numbers potentially exceeding u16::MAX" + ); +}; + +#[derive(Debug)] +pub struct AvailablePorts { + current_port: u16, + max_port: u16, +} + +impl AvailablePorts { + pub fn new(test_unique_index: u16, instance_index: u16) -> Self { + assert!( + test_unique_index < MAX_NUMBER_OF_TESTS, + "Test unique index {:?} exceeded bound {:?}", + test_unique_index, + MAX_NUMBER_OF_TESTS + ); + assert!( + instance_index < MAX_NUMBER_OF_INSTANCES_PER_TEST, + "Instance index {:?} exceeded bound {:?}", + instance_index, + MAX_NUMBER_OF_INSTANCES_PER_TEST + ); + + let test_offset: u16 = + test_unique_index * MAX_NUMBER_OF_INSTANCES_PER_TEST * PORTS_PER_INSTANCE; + let instance_in_test_offset: u16 = instance_index * PORTS_PER_INSTANCE; + let current_port = BASE_PORT + test_offset + instance_in_test_offset; + let max_port: u16 = current_port + PORTS_PER_INSTANCE; + + AvailablePorts { current_port, max_port } + } + + pub fn get_next_port(&mut self) -> u16 { + let port = self.current_port; + self.current_port += 1; + assert!(self.current_port < self.max_port, "Exceeded available ports."); + + port + } + + pub fn get_next_ports(&mut self, n: usize) -> Vec { + std::iter::repeat_with(|| self.get_next_port()).take(n).collect() + } + + pub fn get_next_local_host_socket(&mut self) -> SocketAddr { + SocketAddr::new(IpAddr::from(Ipv4Addr::LOCALHOST), self.get_next_port()) + } +} + /// Returns a unique IP address and port for testing purposes. /// Tests run in parallel, so servers (like RPC or web) running on separate tests must have /// different ports, otherwise the server will fail with "address already in use". diff --git a/crates/starknet_sequencer_node/Cargo.toml b/crates/starknet_sequencer_node/Cargo.toml index cf979a25e5e..bc6e1f33590 100644 --- a/crates/starknet_sequencer_node/Cargo.toml +++ b/crates/starknet_sequencer_node/Cargo.toml @@ -16,10 +16,9 @@ anyhow.workspace = true clap.workspace = true const_format.workspace = true futures.workspace = true -infra_utils.workspace = true papyrus_config.workspace = true -papyrus_consensus.workspace = true papyrus_proc_macros = { workspace = true, optional = true } +papyrus_protobuf.workspace = true rstest.workspace = true serde.workspace = true starknet_api.workspace = true @@ -29,6 +28,7 @@ starknet_consensus_manager.workspace = true starknet_gateway.workspace = true starknet_gateway_types.workspace = true starknet_http_server.workspace = true +starknet_infra_utils.workspace = true starknet_l1_provider.workspace = true starknet_l1_provider_types.workspace = true starknet_mempool.workspace = true @@ -37,7 +37,7 @@ starknet_mempool_p2p_types.workspace = true starknet_mempool_types.workspace = true starknet_monitoring_endpoint.workspace = true starknet_sequencer_infra.workspace = true -starknet_sierra_compile.workspace = true +starknet_sierra_multicompile.workspace = true starknet_state_sync.workspace = true starknet_state_sync_types.workspace = true tokio.workspace = true @@ -48,9 +48,9 @@ validator.workspace = true assert-json-diff.workspace = true assert_matches.workspace = true colored.workspace = true -infra_utils.workspace = true -mempool_test_utils.workspace = true +mempool_test_utils.path = "../mempool_test_utils" pretty_assertions.workspace = true serde_json.workspace = true +starknet_infra_utils.path = "../starknet_infra_utils" # Enable self with "testing" feature in tests. -starknet_sequencer_node = { workspace = true, features = ["testing"] } +starknet_sequencer_node = { path = ".", features = ["testing"] } diff --git a/crates/starknet_sequencer_node/src/clients.rs b/crates/starknet_sequencer_node/src/clients.rs index 0473cf3b059..5b8957841ac 100644 --- a/crates/starknet_sequencer_node/src/clients.rs +++ b/crates/starknet_sequencer_node/src/clients.rs @@ -64,8 +64,8 @@ pub struct SequencerNodeClients { /// /// # Returns /// -/// An Option> containing the available client (local_client or remote_client), -/// wrapped in Arc. If neither exists, returns None. +/// An `Option>` containing the available client (local_client or +/// remote_client), wrapped in Arc. If neither exists, returns None. /// /// # Example /// diff --git a/crates/starknet_sequencer_node/src/components.rs b/crates/starknet_sequencer_node/src/components.rs index 6f8b1e011ea..82ca63000b3 100644 --- a/crates/starknet_sequencer_node/src/components.rs +++ b/crates/starknet_sequencer_node/src/components.rs @@ -1,5 +1,3 @@ -use std::sync::Arc; - use starknet_batcher::batcher::{create_batcher, Batcher}; use starknet_consensus_manager::consensus_manager::ConsensusManager; use starknet_gateway::gateway::{create_gateway, Gateway}; @@ -15,7 +13,6 @@ use starknet_monitoring_endpoint::monitoring_endpoint::{ }; use starknet_state_sync::runner::StateSyncRunner; use starknet_state_sync::{create_state_sync_and_runner, StateSync}; -use starknet_state_sync_types::communication::EmptyStateSyncClient; use crate::clients::SequencerNodeClients; use crate::config::component_execution_config::{ @@ -59,8 +56,9 @@ pub fn create_node_components( ActiveComponentExecutionMode::Enabled => { let batcher_client = clients.get_batcher_shared_client().expect("Batcher Client should be available"); - // TODO(shahak): Use the real client once we connect state sync to the node. - let state_sync_client = Arc::new(EmptyStateSyncClient); + let state_sync_client = clients + .get_state_sync_shared_client() + .expect("State Sync Client should be available"); Some(ConsensusManager::new( config.consensus_manager_config.clone(), batcher_client, diff --git a/crates/starknet_sequencer_node/src/config/component_config.rs b/crates/starknet_sequencer_node/src/config/component_config.rs index 1b469221e15..b18a046e8c7 100644 --- a/crates/starknet_sequencer_node/src/config/component_config.rs +++ b/crates/starknet_sequencer_node/src/config/component_config.rs @@ -53,3 +53,20 @@ impl SerializeConfig for ComponentConfig { sub_configs.into_iter().flatten().collect() } } + +#[cfg(any(feature = "testing", test))] +impl ComponentConfig { + pub fn disabled() -> ComponentConfig { + ComponentConfig { + batcher: ReactiveComponentExecutionConfig::disabled(), + gateway: ReactiveComponentExecutionConfig::disabled(), + mempool: ReactiveComponentExecutionConfig::disabled(), + mempool_p2p: ReactiveComponentExecutionConfig::disabled(), + state_sync: ReactiveComponentExecutionConfig::disabled(), + l1_provider: ReactiveComponentExecutionConfig::disabled(), + consensus_manager: ActiveComponentExecutionConfig::disabled(), + http_server: ActiveComponentExecutionConfig::disabled(), + monitoring_endpoint: ActiveComponentExecutionConfig::disabled(), + } + } +} diff --git a/crates/starknet_sequencer_node/src/config/component_execution_config.rs b/crates/starknet_sequencer_node/src/config/component_execution_config.rs index 03af9e5e782..cf4196e7fb4 100644 --- a/crates/starknet_sequencer_node/src/config/component_execution_config.rs +++ b/crates/starknet_sequencer_node/src/config/component_execution_config.rs @@ -1,4 +1,6 @@ use std::collections::BTreeMap; +#[cfg(any(feature = "testing", test))] +use std::net::SocketAddr; use papyrus_config::dumping::{ser_optional_sub_config, ser_param, SerializeConfig}; use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; @@ -60,6 +62,45 @@ impl SerializeConfig for ReactiveComponentExecutionConfig { impl Default for ReactiveComponentExecutionConfig { fn default() -> Self { + Self::local_with_remote_disabled() + } +} + +#[cfg(any(feature = "testing", test))] +impl ReactiveComponentExecutionConfig { + pub fn disabled() -> Self { + Self { + execution_mode: ReactiveComponentExecutionMode::Disabled, + local_server_config: None, + remote_client_config: None, + remote_server_config: None, + } + } + + pub fn remote(socket: SocketAddr) -> Self { + Self { + execution_mode: ReactiveComponentExecutionMode::Remote, + local_server_config: None, + remote_client_config: Some(RemoteClientConfig { + socket, + ..RemoteClientConfig::default() + }), + remote_server_config: None, + } + } + + pub fn local_with_remote_enabled(socket: SocketAddr) -> Self { + Self { + execution_mode: ReactiveComponentExecutionMode::LocalExecutionWithRemoteEnabled, + local_server_config: Some(LocalServerConfig::default()), + remote_client_config: None, + remote_server_config: Some(RemoteServerConfig { socket }), + } + } +} + +impl ReactiveComponentExecutionConfig { + pub fn local_with_remote_disabled() -> Self { Self { execution_mode: ReactiveComponentExecutionMode::LocalExecutionWithRemoteDisabled, local_server_config: Some(LocalServerConfig::default()), diff --git a/crates/starknet_sequencer_node/src/config/config_test.rs b/crates/starknet_sequencer_node/src/config/config_test.rs index 3d636e950a1..b575870baab 100644 --- a/crates/starknet_sequencer_node/src/config/config_test.rs +++ b/crates/starknet_sequencer_node/src/config/config_test.rs @@ -5,13 +5,13 @@ use std::fs::File; use assert_json_diff::assert_json_eq; use assert_matches::assert_matches; use colored::Colorize; -use infra_utils::path::resolve_project_relative_path; use papyrus_config::dumping::SerializeConfig; use papyrus_config::validators::config_validate; use papyrus_config::SerializedParam; use rstest::rstest; use starknet_batcher::block_builder::BlockBuilderConfig; use starknet_batcher::config::BatcherConfig; +use starknet_infra_utils::path::resolve_project_relative_path; use starknet_sequencer_infra::component_definitions::{ LocalServerConfig, RemoteClientConfig, diff --git a/crates/starknet_sequencer_node/src/config/node_config.rs b/crates/starknet_sequencer_node/src/config/node_config.rs index d8a289ad800..9fd12a6fd9c 100644 --- a/crates/starknet_sequencer_node/src/config/node_config.rs +++ b/crates/starknet_sequencer_node/src/config/node_config.rs @@ -5,7 +5,6 @@ use std::sync::LazyLock; use std::vec::Vec; use clap::Command; -use infra_utils::path::resolve_project_relative_path; use papyrus_config::dumping::{ append_sub_config_name, generate_struct_pointer, @@ -23,10 +22,11 @@ use starknet_batcher::VersionedConstantsOverrides; use starknet_consensus_manager::config::ConsensusManagerConfig; use starknet_gateway::config::{GatewayConfig, RpcStateReaderConfig}; use starknet_http_server::config::HttpServerConfig; +use starknet_infra_utils::path::resolve_project_relative_path; use starknet_l1_provider::L1ProviderConfig; use starknet_mempool_p2p::config::MempoolP2pConfig; use starknet_monitoring_endpoint::config::MonitoringEndpointConfig; -use starknet_sierra_compile::config::SierraToCasmCompilationConfig; +use starknet_sierra_multicompile::config::SierraCompilationConfig; use starknet_state_sync::config::StateSyncConfig; use validator::Validate; @@ -122,7 +122,7 @@ pub struct SequencerNodeConfig { #[validate] pub rpc_state_reader_config: RpcStateReaderConfig, #[validate] - pub compiler_config: SierraToCasmCompilationConfig, + pub compiler_config: SierraCompilationConfig, #[validate] pub l1_provider_config: L1ProviderConfig, #[validate] diff --git a/crates/starknet_sequencer_node/src/config/test_utils.rs b/crates/starknet_sequencer_node/src/config/test_utils.rs index 584fd047145..e25a95a6cf7 100644 --- a/crates/starknet_sequencer_node/src/config/test_utils.rs +++ b/crates/starknet_sequencer_node/src/config/test_utils.rs @@ -1,7 +1,7 @@ use std::vec::Vec; // Used by #[gen_field_names_fn]. -use papyrus_consensus::types::DEFAULT_VALIDATOR_ID; use papyrus_proc_macros::gen_field_names_and_cli_args_fn; +use papyrus_protobuf::consensus::DEFAULT_VALIDATOR_ID; use starknet_api::core::{ChainId, ContractAddress}; use crate::config::node_config::node_command; diff --git a/crates/starknet_sequencer_node/src/servers.rs b/crates/starknet_sequencer_node/src/servers.rs index 538d2bbd68c..42f2a0bbabe 100644 --- a/crates/starknet_sequencer_node/src/servers.rs +++ b/crates/starknet_sequencer_node/src/servers.rs @@ -76,24 +76,23 @@ pub struct SequencerNodeServers { /// /// # Arguments /// -/// * `$execution_mode` - A reference to the component's execution mode, of type -/// `&ReactiveComponentExecutionMode`. -/// * `$local_client` - The local client to be used for the remote server initialization if the -/// execution mode is `Remote`. -/// * `$config` - The configuration for the remote server. +/// * `$execution_mode` - Component execution mode reference. +/// * `$local_client_getter` - Local client getter function, used for the remote server +/// initialization if needed. +/// * `$config` - Remote server configuration. /// /// # Returns /// /// An `Option>>` containing /// the remote server if the execution mode is Remote, or None if the execution mode is Disabled, -/// LocalExecutionWithRemoteEnabled or LocalExecutionWithRemoteDisabled. +/// LocalExecutionWithRemoteEnabled, or LocalExecutionWithRemoteDisabled. /// /// # Example /// /// ```rust,ignore /// let batcher_remote_server = create_remote_server!( /// &config.components.batcher.execution_mode, -/// clients.get_gateway_local_client(), +/// || {clients.get_gateway_local_client()}, /// config.remote_server_config /// ); /// match batcher_remote_server { @@ -103,10 +102,10 @@ pub struct SequencerNodeServers { /// ``` #[macro_export] macro_rules! create_remote_server { - ($execution_mode:expr, $local_client:expr, $remote_server_config:expr) => { + ($execution_mode:expr, $local_client_getter:expr, $remote_server_config:expr) => { match *$execution_mode { ReactiveComponentExecutionMode::LocalExecutionWithRemoteEnabled => { - let local_client = $local_client + let local_client = $local_client_getter() .expect("Local client should be set for inbound remote connections."); let remote_server_config = $remote_server_config .as_ref() @@ -265,44 +264,39 @@ pub fn create_remote_servers( config: &SequencerNodeConfig, clients: &SequencerNodeClients, ) -> RemoteServers { - let batcher_client = clients.get_batcher_local_client(); let batcher_server = create_remote_server!( &config.components.batcher.execution_mode, - batcher_client, + || { clients.get_batcher_local_client() }, config.components.batcher.remote_server_config ); - let gateway_client = clients.get_gateway_local_client(); let gateway_server = create_remote_server!( &config.components.gateway.execution_mode, - gateway_client, + || { clients.get_gateway_local_client() }, config.components.gateway.remote_server_config ); - let l1_provider_client = clients.get_l1_provider_local_client(); let l1_provider_server = create_remote_server!( &config.components.l1_provider.execution_mode, - l1_provider_client, + || { clients.get_l1_provider_local_client() }, config.components.l1_provider.remote_server_config ); - let mempool_client = clients.get_mempool_local_client(); let mempool_server = create_remote_server!( &config.components.mempool.execution_mode, - mempool_client, + || { clients.get_mempool_local_client() }, config.components.mempool.remote_server_config ); - let mempool_p2p_propagator_client = clients.get_mempool_p2p_propagator_local_client(); let mempool_p2p_propagator_server = create_remote_server!( &config.components.mempool_p2p.execution_mode, - mempool_p2p_propagator_client, + || { clients.get_mempool_p2p_propagator_local_client() }, config.components.mempool_p2p.remote_server_config ); - let state_sync_client = clients.get_state_sync_local_client(); + let state_sync_server = create_remote_server!( &config.components.state_sync.execution_mode, - state_sync_client, + || { clients.get_state_sync_local_client() }, config.components.state_sync.remote_server_config ); diff --git a/crates/starknet_sequencer_node/src/test_utils/node_runner.rs b/crates/starknet_sequencer_node/src/test_utils/node_runner.rs index e929f158723..f21584c9110 100644 --- a/crates/starknet_sequencer_node/src/test_utils/node_runner.rs +++ b/crates/starknet_sequencer_node/src/test_utils/node_runner.rs @@ -1,18 +1,18 @@ use std::path::PathBuf; use std::process::Stdio; -use infra_utils::command::create_shell_command; -use infra_utils::path::resolve_project_relative_path; +use starknet_infra_utils::command::create_shell_command; +use starknet_infra_utils::path::resolve_project_relative_path; use tokio::process::Child; use tokio::task::{self, JoinHandle}; -use tracing::{error, info}; +use tracing::{error, info, instrument}; pub const NODE_EXECUTABLE_PATH: &str = "target/debug/starknet_sequencer_node"; -pub async fn spawn_run_node(node_config_path: PathBuf) -> JoinHandle<()> { +pub fn spawn_run_node(node_config_path: PathBuf) -> JoinHandle<()> { task::spawn(async move { info!("Running the node from its spawned task."); - let _node_run_result = spawn_node_child_task(node_config_path). + let _node_run_result = spawn_node_child_process(node_config_path). await. // awaits the completion of spawn_node_child_task. wait(). // runs the node until completion -- should be running indefinitely. await; // awaits the completion of the node. @@ -20,7 +20,8 @@ pub async fn spawn_run_node(node_config_path: PathBuf) -> JoinHandle<()> { }) } -async fn spawn_node_child_task(node_config_path: PathBuf) -> Child { +#[instrument()] +async fn spawn_node_child_process(node_config_path: PathBuf) -> Child { // TODO(Tsabary): Capture output to a log file, and present it in case of a failure. info!("Getting the node executable."); let node_executable = get_node_executable_path(); diff --git a/crates/starknet_sierra_compile/src/config.rs b/crates/starknet_sierra_compile/src/config.rs deleted file mode 100644 index e3601b6f8ec..00000000000 --- a/crates/starknet_sierra_compile/src/config.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::collections::BTreeMap; - -use papyrus_config::dumping::{ser_param, SerializeConfig}; -use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; -use serde::{Deserialize, Serialize}; -use validator::Validate; - -#[derive(Clone, Debug, Serialize, Deserialize, Validate, PartialEq)] -pub struct SierraToCasmCompilationConfig { - /// CASM bytecode size limit. - pub max_bytecode_size: usize, -} - -impl Default for SierraToCasmCompilationConfig { - fn default() -> Self { - Self { max_bytecode_size: 81920 } - } -} - -impl SerializeConfig for SierraToCasmCompilationConfig { - fn dump(&self) -> BTreeMap { - BTreeMap::from_iter([ser_param( - "max_bytecode_size", - &self.max_bytecode_size, - "Limitation of contract bytecode size.", - ParamPrivacyInput::Public, - )]) - } -} diff --git a/crates/starknet_sierra_compile/Cargo.toml b/crates/starknet_sierra_multicompile/Cargo.toml similarity index 71% rename from crates/starknet_sierra_compile/Cargo.toml rename to crates/starknet_sierra_multicompile/Cargo.toml index d4a85d45d4c..fb00cd5f882 100644 --- a/crates/starknet_sierra_compile/Cargo.toml +++ b/crates/starknet_sierra_multicompile/Cargo.toml @@ -1,9 +1,10 @@ [package] edition.workspace = true license.workspace = true -name = "starknet_sierra_compile" +name = "starknet_sierra_multicompile" repository.workspace = true version.workspace = true +description = "A utility crate for compiling Sierra code into CASM and / or native." [features] cairo_native = ["dep:cairo-native"] @@ -17,6 +18,7 @@ cairo-lang-starknet-classes.workspace = true cairo-lang-utils.workspace = true cairo-native = { workspace = true, optional = true } papyrus_config.workspace = true +rlimit.workspace = true serde.workspace = true serde_json.workspace = true starknet-types-core.workspace = true @@ -27,10 +29,10 @@ validator.workspace = true [dev-dependencies] assert_matches.workspace = true -infra_utils.workspace = true -mempool_test_utils.workspace = true +mempool_test_utils.path = "../mempool_test_utils" rstest.workspace = true +starknet_infra_utils.path = "../starknet_infra_utils" [build-dependencies] -infra_utils.workspace = true +starknet_infra_utils.workspace = true tempfile.workspace = true diff --git a/crates/starknet_sierra_compile/build.rs b/crates/starknet_sierra_multicompile/build.rs similarity index 100% rename from crates/starknet_sierra_compile/build.rs rename to crates/starknet_sierra_multicompile/build.rs diff --git a/crates/starknet_sierra_compile/src/command_line_compiler.rs b/crates/starknet_sierra_multicompile/src/command_line_compiler.rs similarity index 58% rename from crates/starknet_sierra_compile/src/command_line_compiler.rs rename to crates/starknet_sierra_multicompile/src/command_line_compiler.rs index ce324b49f56..4422b97bf5e 100644 --- a/crates/starknet_sierra_compile/src/command_line_compiler.rs +++ b/crates/starknet_sierra_multicompile/src/command_line_compiler.rs @@ -8,34 +8,38 @@ use cairo_lang_starknet_classes::contract_class::ContractClass; use cairo_native::executor::AotContractExecutor; use tempfile::NamedTempFile; -use crate::config::SierraToCasmCompilationConfig; +use crate::config::SierraCompilationConfig; use crate::constants::CAIRO_LANG_BINARY_NAME; #[cfg(feature = "cairo_native")] use crate::constants::CAIRO_NATIVE_BINARY_NAME; use crate::errors::CompilationUtilError; use crate::paths::binary_path; +use crate::resource_limits::ResourceLimits; use crate::SierraToCasmCompiler; #[cfg(feature = "cairo_native")] use crate::SierraToNativeCompiler; #[derive(Clone)] pub struct CommandLineCompiler { - pub config: SierraToCasmCompilationConfig, + pub config: SierraCompilationConfig, path_to_starknet_sierra_compile_binary: PathBuf, #[cfg(feature = "cairo_native")] path_to_starknet_native_compile_binary: PathBuf, } impl CommandLineCompiler { - pub fn new(config: SierraToCasmCompilationConfig) -> Self { + pub fn new(config: SierraCompilationConfig) -> Self { + let path_to_starknet_sierra_compile_binary = binary_path(out_dir(), CAIRO_LANG_BINARY_NAME); + #[cfg(feature = "cairo_native")] + let path_to_starknet_native_compile_binary = match &config.sierra_to_native_compiler_path { + Some(path) => path.clone(), + None => binary_path(out_dir(), CAIRO_NATIVE_BINARY_NAME), + }; Self { config, - path_to_starknet_sierra_compile_binary: binary_path(out_dir(), CAIRO_LANG_BINARY_NAME), + path_to_starknet_sierra_compile_binary, #[cfg(feature = "cairo_native")] - path_to_starknet_native_compile_binary: binary_path( - out_dir(), - CAIRO_NATIVE_BINARY_NAME, - ), + path_to_starknet_native_compile_binary, } } } @@ -46,13 +50,21 @@ impl SierraToCasmCompiler for CommandLineCompiler { contract_class: ContractClass, ) -> Result { let compiler_binary_path = &self.path_to_starknet_sierra_compile_binary; - let additional_args = [ + let additional_args = &[ "--add-pythonic-hints", "--max-bytecode-size", - &self.config.max_bytecode_size.to_string(), + &self.config.max_casm_bytecode_size.to_string(), ]; - - let stdout = compile_with_args(compiler_binary_path, contract_class, &additional_args)?; + let env_vars = vec![]; + let resource_limits = ResourceLimits::new(None, None, None); + + let stdout = compile_with_args( + compiler_binary_path, + contract_class, + additional_args, + env_vars, + resource_limits, + )?; Ok(serde_json::from_slice::(&stdout)?) } } @@ -70,8 +82,28 @@ impl SierraToNativeCompiler for CommandLineCompiler { CompilationUtilError::UnexpectedError("Failed to get output file path".to_owned()), )?; let additional_args = [output_file_path]; - - let _stdout = compile_with_args(compiler_binary_path, contract_class, &additional_args)?; + let mut env_vars = vec![]; + // Overrides the cairo native runtime library environment variable defined in config.toml. + if let Some(path) = &self.config.libcairo_native_runtime_path { + env_vars.push(( + "CAIRO_NATIVE_RUNTIME_LIBRARY", + path.to_str() + .expect("Failed to convert cairo native runtime library path to string"), + )); + }; + + let resource_limits = ResourceLimits::new( + Some(self.config.max_cpu_time), + Some(self.config.max_native_bytecode_size), + Some(self.config.max_memory_usage), + ); + let _stdout = compile_with_args( + compiler_binary_path, + contract_class, + &additional_args, + env_vars, + resource_limits, + )?; Ok(AotContractExecutor::load(Path::new(&output_file_path))?) } @@ -81,6 +113,8 @@ fn compile_with_args( compiler_binary_path: &Path, contract_class: ContractClass, additional_args: &[&str], + env_vars: Vec<(&str, &str)>, + resource_limits: ResourceLimits, ) -> Result, CompilationUtilError> { // Create a temporary file to store the Sierra contract class. let serialized_contract_class = serde_json::to_string(&contract_class)?; @@ -95,6 +129,12 @@ fn compile_with_args( // TODO(Arni, Avi): Setup the ulimit for the process. let mut command = Command::new(compiler_binary_path.as_os_str()); command.arg(temp_file_path).args(additional_args); + for (name, value) in env_vars { + command.env(name, value); + } + + // Apply the resource limits to the command. + resource_limits.apply(&mut command); // Run the compile process. let compile_output = command.output()?; @@ -102,7 +142,11 @@ fn compile_with_args( if !compile_output.status.success() { let stderr_output = String::from_utf8(compile_output.stderr) .unwrap_or("Failed to get stderr output".into()); - return Err(CompilationUtilError::CompilationError(stderr_output)); + // TODO(Avi, 28/2/2025): Make the error messages more readable. + return Err(CompilationUtilError::CompilationError(format!( + "Exit status: {}\n Stderr: {}", + compile_output.status, stderr_output + ))); }; Ok(compile_output.stdout) } diff --git a/crates/starknet_sierra_compile/src/compile_test.rs b/crates/starknet_sierra_multicompile/src/compile_test.rs similarity index 79% rename from crates/starknet_sierra_compile/src/compile_test.rs rename to crates/starknet_sierra_multicompile/src/compile_test.rs index 642cd4e4b9d..a59b3920835 100644 --- a/crates/starknet_sierra_compile/src/compile_test.rs +++ b/crates/starknet_sierra_multicompile/src/compile_test.rs @@ -3,23 +3,35 @@ use std::path::Path; use assert_matches::assert_matches; use cairo_lang_starknet_classes::contract_class::ContractClass; -use infra_utils::path::resolve_project_relative_path; use mempool_test_utils::{FAULTY_ACCOUNT_CLASS_FILE, TEST_FILES_FOLDER}; use rstest::rstest; +use starknet_infra_utils::path::resolve_project_relative_path; use crate::command_line_compiler::CommandLineCompiler; -use crate::config::SierraToCasmCompilationConfig; +use crate::config::{ + SierraCompilationConfig, + DEFAULT_MAX_CASM_BYTECODE_SIZE, + DEFAULT_MAX_CPU_TIME, + DEFAULT_MAX_MEMORY_USAGE, + DEFAULT_MAX_NATIVE_BYTECODE_SIZE, +}; use crate::errors::CompilationUtilError; use crate::test_utils::contract_class_from_file; use crate::SierraToCasmCompiler; #[cfg(feature = "cairo_native")] use crate::SierraToNativeCompiler; -const SIERRA_TO_CASM_COMPILATION_CONFIG: SierraToCasmCompilationConfig = - SierraToCasmCompilationConfig { max_bytecode_size: 81920 }; +const SIERRA_COMPILATION_CONFIG: SierraCompilationConfig = SierraCompilationConfig { + max_casm_bytecode_size: DEFAULT_MAX_CASM_BYTECODE_SIZE, + sierra_to_native_compiler_path: None, + libcairo_native_runtime_path: None, + max_native_bytecode_size: DEFAULT_MAX_NATIVE_BYTECODE_SIZE, + max_cpu_time: DEFAULT_MAX_CPU_TIME, + max_memory_usage: DEFAULT_MAX_MEMORY_USAGE, +}; fn command_line_compiler() -> CommandLineCompiler { - CommandLineCompiler::new(SIERRA_TO_CASM_COMPILATION_CONFIG) + CommandLineCompiler::new(SIERRA_COMPILATION_CONFIG) } fn get_test_contract() -> ContractClass { env::set_current_dir(resolve_project_relative_path(TEST_FILES_FOLDER).unwrap()) diff --git a/crates/starknet_sierra_multicompile/src/config.rs b/crates/starknet_sierra_multicompile/src/config.rs new file mode 100644 index 00000000000..ead8ce52884 --- /dev/null +++ b/crates/starknet_sierra_multicompile/src/config.rs @@ -0,0 +1,88 @@ +use std::collections::BTreeMap; +use std::path::PathBuf; + +use papyrus_config::dumping::{ser_optional_param, ser_param, SerializeConfig}; +use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +pub const DEFAULT_MAX_CASM_BYTECODE_SIZE: usize = 80 * 1024; +// TODO(Noa): Reconsider the default values. +pub const DEFAULT_MAX_NATIVE_BYTECODE_SIZE: u64 = 15 * 1024 * 1024; +pub const DEFAULT_MAX_CPU_TIME: u64 = 15; +pub const DEFAULT_MAX_MEMORY_USAGE: u64 = 5 * 1024 * 1024 * 1024; + +#[derive(Clone, Debug, Serialize, Deserialize, Validate, PartialEq)] +pub struct SierraCompilationConfig { + /// CASM bytecode size limit (in felts). + pub max_casm_bytecode_size: usize, + /// Native bytecode size limit (in bytes). + pub max_native_bytecode_size: u64, + /// Compilation CPU time limit (in seconds). + pub max_cpu_time: u64, + /// Compilation process’s virtual memory (address space) byte limit. + pub max_memory_usage: u64, + /// Sierra-to-Native compiler binary path. + pub sierra_to_native_compiler_path: Option, + /// Path to Cairo native runtime library file. + pub libcairo_native_runtime_path: Option, +} + +impl Default for SierraCompilationConfig { + fn default() -> Self { + Self { + max_casm_bytecode_size: DEFAULT_MAX_CASM_BYTECODE_SIZE, + sierra_to_native_compiler_path: None, + libcairo_native_runtime_path: None, + max_native_bytecode_size: DEFAULT_MAX_NATIVE_BYTECODE_SIZE, + max_cpu_time: DEFAULT_MAX_CPU_TIME, + max_memory_usage: DEFAULT_MAX_MEMORY_USAGE, + } + } +} + +impl SerializeConfig for SierraCompilationConfig { + fn dump(&self) -> BTreeMap { + let mut dump = BTreeMap::from_iter([ + ser_param( + "max_casm_bytecode_size", + &self.max_casm_bytecode_size, + "Limitation of compiled casm bytecode size.", + ParamPrivacyInput::Public, + ), + ser_param( + "max_native_bytecode_size", + &self.max_native_bytecode_size, + "Limitation of compiled native bytecode size.", + ParamPrivacyInput::Public, + ), + ser_param( + "max_cpu_time", + &self.max_cpu_time, + "Limitation of compilation cpu time (seconds).", + ParamPrivacyInput::Public, + ), + ser_param( + "max_memory_usage", + &self.max_memory_usage, + "Limitation of compilation process's virtual memory (bytes).", + ParamPrivacyInput::Public, + ), + ]); + dump.extend(ser_optional_param( + &self.sierra_to_native_compiler_path, + "".into(), + "sierra_to_native_compiler_path", + "The path to the Sierra-to-Native compiler binary.", + ParamPrivacyInput::Public, + )); + dump.extend(ser_optional_param( + &self.libcairo_native_runtime_path, + "".into(), + "libcairo_native_runtime_path", + "The path to the Cairo native runtime library file.", + ParamPrivacyInput::Public, + )); + dump + } +} diff --git a/crates/starknet_sierra_compile/src/constants.rs b/crates/starknet_sierra_multicompile/src/constants.rs similarity index 100% rename from crates/starknet_sierra_compile/src/constants.rs rename to crates/starknet_sierra_multicompile/src/constants.rs diff --git a/crates/starknet_sierra_compile/src/errors.rs b/crates/starknet_sierra_multicompile/src/errors.rs similarity index 92% rename from crates/starknet_sierra_compile/src/errors.rs rename to crates/starknet_sierra_multicompile/src/errors.rs index d38760a5f76..0de236d66e7 100644 --- a/crates/starknet_sierra_compile/src/errors.rs +++ b/crates/starknet_sierra_multicompile/src/errors.rs @@ -2,9 +2,10 @@ use cairo_lang_starknet_classes::allowed_libfuncs::AllowedLibfuncsError; use cairo_lang_starknet_classes::casm_contract_class::StarknetSierraCompilationError; #[cfg(feature = "cairo_native")] use cairo_native; +use serde::{Deserialize, Serialize}; use thiserror::Error; -#[derive(Debug, Error)] +#[derive(Clone, Debug, Error, PartialEq, Eq, Serialize, Deserialize)] pub enum CompilationUtilError { #[error("Starknet Sierra compilation error: {0}")] CompilationError(String), diff --git a/crates/starknet_sierra_compile/src/lib.rs b/crates/starknet_sierra_multicompile/src/lib.rs similarity index 97% rename from crates/starknet_sierra_compile/src/lib.rs rename to crates/starknet_sierra_multicompile/src/lib.rs index 80a543d24b3..11773f51f5d 100644 --- a/crates/starknet_sierra_compile/src/lib.rs +++ b/crates/starknet_sierra_multicompile/src/lib.rs @@ -11,6 +11,7 @@ pub mod config; pub mod constants; pub mod errors; pub mod paths; +pub mod resource_limits; pub mod utils; #[cfg(test)] diff --git a/crates/starknet_sierra_compile/src/paths.rs b/crates/starknet_sierra_multicompile/src/paths.rs similarity index 100% rename from crates/starknet_sierra_compile/src/paths.rs rename to crates/starknet_sierra_multicompile/src/paths.rs diff --git a/crates/starknet_sierra_multicompile/src/resource_limits.rs b/crates/starknet_sierra_multicompile/src/resource_limits.rs new file mode 100644 index 00000000000..b9b6340a8eb --- /dev/null +++ b/crates/starknet_sierra_multicompile/src/resource_limits.rs @@ -0,0 +1,119 @@ +#![allow(dead_code)] +use std::io; +use std::os::unix::process::CommandExt; +use std::process::Command; + +use rlimit::{setrlimit, Resource}; + +#[cfg(test)] +#[path = "resource_limits_test.rs"] +pub mod test; + +/// A struct to hold the information needed to set a limit on an individual OS resource. +struct RLimit { + /// A kind of resource. All resource constants are available on all unix platforms. + /// See for more information. + resource: Resource, + /// The soft limit for the resource. The limit may be increased by the process being limited. + soft_limit: u64, + /// The hard limit for the resource. May not be increased or exceeded by the affected process. + hard_limit: u64, + /// The units by which the resource is measured. + units: String, +} + +impl RLimit { + /// Set the resource limit for the current process. + fn set(&self) -> io::Result<()> { + // Use `println!` and not a logger because this method is called in an unsafe block, and we + // don't want to risk unexpected behavior. + println!( + "Setting {:?} limits: {} {} soft limit; {} {} hard limit.", + self.resource, self.soft_limit, self.units, self.hard_limit, self.units + ); + setrlimit(self.resource, self.soft_limit, self.hard_limit) + } +} + +/// A struct to hold resource limits for a process. +/// Each limit is optional and can be set to `None` if not needed. +pub struct ResourceLimits { + /// A limit (in seconds) on the amount of CPU time that the process can consume. + cpu_time: Option, + /// The maximum size (in bytes) of files that the process may create. + file_size: Option, + /// The maximum size (in bytes) of the process’s virtual memory (address space). + memory_size: Option, +} + +impl ResourceLimits { + pub fn new( + cpu_time: Option, + file_size: Option, + memory_size: Option, + ) -> ResourceLimits { + ResourceLimits { + cpu_time: cpu_time.map(|t| RLimit { + resource: Resource::CPU, + soft_limit: t, + hard_limit: t, + units: "seconds".to_string(), + }), + file_size: file_size.map(|x| RLimit { + resource: Resource::FSIZE, + soft_limit: x, + hard_limit: x, + units: "bytes".to_string(), + }), + memory_size: memory_size.map(|y| RLimit { + resource: Resource::AS, + soft_limit: y, + hard_limit: y, + units: "bytes".to_string(), + }), + } + } + + /// Set all defined resource limits for the current process. Limits set to `None` are ignored. + pub fn set(&self) -> io::Result<()> { + [self.cpu_time.as_ref(), self.file_size.as_ref(), self.memory_size.as_ref()] + .iter() + .flatten() + .try_for_each(|resource_limit| resource_limit.set()) + } + + /// Apply the resource limits to a given command object. This moves the [`ResourceLimits`] + /// struct into a closure that is held by the given command. The closure is executed in the + /// child process spawned by the command, right before it invokes the `exec` system call. + /// NOTE: This method is only implemented for Unix-like systems. + pub fn apply(self, command: &mut Command) -> &mut Command { + if self.cpu_time.is_none() && self.file_size.is_none() && self.memory_size.is_none() { + return command; + } + #[cfg(unix)] + unsafe { + // The `pre_exec` method runs a given closure after the parent process has been forked + // but before the child process calls `exec`. + // + // This closure runs in the child process after a `fork`, which primarily means that any + // modifications made to memory on behalf of this closure will **not** be visible to the + // parent process. This environment is often very constrained. Normal operations--such + // as using `malloc`, accessing environment variables through [`std::env`] or acquiring + // a mutex--are not guaranteed to work, because after `fork`, only one thread exists in + // the child process, while there may be multiple threads in the parent process. + // + // This closure is considered safe for the following reasons: + // 1. The [`ResourceLimits`] struct is fully constructed and moved into the closure. + // 2. No heap allocations occur in the `set` method. + // 3. `setrlimit` is an async-signal-safe system call, which means it is safe to invoke + // after `fork`. This is established in the POSIX `fork` specification: + // > ... the child process may only execute async-signal-safe operations until such + // time as one of the `exec` functions is called. + // (See ) + command.pre_exec(move || self.set()) + } + #[cfg(not(unix))] + // Not implemented for Windows. + unimplemented!("Resource limits are not implemented for Windows.") + } +} diff --git a/crates/starknet_sierra_multicompile/src/resource_limits_test.rs b/crates/starknet_sierra_multicompile/src/resource_limits_test.rs new file mode 100644 index 00000000000..67530b16b3a --- /dev/null +++ b/crates/starknet_sierra_multicompile/src/resource_limits_test.rs @@ -0,0 +1,81 @@ +use std::process::Command; +use std::time::Instant; + +use rstest::rstest; +use tempfile::NamedTempFile; + +use crate::resource_limits::ResourceLimits; + +#[rstest] +fn test_cpu_time_limit() { + let cpu_limit = 1; // 1 second + let cpu_time_rlimit = ResourceLimits::new(Some(cpu_limit), None, None); + + let start = Instant::now(); + let mut command = Command::new("bash"); + command.args(["-c", "while true; do :; done;"]); + cpu_time_rlimit.apply(&mut command); + command.spawn().expect("Failed to start CPU consuming process").wait().unwrap(); + assert!(start.elapsed().as_secs() <= cpu_limit); +} + +#[rstest] +fn test_memory_size_limit() { + let memory_limit = 9 * 512 * 1024; // 4.5 MB + let memory_size_rlimit = ResourceLimits::new(None, None, Some(memory_limit)); + + let mut command = Command::new("bash"); + command.args(["-c", "a=(); while true; do a+=0; done;"]); + command.stderr(std::process::Stdio::piped()); + memory_size_rlimit.apply(&mut command); + let output = command.output().expect("Failed to start memory consuming process"); + let stderr = String::from_utf8_lossy(&output.stderr); + for line in stderr.lines() { + if line.starts_with("bash: xmalloc: cannot allocate") { + println!( + "Child process exited with status code: {}, and the following memory allocation \ + error:\n {}.", + output.status.code().unwrap(), + line + ); + return; + } + } + + panic!("Child process did not exit with a memory allocation error."); +} + +#[rstest] +fn test_file_size_limit() { + let file_limit = 10; // 10 bytes + let file_size_rlimit = ResourceLimits::new(None, Some(file_limit), None); + let temp_file = NamedTempFile::new().expect("Failed to create temporary file"); + let temp_file_path = temp_file.path().to_str().unwrap(); + + let mut command = Command::new("bash"); + command.args(["-c", format!("while true; do echo 0 >> {temp_file_path}; done;").as_str()]); + file_size_rlimit.apply(&mut command); + command.spawn().expect("Failed to start disk consuming process").wait().unwrap(); + assert_eq!(std::fs::metadata(temp_file_path).unwrap().len(), file_limit); +} + +#[rstest] +fn test_successful_resource_limited_command() { + let print_message = "Hello World!"; + + let cpu_limit = Some(1); // 1 second + let file_limit = Some(u64::try_from(print_message.len()).unwrap() + 1); + let memory_limit = Some(5 * 1024 * 1024); // 5 MB + let resource_limits = ResourceLimits::new(cpu_limit, file_limit, memory_limit); + + let temp_file = NamedTempFile::new().expect("Failed to create temporary file"); + let temp_file_path = temp_file.path().to_str().unwrap(); + + let mut command = Command::new("bash"); + command.args(["-c", format!("echo '{print_message}' > {temp_file_path}").as_str()]); + resource_limits.apply(&mut command); + let exit_status = command.spawn().expect("Failed to start process").wait().unwrap(); + + assert!(exit_status.success()); + assert_eq!(std::fs::read_to_string(temp_file_path).unwrap(), format!("{print_message}\n")); +} diff --git a/crates/starknet_sierra_compile/src/test_utils.rs b/crates/starknet_sierra_multicompile/src/test_utils.rs similarity index 100% rename from crates/starknet_sierra_compile/src/test_utils.rs rename to crates/starknet_sierra_multicompile/src/test_utils.rs diff --git a/crates/starknet_sierra_compile/src/utils.rs b/crates/starknet_sierra_multicompile/src/utils.rs similarity index 100% rename from crates/starknet_sierra_compile/src/utils.rs rename to crates/starknet_sierra_multicompile/src/utils.rs diff --git a/crates/starknet_state_sync/Cargo.toml b/crates/starknet_state_sync/Cargo.toml index 0f70c2e590c..c2e043455f1 100644 --- a/crates/starknet_state_sync/Cargo.toml +++ b/crates/starknet_state_sync/Cargo.toml @@ -16,6 +16,7 @@ papyrus_network.workspace = true papyrus_p2p_sync.workspace = true papyrus_storage.workspace = true serde.workspace = true +starknet-types-core.workspace = true starknet_api = { workspace = true, features = ["testing"] } starknet_sequencer_infra.workspace = true starknet_state_sync_types.workspace = true @@ -23,4 +24,4 @@ tokio.workspace = true validator.workspace = true [dev-dependencies] -papyrus_storage = { workspace = true, features = ["testing"] } +papyrus_storage = { path = "../papyrus_storage", features = ["testing"] } diff --git a/crates/starknet_state_sync/src/config.rs b/crates/starknet_state_sync/src/config.rs index cb0a371accc..985f2d124eb 100644 --- a/crates/starknet_state_sync/src/config.rs +++ b/crates/starknet_state_sync/src/config.rs @@ -10,6 +10,8 @@ use papyrus_storage::StorageConfig; use serde::{Deserialize, Serialize}; use validator::Validate; +const STATE_SYNC_TCP_PORT: u16 = 12345; + #[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Validate)] pub struct StateSyncConfig { #[validate] @@ -44,7 +46,7 @@ impl Default for StateSyncConfig { ..Default::default() }, p2p_sync_client_config: Default::default(), - network_config: Default::default(), + network_config: NetworkConfig { tcp_port: STATE_SYNC_TCP_PORT, ..Default::default() }, } } } diff --git a/crates/starknet_state_sync/src/lib.rs b/crates/starknet_state_sync/src/lib.rs index b9ba8fb24d6..322e5cd70fe 100644 --- a/crates/starknet_state_sync/src/lib.rs +++ b/crates/starknet_state_sync/src/lib.rs @@ -2,29 +2,38 @@ pub mod config; pub mod runner; use async_trait::async_trait; +use futures::channel::mpsc::{channel, Sender}; +use futures::SinkExt; use papyrus_storage::body::BodyStorageReader; +use papyrus_storage::compiled_class::CasmStorageReader; +use papyrus_storage::db::TransactionKind; use papyrus_storage::state::StateStorageReader; -use papyrus_storage::StorageReader; +use papyrus_storage::{StorageReader, StorageTxn}; use starknet_api::block::BlockNumber; +use starknet_api::contract_class::{ContractClass, SierraVersion}; +use starknet_api::core::{ClassHash, ContractAddress, Nonce, BLOCK_HASH_TABLE_ADDRESS}; +use starknet_api::state::{StateNumber, StorageKey}; use starknet_sequencer_infra::component_definitions::{ComponentRequestHandler, ComponentStarter}; use starknet_sequencer_infra::component_server::{LocalComponentServer, RemoteComponentServer}; -use starknet_state_sync_types::communication::{ - StateSyncRequest, - StateSyncResponse, - StateSyncResult, -}; -use starknet_state_sync_types::state_sync_types::SyncBlock; +use starknet_state_sync_types::communication::{StateSyncRequest, StateSyncResponse}; +use starknet_state_sync_types::errors::StateSyncError; +use starknet_state_sync_types::state_sync_types::{StateSyncResult, SyncBlock}; +use starknet_types_core::felt::Felt; use crate::config::StateSyncConfig; use crate::runner::StateSyncRunner; +const BUFFER_SIZE: usize = 100000; + pub fn create_state_sync_and_runner(config: StateSyncConfig) -> (StateSync, StateSyncRunner) { - let (state_sync_runner, storage_reader) = StateSyncRunner::new(config); - (StateSync { storage_reader }, state_sync_runner) + let (new_block_sender, new_block_receiver) = channel(BUFFER_SIZE); + let (state_sync_runner, storage_reader) = StateSyncRunner::new(config, new_block_receiver); + (StateSync { storage_reader, new_block_sender }, state_sync_runner) } pub struct StateSync { storage_reader: StorageReader, + new_block_sender: Sender<(BlockNumber, SyncBlock)>, } // TODO(shahak): Have StateSyncRunner call StateSync instead of the opposite once we stop supporting @@ -36,8 +45,33 @@ impl ComponentRequestHandler for StateSync StateSyncRequest::GetBlock(block_number) => { StateSyncResponse::GetBlock(self.get_block(block_number)) } - StateSyncRequest::AddNewBlock(_block_number, _sync_block) => { - todo!() + StateSyncRequest::AddNewBlock(block_number, sync_block) => { + StateSyncResponse::AddNewBlock( + self.new_block_sender + .send((block_number, sync_block)) + .await + .map_err(StateSyncError::from), + ) + } + StateSyncRequest::GetStorageAt(block_number, contract_address, storage_key) => { + StateSyncResponse::GetStorageAt(self.get_storage_at( + block_number, + contract_address, + storage_key, + )) + } + StateSyncRequest::GetNonceAt(block_number, contract_address) => { + StateSyncResponse::GetNonceAt(self.get_nonce_at(block_number, contract_address)) + } + StateSyncRequest::GetClassHashAt(block_number, contract_address) => { + StateSyncResponse::GetClassHashAt( + self.get_class_hash_at(block_number, contract_address), + ) + } + StateSyncRequest::GetCompiledClassDeprecated(block_number, class_hash) => { + StateSyncResponse::GetCompiledClassDeprecated( + self.get_compiled_class_deprecated(block_number, class_hash), + ) } } } @@ -49,6 +83,7 @@ impl StateSync { if let Some(block_transaction_hashes) = txn.get_block_transaction_hashes(block_number)? { if let Some(thin_state_diff) = txn.get_state_diff(block_number)? { return Ok(Some(SyncBlock { + block_number, state_diff: thin_state_diff, transaction_hashes: block_transaction_hashes, })); @@ -57,6 +92,119 @@ impl StateSync { Ok(None) } + + fn get_storage_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + storage_key: StorageKey, + ) -> StateSyncResult { + let txn = self.storage_reader.begin_ro_txn()?; + verify_synced_up_to(&txn, block_number)?; + + let state_number = StateNumber::unchecked_right_after_block(block_number); + let state_reader = txn.get_state_reader()?; + let res = state_reader.get_storage_at(state_number, &contract_address, &storage_key)?; + + // If the contract is not deployed, res will be 0. Checking if that's the case so + // that we'll return an error instead. + // Contract address 0x1 is a special address, it stores the block + // hashes. Contracts are not deployed to this address. + if res == Felt::default() && contract_address != BLOCK_HASH_TABLE_ADDRESS { + // check if the contract exists + state_reader + .get_class_hash_at(state_number, &contract_address)? + .ok_or(StateSyncError::ContractNotFound(contract_address))?; + }; + + Ok(res) + } + + fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncResult { + let txn = self.storage_reader.begin_ro_txn()?; + verify_synced_up_to(&txn, block_number)?; + + let state_number = StateNumber::unchecked_right_after_block(block_number); + let state_reader = txn.get_state_reader()?; + let res = state_reader + .get_nonce_at(state_number, &contract_address)? + .ok_or(StateSyncError::ContractNotFound(contract_address))?; + + Ok(res) + } + + fn get_class_hash_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncResult { + let txn = self.storage_reader.begin_ro_txn()?; + verify_synced_up_to(&txn, block_number)?; + + let state_number = StateNumber::unchecked_right_after_block(block_number); + let state_reader = txn.get_state_reader()?; + let class_hash = state_reader + .get_class_hash_at(state_number, &contract_address)? + .ok_or(StateSyncError::ContractNotFound(contract_address))?; + Ok(class_hash) + } + + fn get_compiled_class_deprecated( + &self, + block_number: BlockNumber, + class_hash: ClassHash, + ) -> StateSyncResult { + let txn = self.storage_reader.begin_ro_txn()?; + let latest_block_number = txn.get_compiled_class_marker()?.prev(); + if latest_block_number.is_none_or(|latest_block_number| latest_block_number < block_number) + { + return Err(StateSyncError::BlockNotFound(block_number)); + } + + let state_reader = txn.get_state_reader()?; + + // Check if this class exists in the Cairo1 classes table. + if let Some(class_definition_block_number) = + state_reader.get_class_definition_block_number(&class_hash)? + { + if class_definition_block_number > block_number { + return Err(StateSyncError::ClassNotFound(class_hash)); + } + + let (option_casm, option_sierra) = txn.get_casm_and_sierra(&class_hash)?; + + // Check if both options are `Some`. If not, since we verified the block number is + // smaller than the casm marker, we return that the class doesnt exist. + let (casm, sierra) = + option_casm.zip(option_sierra).ok_or(StateSyncError::ClassNotFound(class_hash))?; + let sierra_version = SierraVersion::extract_from_program(&sierra.sierra_program)?; + return Ok(ContractClass::V1((casm, sierra_version))); + } + + // Check if this class exists in the Cairo0 classes table. + let state_number = StateNumber::unchecked_right_after_block(block_number); + let deprecated_compiled_contract_class = state_reader + .get_deprecated_class_definition_at(state_number, &class_hash)? + .ok_or(StateSyncError::ClassNotFound(class_hash))?; + Ok(ContractClass::V0(deprecated_compiled_contract_class)) + } +} + +fn verify_synced_up_to( + txn: &StorageTxn<'_, Mode>, + block_number: BlockNumber, +) -> Result<(), StateSyncError> { + if let Some(latest_block_number) = txn.get_state_marker()?.prev() { + if latest_block_number >= block_number { + return Ok(()); + } + } + + Err(StateSyncError::BlockNotFound(block_number)) } pub type LocalStateSyncServer = diff --git a/crates/starknet_state_sync/src/runner/mod.rs b/crates/starknet_state_sync/src/runner/mod.rs index fe749c6ed69..edb6371fa87 100644 --- a/crates/starknet_state_sync/src/runner/mod.rs +++ b/crates/starknet_state_sync/src/runner/mod.rs @@ -2,6 +2,7 @@ mod test; use async_trait::async_trait; +use futures::channel::mpsc::Receiver; use futures::future::BoxFuture; use futures::{FutureExt, StreamExt}; use papyrus_network::network_manager::{self, NetworkError}; @@ -9,9 +10,11 @@ use papyrus_p2p_sync::client::{P2PSyncClient, P2PSyncClientChannels, P2PSyncClie use papyrus_p2p_sync::server::{P2PSyncServer, P2PSyncServerChannels}; use papyrus_p2p_sync::{Protocol, BUFFER_SIZE}; use papyrus_storage::{open_storage, StorageReader}; +use starknet_api::block::BlockNumber; use starknet_sequencer_infra::component_definitions::ComponentStarter; use starknet_sequencer_infra::component_server::WrapperServer; use starknet_sequencer_infra::errors::ComponentError; +use starknet_state_sync_types::state_sync_types::SyncBlock; use crate::config::StateSyncConfig; @@ -38,7 +41,10 @@ impl ComponentStarter for StateSyncRunner { } impl StateSyncRunner { - pub fn new(config: StateSyncConfig) -> (Self, StorageReader) { + pub fn new( + config: StateSyncConfig, + new_block_receiver: Receiver<(BlockNumber, SyncBlock)>, + ) -> (Self, StorageReader) { let (storage_reader, storage_writer) = open_storage(config.storage_config).expect("StateSyncRunner failed opening storage"); @@ -66,7 +72,7 @@ impl StateSyncRunner { storage_reader.clone(), storage_writer, p2p_sync_client_channels, - futures::stream::pending().boxed(), + new_block_receiver.boxed(), ); let header_server_receiver = network_manager diff --git a/crates/starknet_state_sync_types/Cargo.toml b/crates/starknet_state_sync_types/Cargo.toml index f9204e63388..5df2d7fa51d 100644 --- a/crates/starknet_state_sync_types/Cargo.toml +++ b/crates/starknet_state_sync_types/Cargo.toml @@ -10,9 +10,11 @@ workspace = true [dependencies] async-trait.workspace = true +futures.workspace = true papyrus_proc_macros.workspace = true papyrus_storage.workspace = true serde = { workspace = true, features = ["derive"] } +starknet-types-core.workspace = true starknet_api.workspace = true starknet_sequencer_infra.workspace = true thiserror.workspace = true diff --git a/crates/starknet_state_sync_types/src/communication.rs b/crates/starknet_state_sync_types/src/communication.rs index d940e6d0652..4c1a56c7946 100644 --- a/crates/starknet_state_sync_types/src/communication.rs +++ b/crates/starknet_state_sync_types/src/communication.rs @@ -4,6 +4,9 @@ use async_trait::async_trait; use papyrus_proc_macros::handle_response_variants; use serde::{Deserialize, Serialize}; use starknet_api::block::BlockNumber; +use starknet_api::contract_class::ContractClass; +use starknet_api::core::{ClassHash, ContractAddress, Nonce}; +use starknet_api::state::StorageKey; use starknet_sequencer_infra::component_client::{ ClientError, LocalComponentClient, @@ -13,10 +16,11 @@ use starknet_sequencer_infra::component_definitions::{ ComponentClient, ComponentRequestAndResponseSender, }; +use starknet_types_core::felt::Felt; use thiserror::Error; use crate::errors::StateSyncError; -use crate::state_sync_types::SyncBlock; +use crate::state_sync_types::{StateSyncResult, SyncBlock}; #[async_trait] pub trait StateSyncClient: Send + Sync { @@ -27,17 +31,43 @@ pub trait StateSyncClient: Send + Sync { block_number: BlockNumber, ) -> StateSyncClientResult>; - // Add a new block to the sync storage from another component within the same node. + /// Notify the sync that a new block has been created within the node so that other peers can + /// learn about it through sync. async fn add_new_block( &self, block_number: BlockNumber, sync_block: SyncBlock, ) -> StateSyncClientResult<()>; - // TODO: Add state reader methods for gateway. -} + async fn get_storage_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + storage_key: StorageKey, + ) -> StateSyncClientResult; + + async fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult; -pub type StateSyncResult = Result; + async fn get_class_hash_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult; + + // TODO: Remove this and fix sync state reader once the compiler component is ready. + async fn get_compiled_class_deprecated( + &self, + block_number: BlockNumber, + class_hash: ClassHash, + ) -> StateSyncClientResult; + + // TODO: Add get_compiled_class_hash for StateSyncReader + // TODO: Add get_block_info for StateSyncReader +} #[derive(Clone, Debug, Error)] pub enum StateSyncClientError { @@ -58,12 +88,20 @@ pub type StateSyncRequestAndResponseSender = pub enum StateSyncRequest { GetBlock(BlockNumber), AddNewBlock(BlockNumber, SyncBlock), + GetStorageAt(BlockNumber, ContractAddress, StorageKey), + GetNonceAt(BlockNumber, ContractAddress), + GetClassHashAt(BlockNumber, ContractAddress), + GetCompiledClassDeprecated(BlockNumber, ClassHash), } #[derive(Clone, Debug, Serialize, Deserialize)] pub enum StateSyncResponse { GetBlock(StateSyncResult>), AddNewBlock(StateSyncResult<()>), + GetStorageAt(StateSyncResult), + GetNonceAt(StateSyncResult), + GetClassHashAt(StateSyncResult), + GetCompiledClassDeprecated(StateSyncResult), } #[async_trait] @@ -91,6 +129,67 @@ impl StateSyncClient for LocalStateSyncClient { StateSyncError ) } + + async fn get_storage_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + storage_key: StorageKey, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetStorageAt(block_number, contract_address, storage_key); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetStorageAt, + StateSyncClientError, + StateSyncError + ) + } + + async fn get_nonce_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetNonceAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetNonceAt, + StateSyncClientError, + StateSyncError + ) + } + + async fn get_class_hash_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetClassHashAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetClassHashAt, + StateSyncClientError, + StateSyncError + ) + } + + async fn get_compiled_class_deprecated( + &self, + block_number: BlockNumber, + class_hash: ClassHash, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetCompiledClassDeprecated(block_number, class_hash); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetCompiledClassDeprecated, + StateSyncClientError, + StateSyncError + ) + } } #[async_trait] @@ -118,25 +217,65 @@ impl StateSyncClient for RemoteStateSyncClient { StateSyncError ) } -} -// TODO(shahak): Remove this once we connect state sync to the node. -pub struct EmptyStateSyncClient; + async fn get_storage_at( + &self, + block_number: BlockNumber, + contract_address: ContractAddress, + storage_key: StorageKey, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetStorageAt(block_number, contract_address, storage_key); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetStorageAt, + StateSyncClientError, + StateSyncError + ) + } -#[async_trait] -impl StateSyncClient for EmptyStateSyncClient { - async fn get_block( + async fn get_nonce_at( &self, - _block_number: BlockNumber, - ) -> StateSyncClientResult> { - Ok(None) + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetNonceAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetNonceAt, + StateSyncClientError, + StateSyncError + ) } - async fn add_new_block( + async fn get_class_hash_at( &self, - _block_number: BlockNumber, - _sync_block: SyncBlock, - ) -> StateSyncClientResult<()> { - Ok(()) + block_number: BlockNumber, + contract_address: ContractAddress, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetClassHashAt(block_number, contract_address); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetClassHashAt, + StateSyncClientError, + StateSyncError + ) + } + + async fn get_compiled_class_deprecated( + &self, + block_number: BlockNumber, + class_hash: ClassHash, + ) -> StateSyncClientResult { + let request = StateSyncRequest::GetCompiledClassDeprecated(block_number, class_hash); + let response = self.send(request).await; + handle_response_variants!( + StateSyncResponse, + GetCompiledClassDeprecated, + StateSyncClientError, + StateSyncError + ) } } diff --git a/crates/starknet_state_sync_types/src/errors.rs b/crates/starknet_state_sync_types/src/errors.rs index f5842256ac0..c9ae8d0a190 100644 --- a/crates/starknet_state_sync_types/src/errors.rs +++ b/crates/starknet_state_sync_types/src/errors.rs @@ -1,15 +1,31 @@ +use futures::channel::mpsc::SendError; use papyrus_storage::StorageError; use serde::{Deserialize, Serialize}; +use starknet_api::block::BlockNumber; +use starknet_api::core::{ClassHash, ContractAddress}; +use starknet_api::StarknetApiError; use thiserror::Error; #[derive(Debug, Error, Serialize, Deserialize, Clone)] pub enum StateSyncError { #[error("Communication error between StateSync and StateSyncRunner")] RunnerCommunicationError, - // StorageError does not derive Serialize, Deserialize and Clone Traits. - // We put the string of the error instead. + #[error("Block number {0} was not found")] + BlockNotFound(BlockNumber), + #[error("Contract address {0} was not found")] + ContractNotFound(ContractAddress), + #[error("Class hash {0} was not found")] + ClassNotFound(ClassHash), + // StorageError and StarknetApiError do not derive Serialize, Deserialize and Clone Traits. + // We put the string of the errors instead. #[error("Unexpected storage error: {0}")] StorageError(String), + // SendError does not derive Serialize and Deserialize Traits. + // We put the string of the error instead. + #[error("Error while sending SyncBlock from StateSync to P2pSyncClient")] + SendError(String), + #[error("Unexpected starknet api error: {0}")] + StarknetApiError(String), } impl From for StateSyncError { @@ -17,3 +33,15 @@ impl From for StateSyncError { StateSyncError::StorageError(error.to_string()) } } + +impl From for StateSyncError { + fn from(error: StarknetApiError) -> Self { + StateSyncError::StarknetApiError(error.to_string()) + } +} + +impl From for StateSyncError { + fn from(error: SendError) -> Self { + StateSyncError::SendError(error.to_string()) + } +} diff --git a/crates/starknet_state_sync_types/src/state_sync_types.rs b/crates/starknet_state_sync_types/src/state_sync_types.rs index 4a2b7b2d45f..a44350272b2 100644 --- a/crates/starknet_state_sync_types/src/state_sync_types.rs +++ b/crates/starknet_state_sync_types/src/state_sync_types.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use starknet_api::block::BlockNumber; use starknet_api::state::ThinStateDiff; use starknet_api::transaction::TransactionHash; @@ -13,6 +14,7 @@ pub type StateSyncResult = Result; /// needed for verifying the block #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SyncBlock { + pub block_number: BlockNumber, pub state_diff: ThinStateDiff, // TODO: decide if we want block hash, parent block hash and full classes here. pub transaction_hashes: Vec, diff --git a/deployments/images/base/Dockerfile b/deployments/images/base/Dockerfile index 931544cd0ce..81da8373378 100644 --- a/deployments/images/base/Dockerfile +++ b/deployments/images/base/Dockerfile @@ -7,7 +7,6 @@ # More info on Cargo Chef: https://github.com/LukeMathWalker/cargo-chef FROM ubuntu:22.04 AS base -# WORKDIR /app COPY scripts/install_build_tools.sh . COPY scripts/dependencies.sh . diff --git a/deployments/images/sequencer/Dockerfile b/deployments/images/sequencer/Dockerfile index d62dc01880d..ca7920c99a3 100644 --- a/deployments/images/sequencer/Dockerfile +++ b/deployments/images/sequencer/Dockerfile @@ -1,21 +1,22 @@ -# syntax = devthefuture/dockerfile-x +#syntax = devthefuture/dockerfile-x INCLUDE deployments/images/base/Dockerfile # Compile the sequencer_node crate in release mode, ensuring dependencies are locked. FROM base AS builder +WORKDIR /app COPY . . -RUN cargo build --release --package starknet_sequencer_node +RUN cargo build --bin starknet_sequencer_node FROM base AS sequencer ENV ID=1000 WORKDIR /app -COPY --from=builder /target/release/starknet_sequencer_node /app/target/release/starknet_sequencer_node +COPY --from=builder /app/target/debug/starknet_sequencer_node ./target/debug/starknet_sequencer_node # Copy sequencer config -COPY config/sequencer config/sequencer +COPY config/sequencer/default_config.json /app/config/sequencer/ # Create a new user "sequencer". RUN set -ex; \ @@ -30,4 +31,4 @@ EXPOSE 8080 8081 8082 USER ${ID} # Set the entrypoint to use tini to manage the process. -ENTRYPOINT ["tini", "--", "/app/target/release/starknet_sequencer_node"] +ENTRYPOINT ["tini", "--", "/app/target/debug/starknet_sequencer_node"] diff --git a/deployments/sequencer/.gitignore b/deployments/sequencer/.gitignore new file mode 100644 index 00000000000..8ae8ce5341c --- /dev/null +++ b/deployments/sequencer/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +.idea/ diff --git a/deployments/sequencer/app/service.py b/deployments/sequencer/app/service.py index 5cd5c95fa19..1d5816f4220 100644 --- a/deployments/sequencer/app/service.py +++ b/deployments/sequencer/app/service.py @@ -1,12 +1,12 @@ import json +import typing -from itertools import chain from constructs import Construct -from cdk8s import Names, ApiObjectMetadata +from cdk8s import Names from imports import k8s -from imports.com.google import cloud as google +from imports.k8s import IngressTls -from services import topology +from services import topology, const class ServiceApp(Construct): @@ -16,252 +16,206 @@ def __init__( id: str, *, namespace: str, - topology: topology.ServiceTopology, + service_topology: topology.ServiceTopology, ): super().__init__(scope, id) self.namespace = namespace self.label = {"app": Names.to_label_value(self, include_hash=False)} - self.topology = topology - self.node_config = topology.config.get_config() + self.host = f"{self.node.id}.{self.namespace}.sw-dev.io" + self.service_topology = service_topology + self.node_config = service_topology.config.get_merged_config() - self.set_k8s_namespace() + k8s.KubeNamespace(self, "namespace", metadata=k8s.ObjectMeta(name=self.namespace)) - if topology.service is not None: - self.set_k8s_service() - - if topology.config is not None: - self.set_k8s_configmap() - - if topology.deployment is not None: - self.set_k8s_deployment() - - if topology.ingress is not None: - self.set_k8s_ingress() - - if topology.pvc is not None: - self.set_k8s_pvc() - - def set_k8s_namespace(self): - return k8s.KubeNamespace(self, "namespace", metadata=k8s.ObjectMeta(name=self.namespace)) - - def set_k8s_configmap(self): - return k8s.KubeConfigMap( + k8s.KubeConfigMap( self, "configmap", metadata=k8s.ObjectMeta(name=f"{self.node.id}-config"), - data=dict(config=json.dumps(self.topology.config.get_config())), + data=dict(config=json.dumps(self.service_topology.config.get_config())), ) - def set_k8s_service(self): - return k8s.KubeService( + k8s.KubeService( self, "service", spec=k8s.ServiceSpec( - type=self.topology.service.type.value, - ports=[ - k8s.ServicePort( - name=port.name, - port=port.port, - target_port=k8s.IntOrString.from_number(port.container_port), - ) - for port in self.topology.service.ports - ], + type=const.ServiceType.CLUSTER_IP, + ports=self._get_service_ports(), selector=self.label, ), ) - def _get_container_ports(self): - ports = [] - for c in ["http_server_config.port", "monitoring_endpoint_config.port"]: - ports.append(self.node_config[c].get("value")) - return ports - - def set_k8s_deployment(self): - node_http_port = self.node_config["http_server_config.port"].get("value") - return k8s.KubeDeployment( + k8s.KubeDeployment( self, "deployment", spec=k8s.DeploymentSpec( - replicas=self.topology.deployment.replicas, + replicas=self.service_topology.deployment.replicas, selector=k8s.LabelSelector(match_labels=self.label), template=k8s.PodTemplateSpec( metadata=k8s.ObjectMeta(labels=self.label), spec=k8s.PodSpec( security_context=k8s.PodSecurityContext(fs_group=1000), + volumes=self._get_volumes(), containers=[ k8s.Container( - name=f"{self.node.id}-{container.name}", - image=container.image, + name=self.node.id, + image=self.service_topology.images.get("sequencer"), + image_pull_policy="IfNotPresent", # command=["sleep", "infinity"], - args=container.args, - ports=[ - k8s.ContainerPort( - container_port=port, - ) - for port in self._get_container_ports() - ], - startup_probe=( - k8s.Probe( - http_get=k8s.HttpGetAction( - path=container.startup_probe.path, - port=k8s.IntOrString.from_number(node_http_port), - ), - period_seconds=container.startup_probe.period_seconds, - failure_threshold=container.startup_probe.failure_threshold, - timeout_seconds=container.startup_probe.timeout_seconds, - ) - if container.startup_probe is not None - else None - ), - readiness_probe=( - k8s.Probe( - http_get=k8s.HttpGetAction( - path=container.readiness_probe.path, - port=k8s.IntOrString.from_number(node_http_port), - ), - period_seconds=container.readiness_probe.period_seconds, - failure_threshold=container.readiness_probe.failure_threshold, - timeout_seconds=container.readiness_probe.timeout_seconds, - ) - if container.readiness_probe is not None - else None - ), - liveness_probe=( - k8s.Probe( - http_get=k8s.HttpGetAction( - path=container.liveness_probe.path, - port=k8s.IntOrString.from_number(node_http_port), - ), - period_seconds=container.liveness_probe.period_seconds, - failure_threshold=container.liveness_probe.failure_threshold, - timeout_seconds=container.liveness_probe.timeout_seconds, - ) - if container.liveness_probe is not None - else None - ), - volume_mounts=[ - k8s.VolumeMount( - name=mount.name, - mount_path=mount.mount_path, - read_only=mount.read_only, - ) - for mount in container.volume_mounts - ], + args=const.CONTAINER_ARGS, + ports=self._get_container_ports(), + startup_probe=self._get_http_probe(), + readiness_probe=self._get_http_probe(), + liveness_probe=self._get_http_probe(), + volume_mounts=self._get_volume_mounts(), ) - for container in self.topology.deployment.containers ], - volumes=list( - chain( - ( - ( - k8s.Volume( - name=f"{self.node.id}-{volume.name}", - config_map=k8s.ConfigMapVolumeSource( - name=f"{self.node.id}-{volume.name}" - ), - ) - for volume in self.topology.deployment.configmap_volumes - ) - if self.topology.deployment.configmap_volumes is not None - else None - ), - ( - ( - k8s.Volume( - name=f"{self.node.id}-{volume.name}", - persistent_volume_claim=k8s.PersistentVolumeClaimVolumeSource( - claim_name=f"{self.node.id}-{volume.name}", - read_only=volume.read_only, - ), - ) - for volume in self.topology.deployment.pvc_volumes - ) - if self.topology.deployment is not None - else None - ), - ) - ), ), ), ), ) - def set_k8s_ingress(self): - return k8s.KubeIngress( + k8s.KubeIngress( self, "ingress", metadata=k8s.ObjectMeta( name=f"{self.node.id}-ingress", labels=self.label, - annotations=self.topology.ingress.annotations, + annotations={ + "kubernetes.io/tls-acme": "true", + "cert-manager.io/common-name": self.host, + "cert-manager.io/issue-temporary-certificate": "true", + "cert-manager.io/issuer": "letsencrypt-prod", + "acme.cert-manager.io/http01-edit-in-place": "true", + }, ), spec=k8s.IngressSpec( - ingress_class_name=self.topology.ingress.class_name, - tls=[ - k8s.IngressTls(hosts=tls.hosts, secret_name=tls.secret_name) - for tls in self.topology.ingress.tls or [] - ], - rules=[ - k8s.IngressRule( - host=rule.host, - http=k8s.HttpIngressRuleValue( - paths=[ - k8s.HttpIngressPath( - path=path.path, - path_type=path.path_type, - backend=k8s.IngressBackend( - service=k8s.IngressServiceBackend( - name=path.backend_service_name, - port=k8s.ServiceBackendPort( - number=path.backend_service_port_number - ), - ) - ), - ) - for path in rule.paths or [] - ] - ), - ) - for rule in self.topology.ingress.rules or [] - ], + ingress_class_name="premium-rwo", + tls=self._get_ingress_tls(), + rules=self._get_ingress_rules() ), ) - def set_k8s_pvc(self): k8s.KubePersistentVolumeClaim( self, "pvc", metadata=k8s.ObjectMeta(name=f"{self.node.id}-data", labels=self.label), spec=k8s.PersistentVolumeClaimSpec( - storage_class_name=self.topology.pvc.storage_class_name, - access_modes=self.topology.pvc.access_modes, - volume_mode=self.topology.pvc.volume_mode, + storage_class_name=self.service_topology.pvc.storage_class_name, + access_modes=self.service_topology.pvc.access_modes, + volume_mode=self.service_topology.pvc.volume_mode, resources=k8s.ResourceRequirements( - requests={"storage": k8s.Quantity.from_string(self.topology.pvc.storage)} + requests={"storage": k8s.Quantity.from_string(self.service_topology.pvc.storage)} ), ), ) - def set_k8s_backend_config(self): - return google.BackendConfig( + + def _get_config_attr(self, attribute) -> str | int: + config_attr = self.node_config.get(attribute).get('value') + assert config_attr is not None, f'Config attribute "{attribute}" is missing.' + + return config_attr + + def _get_container_ports(self) -> typing.List[k8s.ContainerPort]: + return [ + k8s.ContainerPort( + container_port=self._get_config_attr(port) + ) for port in ["http_server_config.port", "monitoring_endpoint_config.port"] + ] + + def _get_container_resources(self): # TODO: implement method to calc resources based on config + pass + + def _get_service_ports(self) -> typing.List[k8s.ServicePort]: + return [ + k8s.ServicePort( + name=attr.split("_")[0], + port=self._get_config_attr(attr), + target_port=k8s.IntOrString.from_number(self._get_config_attr(attr)) + ) for attr in ["http_server_config.port", "monitoring_endpoint_config.port"] + ] + + def _get_http_probe( self, - "backendconfig", - metadata=ApiObjectMetadata(name=f"{self.node.id}-backendconfig", labels=self.label), - spec=google.BackendConfigSpec( - health_check=google.BackendConfigSpecHealthCheck( - check_interval_sec=5, - healthy_threshold=10, - unhealthy_threshold=5, - timeout_sec=5, - request_path="/", - type="http", - ), - iap=google.BackendConfigSpecIap( - enabled=True, - oauthclient_credentials=google.BackendConfigSpecIapOauthclientCredentials( - secret_name="" - ), - ), + period_seconds: int = const.PROBE_PERIOD_SECONDS, + failure_threshold: int = const.PROBE_FAILURE_THRESHOLD, + timeout_seconds: int = const.PROBE_TIMEOUT_SECONDS + ) -> k8s.Probe: + path = "/monitoring/alive" + # path = self.node_config['monitoring_path'].get("value") # TODO add monitoring path in node_config + port = self.node_config.get('monitoring_endpoint_config.port').get("value") + + return k8s.Probe( + http_get=k8s.HttpGetAction( + path=path, + port=k8s.IntOrString.from_number(port), ), + period_seconds=period_seconds, + failure_threshold=failure_threshold, + timeout_seconds=timeout_seconds, ) + + def _get_volume_mounts(self) -> typing.List[k8s.VolumeMount]: + return [ + k8s.VolumeMount( + name=f"{self.node.id}-config", + mount_path="/config/sequencer/presets/", + read_only=True + ), + k8s.VolumeMount( + name=f"{self.node.id}-data", + mount_path="/data", + read_only=False + ) + ] + + def _get_volumes(self) -> typing.List[k8s.Volume]: + return [ + k8s.Volume( + name=f"{self.node.id}-config", + config_map=k8s.ConfigMapVolumeSource( + name=f"{self.node.id}-config" + ) + ), + k8s.Volume( + name=f"{self.node.id}-data", + persistent_volume_claim=k8s.PersistentVolumeClaimVolumeSource( + claim_name=f"{self.node.id}-data", + read_only=False + ) + ) + ] + + def _get_ingress_rules(self) -> typing.List[k8s.IngressRule]: + return [ + k8s.IngressRule( + host=self.host, + http=k8s.HttpIngressRuleValue( + paths=[ + k8s.HttpIngressPath( + path="/monitoring", + path_type="Prefix", + backend=k8s.IngressBackend( + service=k8s.IngressServiceBackend( + name=f"{self.node.id}-service", + port=k8s.ServiceBackendPort( + number=self._get_config_attr("monitoring_endpoint_config.port") + ), + ) + ), + ) + ] + ), + ) + ] + + def _get_ingress_tls(self) -> typing.List[IngressTls]: + return [ + k8s.IngressTls( + hosts=[self.host], + secret_name=f"{self.node.id}-tls" + ) + ] + + diff --git a/deployments/sequencer/config/sequencer.py b/deployments/sequencer/config/sequencer.py index 2afb9286a12..f6c619e5098 100644 --- a/deployments/sequencer/config/sequencer.py +++ b/deployments/sequencer/config/sequencer.py @@ -10,7 +10,7 @@ class SequencerDevConfig(Config): - def __init__(self, mount_path: str, config_file_path: str = ""): + def __init__(self, config_file_path: str = ""): super().__init__( global_config=json.loads( open(os.path.join(CONFIG_DIR, "default_config.json"), "r").read() @@ -19,8 +19,7 @@ def __init__(self, mount_path: str, config_file_path: str = ""): json.loads(open(os.path.join(CONFIG_DIR, "presets", "config.json"), "r").read()) if not config_file_path else json.loads(open(os.path.abspath(config_file_path)).read()) - ), - mount_path=mount_path, + ) ) def validate(self): diff --git a/deployments/sequencer/imports/com/google/cloud/_jsii/comgooglecloud@0.0.0.jsii.tgz b/deployments/sequencer/imports/com/google/cloud/_jsii/comgooglecloud@0.0.0.jsii.tgz index 01017631ca2..549ce98511a 100644 Binary files a/deployments/sequencer/imports/com/google/cloud/_jsii/comgooglecloud@0.0.0.jsii.tgz and b/deployments/sequencer/imports/com/google/cloud/_jsii/comgooglecloud@0.0.0.jsii.tgz differ diff --git a/deployments/sequencer/imports/k8s/_jsii/k8s@0.0.0.jsii.tgz b/deployments/sequencer/imports/k8s/_jsii/k8s@0.0.0.jsii.tgz index 176fdafb319..6382fb2a825 100644 Binary files a/deployments/sequencer/imports/k8s/_jsii/k8s@0.0.0.jsii.tgz and b/deployments/sequencer/imports/k8s/_jsii/k8s@0.0.0.jsii.tgz differ diff --git a/deployments/sequencer/main.py b/deployments/sequencer/main.py index 932a6bbd361..9b71507c4cf 100644 --- a/deployments/sequencer/main.py +++ b/deployments/sequencer/main.py @@ -25,10 +25,10 @@ def __post_init__(self): class SequencerNode(Chart): def __init__( - self, scope: Construct, name: str, namespace: str, topology: topology.ServiceTopology + self, scope: Construct, name: str, namespace: str, service_topology: topology.ServiceTopology ): super().__init__(scope, name, disable_resource_name_hashes=True, namespace=namespace) - self.service = ServiceApp(self, name, namespace=namespace, topology=topology) + self.service = ServiceApp(self, name, namespace=namespace, service_topology=service_topology) def main(): @@ -45,7 +45,7 @@ def main(): scope=app, name="sequencer-node", namespace=args.namespace, - topology=system_preset, + service_topology=system_preset, ) app.synth() diff --git a/deployments/sequencer/references/sequencer-node/ConfigMap.sequencer-node-config.k8s.yaml b/deployments/sequencer/references/sequencer-node/ConfigMap.sequencer-node-config.k8s.yaml index 72ad9078315..d2defb92b31 100644 --- a/deployments/sequencer/references/sequencer-node/ConfigMap.sequencer-node-config.k8s.yaml +++ b/deployments/sequencer/references/sequencer-node/ConfigMap.sequencer-node-config.k8s.yaml @@ -4,4 +4,4 @@ metadata: name: sequencer-node-config namespace: test data: - config: "{\"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.add_mod\": {\"description\": \"Max number of add mod builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 156250}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.bitwise\": {\"description\": \"Max number of bitwise builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 39062}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ec_op\": {\"description\": \"Max number of EC operation builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 2441}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.ecdsa\": {\"description\": \"Max number of ECDSA builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 1220}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.keccak\": {\"description\": \"Max number of keccak builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 1220}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.mul_mod\": {\"description\": \"Max number of mul mod builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 156250}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.pedersen\": {\"description\": \"Max number of pedersen builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 78125}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.poseidon\": {\"description\": \"Max number of poseidon builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 78125}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check\": {\"description\": \"Max number of range check builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 156250}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.builtin_count.range_check96\": {\"description\": \"Max number of range check 96 builtin usage in a block.\", \"privacy\": \"Public\", \"value\": 156250}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.l1_gas\": {\"description\": \"An upper bound on the total gas used in a block.\", \"privacy\": \"Public\", \"value\": 2500000}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.message_segment_length\": {\"description\": \"An upper bound on the message segment length in a block.\", \"privacy\": \"Public\", \"value\": 3700}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_events\": {\"description\": \"An upper bound on the total number of events generated in a block.\", \"privacy\": \"Public\", \"value\": 5000}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.n_steps\": {\"description\": \"An upper bound on the total number of steps in a block.\", \"privacy\": \"Public\", \"value\": 2500000}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.state_diff_size\": {\"description\": \"An upper bound on the total state diff size in a block.\", \"privacy\": \"Public\", \"value\": 4000}, \"batcher_config.block_builder_config.bouncer_config.block_max_capacity.sierra_gas\": {\"description\": \"An upper bound on the total sierra_gas used in a block.\", \"privacy\": \"Public\", \"value\": 250000000}, \"batcher_config.block_builder_config.chain_info.chain_id\": {\"description\": \"The chain ID of the StarkNet chain.\", \"pointer_target\": \"chain_id\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.chain_info.fee_token_addresses.eth_fee_token_address\": {\"description\": \"Address of the ETH fee token.\", \"pointer_target\": \"eth_fee_token_address\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.chain_info.fee_token_addresses.strk_fee_token_address\": {\"description\": \"Address of the STRK fee token.\", \"pointer_target\": \"strk_fee_token_address\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.execute_config.concurrency_config.chunk_size\": {\"description\": \"The size of the transaction chunk executed in parallel.\", \"privacy\": \"Public\", \"value\": 0}, \"batcher_config.block_builder_config.execute_config.concurrency_config.enabled\": {\"description\": \"Enables concurrency of transaction execution.\", \"privacy\": \"Public\", \"value\": false}, \"batcher_config.block_builder_config.execute_config.concurrency_config.n_workers\": {\"description\": \"Number of parallel transaction execution workers.\", \"privacy\": \"Public\", \"value\": 0}, \"batcher_config.block_builder_config.sequencer_address\": {\"description\": \"The address of the sequencer.\", \"pointer_target\": \"sequencer_address\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.tx_chunk_size\": {\"description\": \"The size of the transaction chunk.\", \"privacy\": \"Public\", \"value\": 100}, \"batcher_config.block_builder_config.use_kzg_da\": {\"description\": \"Indicates whether the kzg mechanism is used for data availability.\", \"privacy\": \"Public\", \"value\": true}, \"batcher_config.block_builder_config.versioned_constants_overrides.invoke_tx_max_n_steps\": {\"description\": \"Maximum number of steps the invoke function is allowed to run.\", \"pointer_target\": \"versioned_constants_overrides.invoke_tx_max_n_steps\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.versioned_constants_overrides.max_recursion_depth\": {\"description\": \"Maximum recursion depth for nested calls during blockifier validation.\", \"pointer_target\": \"versioned_constants_overrides.max_recursion_depth\", \"privacy\": \"Public\"}, \"batcher_config.block_builder_config.versioned_constants_overrides.validate_max_n_steps\": {\"description\": \"Maximum number of steps the validation function is allowed to run.\", \"pointer_target\": \"versioned_constants_overrides.validate_max_n_steps\", \"privacy\": \"Public\"}, \"batcher_config.global_contract_cache_size\": {\"description\": \"Cache size for the global_class_hash_to_class. Initialized with this size on creation.\", \"privacy\": \"Public\", \"value\": 400}, \"batcher_config.input_stream_content_buffer_size\": {\"description\": \"Sets the buffer size for the input transaction channel. Adding more transactions beyond this limit will block until space is available.\", \"privacy\": \"Public\", \"value\": 400}, \"batcher_config.max_l1_handler_txs_per_block_proposal\": {\"description\": \"The maximum number of L1 handler transactions to include in a block proposal.\", \"privacy\": \"Public\", \"value\": 3}, \"batcher_config.outstream_content_buffer_size\": {\"description\": \"The maximum number of items to include in a single get_proposal_content response.\", \"privacy\": \"Public\", \"value\": 100}, \"batcher_config.storage.db_config.chain_id\": {\"description\": \"The chain to follow. For more details see https://docs.starknet.io/documentation/architecture_and_concepts/Blocks/transactions/#chain-id.\", \"pointer_target\": \"chain_id\", \"privacy\": \"Public\"}, \"batcher_config.storage.db_config.enforce_file_exists\": false, \"batcher_config.storage.db_config.growth_step\": {\"description\": \"The growth step in bytes, must be greater than zero to allow the database to grow.\", \"privacy\": \"Public\", \"value\": 4294967296}, \"batcher_config.storage.db_config.max_size\": {\"description\": \"The maximum size of the node's storage in bytes.\", \"privacy\": \"Public\", \"value\": 1099511627776}, \"batcher_config.storage.db_config.min_size\": {\"description\": \"The minimum size of the node's storage in bytes.\", \"privacy\": \"Public\", \"value\": 1048576}, \"batcher_config.storage.db_config.path_prefix\": \"/data\", \"batcher_config.storage.mmap_file_config.growth_step\": {\"description\": \"The growth step in bytes, must be greater than max_object_size.\", \"privacy\": \"Public\", \"value\": 1073741824}, \"batcher_config.storage.mmap_file_config.max_object_size\": {\"description\": \"The maximum size of a single object in the file in bytes\", \"privacy\": \"Public\", \"value\": 268435456}, \"batcher_config.storage.mmap_file_config.max_size\": {\"description\": \"The maximum size of a memory mapped file in bytes. Must be greater than growth_step.\", \"privacy\": \"Public\", \"value\": 1099511627776}, \"batcher_config.storage.scope\": {\"description\": \"The categories of data saved in storage.\", \"privacy\": \"Public\", \"value\": \"StateOnly\"}, \"chain_id\": \"0x5\", \"compiler_config.max_bytecode_size\": {\"description\": \"Limitation of contract bytecode size.\", \"privacy\": \"Public\", \"value\": 81920}, \"components.batcher.execution_mode\": \"Disabled\", \"components.batcher.local_server_config.#is_none\": true, \"components.batcher.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.batcher.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.batcher.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.batcher.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.batcher.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.batcher.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.batcher.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.batcher.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.consensus_manager.execution_mode\": \"Disabled\", \"components.consensus_manager.local_server_config.#is_none\": true, \"components.consensus_manager.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.consensus_manager.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.consensus_manager.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.consensus_manager.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.consensus_manager.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.consensus_manager.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.consensus_manager.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.consensus_manager.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.gateway.execution_mode\": \"Disabled\", \"components.gateway.local_server_config.#is_none\": true, \"components.gateway.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.gateway.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.gateway.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.gateway.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.gateway.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.gateway.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.gateway.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.gateway.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.http_server.execution_mode\": \"Disabled\", \"components.http_server.local_server_config.#is_none\": true, \"components.http_server.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.http_server.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.http_server.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.http_server.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.http_server.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.http_server.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.http_server.remote_server_config.#is_none\": true, \"components.http_server.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.mempool.execution_mode\": \"Disabled\", \"components.mempool.local_server_config.#is_none\": true, \"components.mempool.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.mempool.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.mempool.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.mempool.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.mempool.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.mempool.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.mempool.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.mempool.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.mempool_p2p.execution_mode\": \"Disabled\", \"components.mempool_p2p.local_server_config.#is_none\": true, \"components.mempool_p2p.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.mempool_p2p.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.mempool_p2p.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.mempool_p2p.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.mempool_p2p.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.mempool_p2p.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.mempool_p2p.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.mempool_p2p.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.monitoring_endpoint.execution_mode\": {\"description\": \"The component execution mode.\", \"privacy\": \"Public\", \"value\": \"LocalExecutionWithRemoteEnabled\"}, \"components.monitoring_endpoint.local_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": false}, \"components.monitoring_endpoint.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.monitoring_endpoint.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.monitoring_endpoint.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.monitoring_endpoint.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.monitoring_endpoint.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.monitoring_endpoint.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.monitoring_endpoint.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": false}, \"components.monitoring_endpoint.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.state_sync.execution_mode\": {\"description\": \"The component execution mode.\", \"privacy\": \"Public\", \"value\": \"LocalExecutionWithRemoteDisabled\"}, \"components.state_sync.local_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": false}, \"components.state_sync.local_server_config.channel_buffer_size\": {\"description\": \"The communication channel buffer size.\", \"privacy\": \"Public\", \"value\": 32}, \"components.state_sync.remote_client_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.state_sync.remote_client_config.idle_connections\": {\"description\": \"The maximum number of idle connections to keep alive.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"components.state_sync.remote_client_config.idle_timeout\": {\"description\": \"The duration in seconds to keep an idle connection open before closing.\", \"privacy\": \"Public\", \"value\": 90}, \"components.state_sync.remote_client_config.retries\": {\"description\": \"The max number of retries for sending a message.\", \"privacy\": \"Public\", \"value\": 3}, \"components.state_sync.remote_client_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"components.state_sync.remote_server_config.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"components.state_sync.remote_server_config.socket\": {\"description\": \"The remote component server socket.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0:8080\"}, \"consensus_manager_config.consensus_config.consensus_delay\": {\"description\": \"Delay (seconds) before starting consensus to give time for network peering.\", \"privacy\": \"Public\", \"value\": 5}, \"consensus_manager_config.consensus_config.network_config.advertised_multiaddr\": {\"description\": \"The external address other peers see this node. If this is set, the node will not try to find out which addresses it has and will write this address as external instead\", \"privacy\": \"Public\", \"value\": \"\"}, \"consensus_manager_config.consensus_config.network_config.advertised_multiaddr.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"consensus_manager_config.consensus_config.network_config.bootstrap_peer_multiaddr\": {\"description\": \"The multiaddress of the peer node. It should include the peer's id. For more info: https://docs.libp2p.io/concepts/fundamentals/peers/\", \"privacy\": \"Public\", \"value\": \"\"}, \"consensus_manager_config.consensus_config.network_config.bootstrap_peer_multiaddr.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"consensus_manager_config.consensus_config.network_config.chain_id\": {\"description\": \"The chain to follow. For more details see https://docs.starknet.io/documentation/architecture_and_concepts/Blocks/transactions/#chain-id.\", \"pointer_target\": \"chain_id\", \"privacy\": \"Public\"}, \"consensus_manager_config.consensus_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis\": {\"description\": \"The base delay in milliseconds for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 2}, \"consensus_manager_config.consensus_config.network_config.discovery_config.bootstrap_dial_retry_config.factor\": {\"description\": \"The factor for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 5}, \"consensus_manager_config.consensus_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds\": {\"description\": \"The maximum delay in seconds for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 5}, \"consensus_manager_config.consensus_config.network_config.discovery_config.heartbeat_interval\": {\"description\": \"The interval between each discovery (Kademlia) query in milliseconds.\", \"privacy\": \"Public\", \"value\": 100}, \"consensus_manager_config.consensus_config.network_config.idle_connection_timeout\": {\"description\": \"Amount of time in seconds that a connection with no active sessions will stay alive.\", \"privacy\": \"Public\", \"value\": 120}, \"consensus_manager_config.consensus_config.network_config.peer_manager_config.malicious_timeout_seconds\": {\"description\": \"The duration in seconds a peer is blacklisted after being marked as malicious.\", \"privacy\": \"Public\", \"value\": 31536000}, \"consensus_manager_config.consensus_config.network_config.peer_manager_config.unstable_timeout_millis\": {\"description\": \"The duration in milliseconds a peer blacklisted after being reported as unstable.\", \"privacy\": \"Public\", \"value\": 1000}, \"consensus_manager_config.consensus_config.network_config.quic_port\": {\"description\": \"The port that the node listens on for incoming quic connections.\", \"privacy\": \"Public\", \"value\": 10101}, \"consensus_manager_config.consensus_config.network_config.secret_key\": {\"description\": \"The secret key used for building the peer id. If it's an empty string a random one will be used.\", \"privacy\": \"Private\", \"value\": \"\"}, \"consensus_manager_config.consensus_config.network_config.session_timeout\": {\"description\": \"Maximal time in seconds that each session can take before failing on timeout.\", \"privacy\": \"Public\", \"value\": 120}, \"consensus_manager_config.consensus_config.network_config.tcp_port\": {\"description\": \"The port that the node listens on for incoming tcp connections.\", \"privacy\": \"Public\", \"value\": 10100}, \"consensus_manager_config.consensus_config.network_topic\": {\"description\": \"The network topic of the consensus.\", \"privacy\": \"Public\", \"value\": \"consensus\"}, \"consensus_manager_config.consensus_config.num_validators\": {\"description\": \"The number of validators in the consensus.\", \"privacy\": \"Public\", \"value\": 1}, \"consensus_manager_config.consensus_config.start_height\": {\"description\": \"The height to start the consensus from.\", \"privacy\": \"Public\", \"value\": 0}, \"consensus_manager_config.consensus_config.timeouts.precommit_timeout\": {\"description\": \"The timeout (seconds) for a precommit.\", \"privacy\": \"Public\", \"value\": 1.0}, \"consensus_manager_config.consensus_config.timeouts.prevote_timeout\": {\"description\": \"The timeout (seconds) for a prevote.\", \"privacy\": \"Public\", \"value\": 1.0}, \"consensus_manager_config.consensus_config.timeouts.proposal_timeout\": {\"description\": \"The timeout (seconds) for a proposal.\", \"privacy\": \"Public\", \"value\": 3.0}, \"consensus_manager_config.consensus_config.validator_id\": {\"description\": \"The validator id of the node.\", \"privacy\": \"Public\", \"value\": \"0x0\"}, \"eth_fee_token_address\": \"0x6\", \"gateway_config.chain_info.chain_id\": {\"description\": \"The chain ID of the StarkNet chain.\", \"pointer_target\": \"chain_id\", \"privacy\": \"Public\"}, \"gateway_config.chain_info.fee_token_addresses.eth_fee_token_address\": {\"description\": \"Address of the ETH fee token.\", \"pointer_target\": \"eth_fee_token_address\", \"privacy\": \"Public\"}, \"gateway_config.chain_info.fee_token_addresses.strk_fee_token_address\": {\"description\": \"Address of the STRK fee token.\", \"pointer_target\": \"strk_fee_token_address\", \"privacy\": \"Public\"}, \"gateway_config.stateful_tx_validator_config.max_nonce_for_validation_skip\": {\"description\": \"Maximum nonce for which the validation is skipped.\", \"privacy\": \"Public\", \"value\": \"0x1\"}, \"gateway_config.stateful_tx_validator_config.versioned_constants_overrides.invoke_tx_max_n_steps\": {\"description\": \"Maximum number of steps the invoke function is allowed to run.\", \"pointer_target\": \"versioned_constants_overrides.invoke_tx_max_n_steps\", \"privacy\": \"Public\"}, \"gateway_config.stateful_tx_validator_config.versioned_constants_overrides.max_recursion_depth\": {\"description\": \"Maximum recursion depth for nested calls during blockifier validation.\", \"pointer_target\": \"versioned_constants_overrides.max_recursion_depth\", \"privacy\": \"Public\"}, \"gateway_config.stateful_tx_validator_config.versioned_constants_overrides.validate_max_n_steps\": {\"description\": \"Maximum number of steps the validation function is allowed to run.\", \"pointer_target\": \"versioned_constants_overrides.validate_max_n_steps\", \"privacy\": \"Public\"}, \"gateway_config.stateless_tx_validator_config.max_calldata_length\": {\"description\": \"Limitation of calldata length.\", \"privacy\": \"Public\", \"value\": 4000}, \"gateway_config.stateless_tx_validator_config.max_contract_class_object_size\": {\"description\": \"Limitation of contract class object size.\", \"privacy\": \"Public\", \"value\": 4089446}, \"gateway_config.stateless_tx_validator_config.max_sierra_version.major\": {\"description\": \"The major version of the configuration.\", \"privacy\": \"Public\", \"value\": 1}, \"gateway_config.stateless_tx_validator_config.max_sierra_version.minor\": {\"description\": \"The minor version of the configuration.\", \"privacy\": \"Public\", \"value\": 5}, \"gateway_config.stateless_tx_validator_config.max_sierra_version.patch\": {\"description\": \"The patch version of the configuration.\", \"privacy\": \"Public\", \"value\": 18446744073709551615}, \"gateway_config.stateless_tx_validator_config.max_signature_length\": {\"description\": \"Limitation of signature length.\", \"privacy\": \"Public\", \"value\": 4000}, \"gateway_config.stateless_tx_validator_config.min_sierra_version.major\": {\"description\": \"The major version of the configuration.\", \"privacy\": \"Public\", \"value\": 1}, \"gateway_config.stateless_tx_validator_config.min_sierra_version.minor\": {\"description\": \"The minor version of the configuration.\", \"privacy\": \"Public\", \"value\": 1}, \"gateway_config.stateless_tx_validator_config.min_sierra_version.patch\": {\"description\": \"The patch version of the configuration.\", \"privacy\": \"Public\", \"value\": 0}, \"gateway_config.stateless_tx_validator_config.validate_non_zero_l1_data_gas_fee\": {\"description\": \"If true, validates that a transaction has non-zero L1 Data (Blob) resource bounds.\", \"privacy\": \"Public\", \"value\": false}, \"gateway_config.stateless_tx_validator_config.validate_non_zero_l1_gas_fee\": {\"description\": \"If true, validates that a transaction has non-zero L1 resource bounds.\", \"privacy\": \"Public\", \"value\": true}, \"gateway_config.stateless_tx_validator_config.validate_non_zero_l2_gas_fee\": {\"description\": \"If true, validates that a transaction has non-zero L2 resource bounds.\", \"privacy\": \"Public\", \"value\": false}, \"http_server_config.ip\": {\"description\": \"The http server ip.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0\"}, \"http_server_config.port\": {\"description\": \"The http server port.\", \"privacy\": \"Public\", \"value\": 8080}, \"mempool_p2p_config.network_buffer_size\": {\"description\": \"Network buffer size.\", \"privacy\": \"Public\", \"value\": 10000}, \"mempool_p2p_config.network_config.advertised_multiaddr\": {\"description\": \"The external address other peers see this node. If this is set, the node will not try to find out which addresses it has and will write this address as external instead\", \"privacy\": \"Public\", \"value\": \"\"}, \"mempool_p2p_config.network_config.advertised_multiaddr.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"mempool_p2p_config.network_config.bootstrap_peer_multiaddr\": {\"description\": \"The multiaddress of the peer node. It should include the peer's id. For more info: https://docs.libp2p.io/concepts/fundamentals/peers/\", \"privacy\": \"Public\", \"value\": \"\"}, \"mempool_p2p_config.network_config.bootstrap_peer_multiaddr.#is_none\": {\"description\": \"Flag for an optional field.\", \"privacy\": \"TemporaryValue\", \"value\": true}, \"mempool_p2p_config.network_config.chain_id\": {\"description\": \"The chain to follow. For more details see https://docs.starknet.io/documentation/architecture_and_concepts/Blocks/transactions/#chain-id.\", \"pointer_target\": \"chain_id\", \"privacy\": \"Public\"}, \"mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.base_delay_millis\": {\"description\": \"The base delay in milliseconds for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 2}, \"mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.factor\": {\"description\": \"The factor for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 5}, \"mempool_p2p_config.network_config.discovery_config.bootstrap_dial_retry_config.max_delay_seconds\": {\"description\": \"The maximum delay in seconds for the exponential backoff strategy.\", \"privacy\": \"Public\", \"value\": 5}, \"mempool_p2p_config.network_config.discovery_config.heartbeat_interval\": {\"description\": \"The interval between each discovery (Kademlia) query in milliseconds.\", \"privacy\": \"Public\", \"value\": 100}, \"mempool_p2p_config.network_config.idle_connection_timeout\": {\"description\": \"Amount of time in seconds that a connection with no active sessions will stay alive.\", \"privacy\": \"Public\", \"value\": 120}, \"mempool_p2p_config.network_config.peer_manager_config.malicious_timeout_seconds\": {\"description\": \"The duration in seconds a peer is blacklisted after being marked as malicious.\", \"privacy\": \"Public\", \"value\": 31536000}, \"mempool_p2p_config.network_config.peer_manager_config.unstable_timeout_millis\": {\"description\": \"The duration in milliseconds a peer blacklisted after being reported as unstable.\", \"privacy\": \"Public\", \"value\": 1000}, \"mempool_p2p_config.network_config.quic_port\": {\"description\": \"The port that the node listens on for incoming quic connections.\", \"privacy\": \"Public\", \"value\": 10001}, \"mempool_p2p_config.network_config.secret_key\": {\"description\": \"The secret key used for building the peer id. If it's an empty string a random one will be used.\", \"privacy\": \"Private\", \"value\": \"\"}, \"mempool_p2p_config.network_config.session_timeout\": {\"description\": \"Maximal time in seconds that each session can take before failing on timeout.\", \"privacy\": \"Public\", \"value\": 120}, \"mempool_p2p_config.network_config.tcp_port\": {\"description\": \"The port that the node listens on for incoming tcp connections.\", \"privacy\": \"Public\", \"value\": 10000}, \"monitoring_endpoint_config.ip\": {\"description\": \"The monitoring endpoint ip address.\", \"privacy\": \"Public\", \"value\": \"0.0.0.0\"}, \"monitoring_endpoint_config.port\": {\"description\": \"The monitoring endpoint port.\", \"privacy\": \"Public\", \"value\": 8082}, \"rpc_state_reader_config.json_rpc_version\": {\"description\": \"The json rpc version.\", \"privacy\": \"Public\", \"value\": \"\"}, \"rpc_state_reader_config.url\": {\"description\": \"The url of the rpc server.\", \"privacy\": \"Public\", \"value\": \"\"}, \"sequencer_address\": {\"description\": \"A required param! The sequencer address.\", \"param_type\": \"String\", \"privacy\": \"TemporaryValue\"}, \"strk_fee_token_address\": \"0x7\", \"versioned_constants_overrides.invoke_tx_max_n_steps\": {\"description\": \"Maximum number of steps the invoke function is allowed to run.\", \"privacy\": \"TemporaryValue\", \"value\": 10000000}, \"versioned_constants_overrides.max_recursion_depth\": {\"description\": \"Maximum recursion depth for nested calls during blockifier validation.\", \"privacy\": \"TemporaryValue\", \"value\": 50}, \"versioned_constants_overrides.validate_max_n_steps\": {\"description\": \"Maximum number of steps the validation function is allowed to run.\", \"privacy\": \"TemporaryValue\", \"value\": 1000000}}" + config: '{"chain_id": "0x5", "eth_fee_token_address": "0x6", "strk_fee_token_address": "0x7", "components.batcher.execution_mode": "Disabled", "components.batcher.local_server_config.#is_none": true, "components.consensus_manager.execution_mode": "Disabled", "components.gateway.execution_mode": "Disabled", "components.http_server.execution_mode": "Disabled", "components.mempool.execution_mode": "Disabled", "components.mempool_p2p.execution_mode": "Disabled", "components.consensus_manager.local_server_config.#is_none": true, "components.gateway.local_server_config.#is_none": true, "components.http_server.local_server_config.#is_none": true, "components.mempool.local_server_config.#is_none": true, "components.mempool_p2p.local_server_config.#is_none": true, "components.http_server.remote_server_config.#is_none": true, "batcher_config.storage.db_config.enforce_file_exists": false, "batcher_config.storage.db_config.path_prefix": "/data"}' diff --git a/deployments/sequencer/references/sequencer-node/Deployment.sequencer-node-deployment.k8s.yaml b/deployments/sequencer/references/sequencer-node/Deployment.sequencer-node-deployment.k8s.yaml index cb464782b2e..9b376539c95 100644 --- a/deployments/sequencer/references/sequencer-node/Deployment.sequencer-node-deployment.k8s.yaml +++ b/deployments/sequencer/references/sequencer-node/Deployment.sequencer-node-deployment.k8s.yaml @@ -17,38 +17,39 @@ spec: - args: - --config_file - /config/sequencer/presets/config - image: us.gcr.io/starkware-dev/sequencer-node-test:0.0.1-dev.3 + image: us.gcr.io/starkware-dev/sequencer-node-test:0.0.1-dev.11 + imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 5 httpGet: path: /monitoring/alive - port: 8080 + port: 8082 periodSeconds: 10 timeoutSeconds: 5 - name: sequencer-node-server + name: sequencer-node ports: - containerPort: 8080 - containerPort: 8082 readinessProbe: failureThreshold: 5 httpGet: - path: /monitoring/ready - port: 8080 + path: /monitoring/alive + port: 8082 periodSeconds: 10 timeoutSeconds: 5 startupProbe: - failureThreshold: 10 + failureThreshold: 5 httpGet: - path: /monitoring/nodeVersion - port: 8080 + path: /monitoring/alive + port: 8082 periodSeconds: 10 timeoutSeconds: 5 volumeMounts: - mountPath: /config/sequencer/presets/ - name: config + name: sequencer-node-config readOnly: true - mountPath: /data - name: data + name: sequencer-node-data readOnly: false securityContext: fsGroup: 1000 diff --git a/deployments/sequencer/references/sequencer-node/Ingress.sequencer-node-ingress.k8s.yaml b/deployments/sequencer/references/sequencer-node/Ingress.sequencer-node-ingress.k8s.yaml index 7539704f4be..c4cd30305a7 100644 --- a/deployments/sequencer/references/sequencer-node/Ingress.sequencer-node-ingress.k8s.yaml +++ b/deployments/sequencer/references/sequencer-node/Ingress.sequencer-node-ingress.k8s.yaml @@ -3,7 +3,7 @@ kind: Ingress metadata: annotations: acme.cert-manager.io/http01-edit-in-place: "true" - cert-manager.io/common-name: test.gcp-integration.sw-dev.io + cert-manager.io/common-name: sequencer-node.test.sw-dev.io cert-manager.io/issue-temporary-certificate: "true" cert-manager.io/issuer: letsencrypt-prod kubernetes.io/tls-acme: "true" @@ -12,8 +12,9 @@ metadata: name: sequencer-node-ingress namespace: test spec: + ingressClassName: premium-rwo rules: - - host: test.gcp-integration.sw-dev.io + - host: sequencer-node.test.sw-dev.io http: paths: - backend: @@ -21,9 +22,9 @@ spec: name: sequencer-node-service port: number: 8082 - path: /monitoring/ + path: /monitoring pathType: Prefix tls: - hosts: - - test.gcp-integration.sw-dev.io - secretName: sequencer-tls + - sequencer-node.test.sw-dev.io + secretName: sequencer-node-tls diff --git a/deployments/sequencer/references/sequencer-node/Service.sequencer-node-service.k8s.yaml b/deployments/sequencer/references/sequencer-node/Service.sequencer-node-service.k8s.yaml index 600478fde75..7590fcaba65 100644 --- a/deployments/sequencer/references/sequencer-node/Service.sequencer-node-service.k8s.yaml +++ b/deployments/sequencer/references/sequencer-node/Service.sequencer-node-service.k8s.yaml @@ -6,11 +6,8 @@ metadata: spec: ports: - name: http - port: 80 + port: 8080 targetPort: 8080 - - name: rpc - port: 8081 - targetPort: 8081 - name: monitoring port: 8082 targetPort: 8082 diff --git a/deployments/sequencer/services/const.py b/deployments/sequencer/services/const.py index 6b58abbdd87..a6a956b7b81 100644 --- a/deployments/sequencer/services/const.py +++ b/deployments/sequencer/services/const.py @@ -1,7 +1,7 @@ from enum import Enum # k8s service types -class ServiceType(Enum): +class ServiceType(str, Enum): CLUSTER_IP = "ClusterIP" LOAD_BALANCER = "LoadBalancer" NODE_PORT = "NodePort" @@ -14,5 +14,11 @@ class ServiceType(Enum): # k8s service ports HTTP_SERVICE_PORT = 80 -RPC_SERVICE_PORT = 8081 +GRPC_SERVICE_PORT = 8081 MONITORING_SERVICE_PORT = 8082 + +PROBE_FAILURE_THRESHOLD = 5 +PROBE_PERIOD_SECONDS = 10 +PROBE_TIMEOUT_SECONDS = 5 + +CONTAINER_ARGS = ["--config_file", "/config/sequencer/presets/config"] diff --git a/deployments/sequencer/services/objects.py b/deployments/sequencer/services/objects.py index ece7c20253d..decf2511fd8 100644 --- a/deployments/sequencer/services/objects.py +++ b/deployments/sequencer/services/objects.py @@ -43,16 +43,18 @@ class PersistentVolumeClaim: class Config: global_config: Dict[Any, Any] config: Dict[Any, Any] - mount_path: str def _merged_config(self) -> Dict[Any, Any]: _config = self.global_config.copy() _config.update(self.config) return _config - def get_config(self): + def get_merged_config(self) -> Dict[Any, Any]: return self._merged_config() + def get_config(self) -> Dict[Any, Any]: + return self.config + def validate(self): pass diff --git a/deployments/sequencer/services/topology.py b/deployments/sequencer/services/topology.py index 68c30561931..32088d68b3e 100644 --- a/deployments/sequencer/services/topology.py +++ b/deployments/sequencer/services/topology.py @@ -7,6 +7,9 @@ @dataclasses.dataclass class ServiceTopology: + images: typing.Optional[typing.Mapping] = dataclasses.field( + default_factory=topology_helpers.get_images + ) deployment: typing.Optional[objects.Deployment] = dataclasses.field( default_factory=topology_helpers.get_deployment ) @@ -23,7 +26,6 @@ class ServiceTopology: default_factory=topology_helpers.get_ingress ) - class SequencerDev(ServiceTopology): pass diff --git a/deployments/sequencer/services/topology_helpers.py b/deployments/sequencer/services/topology_helpers.py index 5bd5b74eadc..29e429f5fba 100644 --- a/deployments/sequencer/services/topology_helpers.py +++ b/deployments/sequencer/services/topology_helpers.py @@ -1,7 +1,18 @@ -from services import objects, const, helpers +import typing + +from services import objects, const from config.sequencer import SequencerDevConfig +cluster_name = "gcp-integration" +replicas = 1 + +def get_images() -> typing.Dict[str, str]: + return { + "sequencer": "us.gcr.io/starkware-dev/sequencer-node-test:0.0.1-dev.11" + } + + def get_pvc() -> objects.PersistentVolumeClaim: return objects.PersistentVolumeClaim( access_modes=["ReadWriteOnce"], @@ -15,7 +26,7 @@ def get_pvc() -> objects.PersistentVolumeClaim: def get_dev_config(config_file_path: str) -> objects.Config: return SequencerDevConfig( - mount_path="/config/sequencer/presets/", config_file_path=config_file_path + config_file_path=config_file_path ) @@ -34,7 +45,7 @@ def get_ingress(url: str = "test.gcp-integration.sw-dev.io") -> objects.Ingress: host=url, paths=[ objects.IngressRuleHttpPath( - path="/monitoring/", + path="/monitoring", path_type="Prefix", backend_service_name="sequencer-node-service", backend_service_port_number=const.MONITORING_SERVICE_PORT, @@ -58,7 +69,7 @@ def get_service() -> objects.Service: ), objects.PortMapping( name="rpc", - port=const.RPC_SERVICE_PORT, + port=const.GRPC_SERVICE_PORT, container_port=const.RPC_CONTAINER_PORT, ), objects.PortMapping( @@ -77,8 +88,8 @@ def get_deployment() -> objects.Deployment: containers=[ objects.Container( name="server", - image="us.gcr.io/starkware-dev/sequencer-node-test:0.0.1-dev.3", - args=["--config_file", "/config/sequencer/presets/config"], + image="us.gcr.io/starkware-dev/sequencer-node-test:0.0.1-dev.8", + args=["--config_file", "/app/config/sequencer/presets/config"], ports=[ objects.ContainerPort(container_port=const.HTTP_CONTAINER_PORT), objects.ContainerPort(container_port=const.RPC_CONTAINER_PORT), @@ -108,7 +119,7 @@ def get_deployment() -> objects.Deployment: volume_mounts=[ objects.VolumeMount( name="config", - mount_path="/config/sequencer/presets/", + mount_path="/app/config/sequencer/presets/", read_only=True, ), objects.VolumeMount(name="data", mount_path="/data", read_only=False), diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 31cfd7b24a0..54b889c61b0 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "stable" -components = ["clippy", "rustc-dev", "rustfmt"] +channel = "1.83" +components = ["rustc-dev"] profile = "default" targets = ["x86_64-unknown-linux-gnu"] diff --git a/scripts/merge_paths.json b/scripts/merge_paths.json index d2f2c3cb3ed..ca5dc1b4348 100644 --- a/scripts/merge_paths.json +++ b/scripts/merge_paths.json @@ -1,3 +1,4 @@ { - "main-v0.13.2": "main" + "main-v0.13.2": "main-v0.13.4", + "main-v0.13.4": "main" } diff --git a/scripts/run_tests.py b/scripts/run_tests.py index 76cfba374ca..c6b2bd89f0a 100755 --- a/scripts/run_tests.py +++ b/scripts/run_tests.py @@ -18,8 +18,6 @@ # Enum of base commands. class BaseCommand(Enum): TEST = "test" - CODECOV = "codecov" - RUSTFMT = "rustfmt" CLIPPY = "clippy" DOC = "doc" @@ -30,24 +28,12 @@ def cmd(self, crates: Set[str]) -> List[str]: if self == BaseCommand.TEST: return ["cargo", "test"] + package_args - elif self == BaseCommand.CODECOV: - return [ - "cargo", - "llvm-cov", - "--codecov", - "-r", - "--output-path", - "codecov.json", - ] + package_args - elif self == BaseCommand.RUSTFMT: - fmt_args = package_args if len(package_args) > 0 else ["--all"] - return ["scripts/rust_fmt.sh"] + fmt_args + ["--", "--check"] elif self == BaseCommand.CLIPPY: clippy_args = package_args if len(package_args) > 0 else ["--workspace"] - return ["cargo", "clippy"] + clippy_args + return ["cargo", "clippy"] + clippy_args + ["--all-targets"] elif self == BaseCommand.DOC: doc_args = package_args if len(package_args) > 0 else ["--workspace"] - return ["cargo", "doc", "-r", "--document-private-items", "--no-deps"] + doc_args + return ["cargo", "doc", "--document-private-items", "--no-deps"] + doc_args raise NotImplementedError(f"Command {self} not implemented.") diff --git a/scripts/rust_fmt.sh b/scripts/rust_fmt.sh old mode 100755 new mode 100644 index 4478e594e95..b63f824b872 --- a/scripts/rust_fmt.sh +++ b/scripts/rust_fmt.sh @@ -1,13 +1,20 @@ #!/bin/bash -# Install toolchain if missing (local run). -TOOLCHAIN="nightly-2024-04-29" +set -euo pipefail + +if [[ -n "${CI:-}" ]]; then + echo "This script should not be run in a CI environment, as it installs toolchains out of cache." + exit 1 +fi + +SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" +TOOLCHAIN=$(grep "EXTRA_RUST_TOOLCHAINS:" "${SCRIPT_DIR}"/../.github/workflows/main.yml | awk '{print $2}') function install_rustfmt() { - rustup toolchain install ${TOOLCHAIN} - rustup component add --toolchain ${TOOLCHAIN} rustfmt + rustup toolchain install "${TOOLCHAIN}" + rustup component add --toolchain "${TOOLCHAIN}" rustfmt } -rustup toolchain list | grep -q ${TOOLCHAIN} || install_rustfmt +rustup toolchain list | grep -q "${TOOLCHAIN}" || install_rustfmt -cargo +${TOOLCHAIN} fmt $@ +cargo +"${TOOLCHAIN}" fmt --all -- "$@" diff --git a/scripts/sequencer-ci.Dockerfile b/scripts/sequencer-ci.Dockerfile index 77a9902dff6..7ca2b3af1d4 100644 --- a/scripts/sequencer-ci.Dockerfile +++ b/scripts/sequencer-ci.Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.04 ARG USERNAME=sequencer ARG USER_UID=1000 @@ -6,9 +6,11 @@ ARG USER_GID=$USER_UID RUN apt update && apt install -y sudo -RUN groupadd --gid $USER_GID $USERNAME && \ - useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME -RUN echo "%${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/developer +RUN groupadd --gid $USER_GID $USERNAME || true +RUN useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME || \ + usermod --login ${USERNAME} --move-home --home /home/${USERNAME} `grep ${USER_UID} /etc/passwd | awk -F: '{print $1}'` + +RUN echo "#${USER_UID} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/developer USER ${USERNAME} diff --git a/workspace_tests/package_integrity_test.rs b/workspace_tests/package_integrity_test.rs index 3c76f6fe4f6..7707e93c64f 100644 --- a/workspace_tests/package_integrity_test.rs +++ b/workspace_tests/package_integrity_test.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use crate::toml_utils::{PackageEntryValue, ROOT_TOML}; +use crate::toml_utils::{CrateCargoToml, DependencyValue, PackageEntryValue, ROOT_TOML}; #[test] fn test_package_names_match_directory() { @@ -24,3 +24,58 @@ fn test_package_names_match_directory() { missing a name field: {mismatched_packages:?}." ); } + +/// For smooth publishing: all *local* (workspace member) dependencies in [dev-dependencies] should +/// be via path, and not `workspace = true`. +/// Reason: +/// - `cargo publish` ignores path dependencies in dev-dependencies. +/// - `cargo publish` DOES NOT ignore `workspace = true` dependencies in dev-dependencies, even if +/// the workspace toml defines the dependency via path. +/// - We do not need dev-dependencies published when publishing a crate. +/// - We sometimes use self-references in dev-dependencies to activate features of self in tests. +/// For example, starknet_api needs it's "testing" feature activated in test mode, so it has a +/// dependency on self (starknet_api) in dev-dependencies. If we fail to ignore this self +/// dependency, we will not be able to publish starknet_api. +#[test] +fn test_member_dev_dependencies_are_by_path() { + let member_tomls = ROOT_TOML.member_cargo_tomls(); + let member_crate_names: Vec<&String> = + member_tomls.values().map(CrateCargoToml::package_name).collect(); + let package_to_bad_local_dev_deps: Vec<(String, Vec)> = ROOT_TOML + .member_cargo_tomls() + .into_iter() + .filter_map(|(path_str, toml)| { + if let Some(dev_dependencies) = toml.dev_dependencies { + // For each dep in dev-dependencies: if it's a workspace member, and not by path, + // add it to the list of bad local dev deps. + let mut bad_local_dev_deps: Vec = dev_dependencies + .iter() + .filter_map(|(name, value)| { + if member_crate_names.contains(&name) { + match value { + DependencyValue::Object { path: Some(_), .. } => None, + _ => Some(name.clone()), + } + } else { + None + } + }) + .collect(); + // If bad dev-deps exist for this package, return the package name and the bad deps. + if bad_local_dev_deps.is_empty() { + None + } else { + bad_local_dev_deps.sort(); + Some((path_str, bad_local_dev_deps)) + } + } else { + None + } + }) + .collect(); + assert!( + package_to_bad_local_dev_deps.is_empty(), + "The following crates have local packages in the [dev-dependencies] area that are not by \ + path: {package_to_bad_local_dev_deps:#?}." + ); +} diff --git a/workspace_tests/toml_utils.rs b/workspace_tests/toml_utils.rs index ba102d747c5..fc10a9b9ac7 100644 --- a/workspace_tests/toml_utils.rs +++ b/workspace_tests/toml_utils.rs @@ -48,10 +48,19 @@ pub(crate) struct CrateCargoToml { pub(crate) package: HashMap, dependencies: Option>, #[serde(rename = "dev-dependencies")] - dev_dependencies: Option>, + pub(crate) dev_dependencies: Option>, pub(crate) lints: Option>, } +impl CrateCargoToml { + pub(crate) fn package_name(&self) -> &String { + match self.package.get("name") { + Some(PackageEntryValue::String(name)) => name, + _ => panic!("No name found in crate toml {self:?}."), + } + } +} + #[derive(Debug)] pub(crate) struct LocalCrate { pub(crate) path: String, @@ -108,14 +117,12 @@ impl CargoToml { impl CrateCargoToml { pub(crate) fn path_dependencies(&self) -> impl Iterator + '_ { - self.dependencies.iter().chain(self.dev_dependencies.iter()).flatten().filter_map( - |(_name, value)| { - if let DependencyValue::Object { path: Some(path), .. } = value { - Some(path.to_string()) - } else { - None - } - }, - ) + self.dependencies.iter().flatten().filter_map(|(_name, value)| { + if let DependencyValue::Object { path: Some(path), .. } = value { + Some(path.to_string()) + } else { + None + } + }) } }