diff --git a/.github/workflows/docker-build-test.yaml b/.github/workflows/docker-build-test.yaml index 10efb527cc79f..532773dcd8aaa 100644 --- a/.github/workflows/docker-build-test.yaml +++ b/.github/workflows/docker-build-test.yaml @@ -277,6 +277,7 @@ jobs: # by this GHA. If there is a Forge namespace collision, Forge will pre-empt the existing test running in the namespace. FORGE_NAMESPACE: forge-e2e-${{ needs.determine-docker-build-metadata.outputs.targetCacheId }} SKIP_JOB: ${{ needs.file_change_determinator.outputs.only_docs_changed == 'true' }} + SEND_RESULTS_TO_TRUNK: true # This job determines the last released docker image tag, which is used by forge compat test. fetch-last-released-docker-image-tag: @@ -356,6 +357,7 @@ jobs: COMMENT_HEADER: forge-compat FORGE_NAMESPACE: forge-compat-${{ needs.determine-docker-build-metadata.outputs.targetCacheId }} SKIP_JOB: ${{ needs.file_change_determinator.outputs.only_docs_changed == 'true' }} + SEND_RESULTS_TO_TRUNK: true # Run forge framework upgradability test. This is a PR required job. forge-framework-upgrade-test: @@ -385,6 +387,7 @@ jobs: COMMENT_HEADER: forge-framework-upgrade FORGE_NAMESPACE: forge-framework-upgrade-${{ needs.determine-docker-build-metadata.outputs.targetCacheId }} SKIP_JOB: ${{ !contains(github.event.pull_request.labels.*.name, 'CICD:run-framework-upgrade-test') && (needs.test-target-determinator.outputs.run_framework_upgrade_test == 'false') }} + SEND_RESULTS_TO_TRUNK: true forge-consensus-only-perf-test: needs: diff --git a/.github/workflows/forge-stable.yaml b/.github/workflows/forge-stable.yaml index 73947c9936a33..01a54473dd6dc 100644 --- a/.github/workflows/forge-stable.yaml +++ b/.github/workflows/forge-stable.yaml @@ -24,6 +24,35 @@ on: required: false type: string description: The git SHA1 to checkout. This affects the Forge test runner that is used. If not specified, the latest main will be used + TEST_NAME: + required: true + type: choice + description: The specific stable test to run. If 'all', all stable tests will be run + default: 'all' + options: + - all + - framework-upgrade-test + - realistic-env-load-sweep + - realistic-env-workload-sweep + - realistic-env-graceful-overload + - realistic-env-graceful-workload-sweep + - realistic-env-fairness-workload-sweep + - realistic-network-tuned-for-throughput + - consensus-stress-test + - workload-mix-test + - single-vfn-perf + - fullnode-reboot-stress-test + - compat + - changing-working-quorum-test + - changing-working-quorum-test-high-load + - pfn-const-tps-realistic-env + - realistic-env-max-load-long + JOB_PARALLELISM: + required: false + type: number + description: The number of test jobs to run in parallel. If not specified, defaults to 1 + default: 1 + # NOTE: to support testing different branches on different schedules, you need to specify the cron schedule in the 'determine-test-branch' step as well below # Reference: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule schedule: @@ -122,212 +151,69 @@ jobs: echo "IMAGE_TAG: [${IMAGE_TAG}](https://github.com/${{ github.repository }}/commit/${IMAGE_TAG})" >> $GITHUB_STEP_SUMMARY echo "To cancel this job, do `pnpm infra ci cancel-workflow ${{ github.run_id }}` from internal-ops" >> $GITHUB_STEP_SUMMARY - ### Real-world-network tests. - # Run forge framework upgradability test. This is a PR required job. - run-forge-framework-upgrade-test: + generate-matrix: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.result }} + steps: + - name: Compute matrix + id: set-matrix + uses: actions/github-script@v7 + env: + TEST_NAME: ${{ inputs.TEST_NAME }} + with: + result-encoding: string + script: | + const testName = process.env.TEST_NAME || 'all'; + console.log(`Running job: ${testName}`); + const tests = [ + { TEST_NAME: 'framework-upgrade-test', FORGE_RUNNER_DURATION_SECS: 7200, FORGE_TEST_SUITE: 'framework_upgrade' }, + { TEST_NAME: 'realistic-env-load-sweep', FORGE_RUNNER_DURATION_SECS: 1800, FORGE_TEST_SUITE: 'realistic_env_load_sweep' }, + { TEST_NAME: 'realistic-env-workload-sweep', FORGE_RUNNER_DURATION_SECS: 2000, FORGE_TEST_SUITE: 'realistic_env_workload_sweep' }, + { TEST_NAME: 'realistic-env-graceful-overload', FORGE_RUNNER_DURATION_SECS: 1200, FORGE_TEST_SUITE: 'realistic_env_graceful_overload' }, + { TEST_NAME: 'realistic-env-graceful-workload-sweep', FORGE_RUNNER_DURATION_SECS: 2100, FORGE_TEST_SUITE: 'realistic_env_graceful_workload_sweep' }, + { TEST_NAME: 'realistic-env-fairness-workload-sweep', FORGE_RUNNER_DURATION_SECS: 900, FORGE_TEST_SUITE: 'realistic_env_fairness_workload_sweep' }, + { TEST_NAME: 'realistic-network-tuned-for-throughput', FORGE_RUNNER_DURATION_SECS: 900, FORGE_TEST_SUITE: 'realistic_network_tuned_for_throughput', FORGE_ENABLE_PERFORMANCE: true }, + { TEST_NAME: 'consensus-stress-test', FORGE_RUNNER_DURATION_SECS: 2400, FORGE_TEST_SUITE: 'consensus_stress_test' }, + { TEST_NAME: 'workload-mix-test', FORGE_RUNNER_DURATION_SECS: 900, FORGE_TEST_SUITE: 'workload_mix' }, + { TEST_NAME: 'single-vfn-perf', FORGE_RUNNER_DURATION_SECS: 480, FORGE_TEST_SUITE: 'single_vfn_perf' }, + { TEST_NAME: 'fullnode-reboot-stress-test', FORGE_RUNNER_DURATION_SECS: 1800, FORGE_TEST_SUITE: 'fullnode_reboot_stress_test' }, + { TEST_NAME: 'compat', FORGE_RUNNER_DURATION_SECS: 300, FORGE_TEST_SUITE: 'compat' }, + { TEST_NAME: 'changing-working-quorum-test', FORGE_RUNNER_DURATION_SECS: 1200, FORGE_TEST_SUITE: 'changing_working_quorum_test', FORGE_ENABLE_FAILPOINTS: true }, + { TEST_NAME: 'changing-working-quorum-test-high-load', FORGE_RUNNER_DURATION_SECS: 900, FORGE_TEST_SUITE: 'changing_working_quorum_test_high_load', FORGE_ENABLE_FAILPOINTS: true }, + { TEST_NAME: 'pfn-const-tps-realistic-env', FORGE_RUNNER_DURATION_SECS: 900, FORGE_TEST_SUITE: 'pfn_const_tps_with_realistic_env' }, + { TEST_NAME: 'realistic-env-max-load-long', FORGE_RUNNER_DURATION_SECS: 7200, FORGE_TEST_SUITE: 'realistic_env_max_load_large' } + ]; + + const matrix = testName != "all" ? tests.filter(test => test.TEST_NAME === testName) : tests; + core.debug(`Matrix: ${JSON.stringify(matrix)}`); + + core.summary.addHeading('Forge Stable Run'); + + const testsToRunNames = matrix.map(test => test.TEST_NAME); + core.summary.addRaw("The following tests will be run:", true); + core.summary.addList(testsToRunNames); + + core.summary.write(); + + const matrix_output = { include: matrix }; + return JSON.stringify(matrix_output); + + run: + needs: [determine-test-metadata, generate-matrix] if: ${{ github.event_name != 'pull_request' }} - needs: - - determine-test-metadata - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG_FOR_COMPAT_TEST }} - FORGE_NAMESPACE: forge-framework-upgrade-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 7200 # Run for 2 hours - FORGE_TEST_SUITE: framework_upgrade - POST_TO_SLACK: true - - run-forge-realistic-env-load-sweep: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-framework-upgrade-test] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-load-sweep-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 1800 # Run for 30 minutes (6 tests, each for 300 seconds) - FORGE_TEST_SUITE: realistic_env_load_sweep - POST_TO_SLACK: true - - run-forge-realistic-env-workload-sweep: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-realistic-env-load-sweep] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-workload-sweep-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 2000 # Run for 33 minutes (5 tests, each for 400 seconds) - FORGE_TEST_SUITE: realistic_env_workload_sweep - POST_TO_SLACK: true - - run-forge-realistic-env-graceful-overload: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-realistic-env-workload-sweep] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-graceful-overload-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 1200 # Run for 20 minutes - FORGE_TEST_SUITE: realistic_env_graceful_overload - POST_TO_SLACK: true - - run-forge-realistic-env-graceful-workload-sweep: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-realistic-env-graceful-overload] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-graceful-workload-sweep-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 2100 # Run for 5 minutes per test, 7 tests. - FORGE_TEST_SUITE: realistic_env_graceful_workload_sweep - POST_TO_SLACK: true - - run-forge-realistic-env-fairness-workload-sweep: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-realistic-env-graceful-workload-sweep] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-fairness-workload-sweep-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 900 # Run for 5 minutes per test, 3 tests. - FORGE_TEST_SUITE: realistic_env_fairness_workload_sweep - POST_TO_SLACK: true - - run-forge-realistic-network-tuned-for-throughput: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [ determine-test-metadata, run-forge-realistic-env-fairness-workload-sweep ] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-network-tuned-for-throughput-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 900 # Run for 15 minutes - FORGE_TEST_SUITE: realistic_network_tuned_for_throughput - FORGE_ENABLE_PERFORMANCE: true - POST_TO_SLACK: true - - ### Forge Correctness/Componenet/Stress tests - - run-forge-consensus-stress-test: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-realistic-network-tuned-for-throughput] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-consensus-stress-test-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 2400 # Run for 40 minutes - FORGE_TEST_SUITE: consensus_stress_test - POST_TO_SLACK: true - - run-forge-workload-mix-test: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-consensus-stress-test] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-workload-mix-test-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 900 # Run for 15 minutes - FORGE_TEST_SUITE: workload_mix - POST_TO_SLACK: true - - run-forge-single-vfn-perf: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-workload-mix-test] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-continuous-e2e-single-vfn-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 480 # Run for 8 minutes - FORGE_TEST_SUITE: single_vfn_perf - POST_TO_SLACK: true - - run-forge-fullnode-reboot-stress-test: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-single-vfn-perf] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-fullnode-reboot-stress-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 1800 # Run for 30 minutes - FORGE_TEST_SUITE: fullnode_reboot_stress_test - POST_TO_SLACK: true - - ### Compatibility Forge tests - - run-forge-compat: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-fullnode-reboot-stress-test] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - FORGE_NAMESPACE: forge-compat-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 300 # Run for 5 minutes - # This will upgrade from testnet branch to the latest main - FORGE_TEST_SUITE: compat - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG_FOR_COMPAT_TEST }} - GIT_SHA: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} # this is the git ref to checkout - POST_TO_SLACK: true - - ### Changing working quorum Forge tests - - run-forge-changing-working-quorum-test: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-compat] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-changing-working-quorum-test-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 1200 # Run for 20 minutes - FORGE_TEST_SUITE: changing_working_quorum_test - POST_TO_SLACK: true - FORGE_ENABLE_FAILPOINTS: true - - run-forge-changing-working-quorum-test-high-load: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-changing-working-quorum-test] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-changing-working-quorum-test-high-load-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 900 # Run for 15 minutes - FORGE_TEST_SUITE: changing_working_quorum_test_high_load - POST_TO_SLACK: true - FORGE_ENABLE_FAILPOINTS: true - - # Measures PFN latencies with a constant TPS (with a realistic environment) - run-forge-pfn-const-tps-realistic-env: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-changing-working-quorum-test-high-load] # Only run after the previous job completes - uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main - secrets: inherit - with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-pfn-const-tps-with-realistic-env-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 900 # Run for 15 minutes - FORGE_TEST_SUITE: pfn_const_tps_with_realistic_env - POST_TO_SLACK: true - - - # longest test for last, to get useful signal from short tests first - - run-forge-realistic-env-max-load-long: - if: ${{ github.event_name != 'pull_request' && always() }} - needs: [determine-test-metadata, run-forge-pfn-const-tps-realistic-env] # Only run after the previous job completes + strategy: + fail-fast: false + max-parallel: ${{ fromJson(inputs.JOB_PARALLELISM) || 1 }} + matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }} uses: aptos-labs/aptos-core/.github/workflows/workflow-run-forge.yaml@main secrets: inherit with: - IMAGE_TAG: ${{ needs.determine-test-metadata.outputs.IMAGE_TAG }} - FORGE_NAMESPACE: forge-realistic-env-max-load-long-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} - FORGE_RUNNER_DURATION_SECS: 7200 # Run for 2 hours - FORGE_TEST_SUITE: realistic_env_max_load_large + IMAGE_TAG: ${{ ((matrix.FORGE_TEST_SUITE == 'compat' && needs.determine-test-metadata.outputs.IMAGE_TAG_FOR_COMPAT_TEST) || needs.determine-test-metadata.outputs.IMAGE_TAG) }} + FORGE_NAMESPACE: forge-${{ matrix.TEST_NAME }}-${{ needs.determine-test-metadata.outputs.BRANCH_HASH }} + FORGE_TEST_SUITE: ${{ matrix.FORGE_TEST_SUITE }} + FORGE_RUNNER_DURATION_SECS: ${{ matrix.FORGE_RUNNER_DURATION_SECS }} + FORGE_ENABLE_PERFORMANCE: ${{ matrix.FORGE_ENABLE_PERFORMANCE || false }} + FORGE_ENABLE_FAILPOINTS: ${{ matrix.FORGE_ENABLE_FAILPOINTS || false }} POST_TO_SLACK: true + SEND_RESULTS_TO_TRUNK: true \ No newline at end of file diff --git a/.github/workflows/workflow-run-forge.yaml b/.github/workflows/workflow-run-forge.yaml index 05d0251194f8c..bf085906a15e0 100644 --- a/.github/workflows/workflow-run-forge.yaml +++ b/.github/workflows/workflow-run-forge.yaml @@ -87,6 +87,10 @@ on: required: false type: string description: The deployer profile used to spin up and configure forge infrastructure + SEND_RESULTS_TO_TRUNK: + required: false + type: boolean + description: Send forge results to trunk.io env: AWS_ACCOUNT_NUM: ${{ secrets.ENV_ECR_AWS_ACCOUNT_NUM }} @@ -118,6 +122,7 @@ env: VERBOSE: true FORGE_NUM_VALIDATORS: ${{ inputs.FORGE_NUM_VALIDATORS }} FORGE_NUM_VALIDATOR_FULLNODES: ${{ inputs.FORGE_NUM_VALIDATOR_FULLNODES }} + FORGE_JUNIT_XML_PATH: ${{ inputs.SEND_RESULTS_TO_TRUNK && '/tmp/test.xml' || '' }} # TODO: should we migrate this to a composite action, so that we can skip it # at the call site, and don't need to wrap each step in an if statement? @@ -228,3 +233,14 @@ jobs: # Print out whether the job was skipped. - run: echo "Skipping forge test!" if: ${{ inputs.SKIP_JOB }} + + - name: Upload results + # Run this step even if the test step ahead fails + if: ${{ !inputs.SKIP_JOB && inputs.SEND_RESULTS_TO_TRUNK && !cancelled() }} + uses: trunk-io/analytics-uploader@main + with: + # Configured in the nextest.toml file + junit-paths: ${{ env.FORGE_JUNIT_XML_PATH }} + org-slug: aptoslabs + token: ${{ secrets.TRUNK_API_TOKEN }} + continue-on-error: true diff --git a/Cargo.lock b/Cargo.lock index a747918232bb7..9662a018635ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,7 +274,7 @@ dependencies = [ [[package]] name = "aptos" -version = "4.2.6" +version = "4.3.0" dependencies = [ "anyhow", "aptos-api-types", @@ -1371,6 +1371,28 @@ dependencies = [ "threadpool", ] +[[package]] +name = "aptos-dynamic-transaction-composer" +version = "0.1.0" +dependencies = [ + "anyhow", + "aptos-types", + "bcs 0.1.4", + "e2e-move-tests", + "getrandom 0.2.11", + "hex", + "move-binary-format", + "move-bytecode-verifier", + "move-core-types", + "reqwest 0.11.23", + "serde", + "serde_bytes", + "serde_json", + "tsify-next", + "wasm-bindgen", + "wasm-bindgen-futures", +] + [[package]] name = "aptos-enum-conversion-derive" version = "0.0.3" @@ -1786,6 +1808,7 @@ dependencies = [ "num_cpus", "once_cell", "prometheus-http-query", + "quick-junit", "rand 0.7.3", "regex", "reqwest 0.11.23", @@ -1793,11 +1816,13 @@ dependencies = [ "serde_json", "serde_merge", "serde_yaml 0.8.26", + "sugars", "tempfile", "termcolor", "thiserror", "tokio", "url", + "uuid", ] [[package]] @@ -1824,6 +1849,7 @@ dependencies = [ "reqwest 0.11.23", "serde_json", "serde_yaml 0.8.26", + "sugars", "tokio", "url", ] @@ -4506,6 +4532,7 @@ dependencies = [ "move-binary-format", "move-core-types", "move-unit-test", + "move-vm-metrics", "move-vm-runtime", "move-vm-types", "num_cpus", @@ -8770,6 +8797,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "goldenfile" version = "1.6.0" @@ -8927,7 +8967,7 @@ dependencies = [ "fixedbitset 0.4.2", "guppy-summaries", "guppy-workspace-hack", - "indexmap 2.2.5", + "indexmap 2.6.0", "itertools 0.12.1", "nested", "once_cell", @@ -8976,7 +9016,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.11", - "indexmap 2.2.5", + "indexmap 2.6.0", "slab", "tokio", "tokio-util 0.7.10", @@ -8995,7 +9035,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.1.0", - "indexmap 2.2.5", + "indexmap 2.6.0", "slab", "tokio", "tokio-util 0.7.10", @@ -9075,6 +9115,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hdrhistogram" version = "7.5.4" @@ -9768,12 +9814,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.5" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.3", + "hashbrown 0.15.0", "serde", ] @@ -9820,7 +9866,7 @@ dependencies = [ "crossbeam-utils", "dashmap", "env_logger", - "indexmap 2.2.5", + "indexmap 2.6.0", "is-terminal", "itoa", "log", @@ -10045,9 +10091,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -11748,6 +11794,14 @@ dependencies = [ "tempfile", ] +[[package]] +name = "move-vm-metrics" +version = "0.1.0" +dependencies = [ + "once_cell", + "prometheus", +] + [[package]] name = "move-vm-paranoid-tests" version = "0.1.0" @@ -11776,6 +11830,7 @@ dependencies = [ "move-compiler", "move-core-types", "move-ir-compiler", + "move-vm-metrics", "move-vm-test-utils", "move-vm-types", "once_cell", @@ -11960,6 +12015,15 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "newtype-uuid" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4933943834e236c864a48aefdc2da43885dbd5eb77bff3ab20f31e0c3146f5" +dependencies = [ + "uuid", +] + [[package]] name = "nix" version = "0.26.4" @@ -12662,7 +12726,7 @@ dependencies = [ "ciborium", "coset", "data-encoding", - "indexmap 2.2.5", + "indexmap 2.6.0", "rand 0.8.5", "serde", "serde_json", @@ -12848,7 +12912,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.2.5", + "indexmap 2.6.0", ] [[package]] @@ -13120,7 +13184,7 @@ dependencies = [ "bytes", "derive_more", "futures-util", - "indexmap 2.2.5", + "indexmap 2.6.0", "mime", "num-traits", "poem", @@ -13143,7 +13207,7 @@ source = "git+https://github.com/poem-web/poem.git?rev=809b2816d3504beeba140fef3 dependencies = [ "darling 0.20.9", "http 1.1.0", - "indexmap 2.2.5", + "indexmap 2.6.0", "mime", "proc-macro-crate 3.1.0", "proc-macro2", @@ -13892,6 +13956,21 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" +[[package]] +name = "quick-junit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ffd2f9a162cfae131bed6d9d1ed60adced33be340a94f96952897d7cb0c240" +dependencies = [ + "chrono", + "indexmap 2.6.0", + "newtype-uuid", + "quick-xml 0.36.2", + "strip-ansi-escapes", + "thiserror", + "uuid", +] + [[package]] name = "quick-xml" version = "0.23.1" @@ -13920,6 +13999,15 @@ dependencies = [ "serde", ] +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + [[package]] name = "quick_cache" version = "0.5.1" @@ -15173,13 +15261,24 @@ dependencies = [ "syn 2.0.48", ] +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "serde_json" version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -15258,7 +15357,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.5", + "indexmap 2.6.0", "serde", "serde_json", "serde_with_macros", @@ -15295,7 +15394,7 @@ version = "0.9.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -15879,6 +15978,15 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "strip-ansi-escapes" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ff8ef943b384c414f54aefa961dd2bd853add74ec75e7ac74cf91dba62bcfa" +dependencies = [ + "vte", +] + [[package]] name = "strsim" version = "0.8.0" @@ -16005,6 +16113,12 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" +[[package]] +name = "sugars" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc0db74f9ee706e039d031a560bd7d110c7022f016051b3d33eeff9583e3e67a" + [[package]] name = "symbolic-common" version = "10.2.1" @@ -16329,18 +16443,18 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", @@ -16714,7 +16828,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -16727,7 +16841,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -16738,7 +16852,7 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ - "indexmap 2.2.5", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -17080,6 +17194,31 @@ dependencies = [ "termcolor", ] +[[package]] +name = "tsify-next" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4a645dca4ee0800f5ab60ce166deba2db6a0315de795a2691e138a3d55d756" +dependencies = [ + "gloo-utils", + "serde", + "serde_json", + "tsify-next-macros", + "wasm-bindgen", +] + +[[package]] +name = "tsify-next-macros" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d5c06f8a51d759bb58129e30b2631739e7e1e4579fad1f30ac09a6c88e488a6" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.48", +] + [[package]] name = "tui" version = "0.19.0" @@ -17423,9 +17562,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.9.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom 0.2.11", "serde", @@ -17477,6 +17616,26 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vte" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" +dependencies = [ + "utf8parse", + "vte_generate_state_changes", +] + +[[package]] +name = "vte_generate_state_changes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "wait-timeout" version = "0.2.0" @@ -17577,19 +17736,20 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -17602,9 +17762,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -17614,9 +17774,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -17624,9 +17784,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -17637,9 +17797,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" diff --git a/Cargo.toml b/Cargo.toml index 732980e0d6d55..c9b687d313c27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ members = [ "aptos-move/move-examples", "aptos-move/mvhashmap", "aptos-move/package-builder", + "aptos-move/script-composer", "aptos-move/vm-genesis", "aptos-node", "aptos-utils", @@ -233,6 +234,7 @@ members = [ "third_party/move/move-prover/test-utils", "third_party/move/move-symbol-pool", "third_party/move/move-vm/integration-tests", + "third_party/move/move-vm/metrics", "third_party/move/move-vm/paranoid-tests", "third_party/move/move-vm/runtime", "third_party/move/move-vm/test-utils", @@ -428,6 +430,7 @@ aptos-runtimes = { path = "crates/aptos-runtimes" } aptos-safety-rules = { path = "consensus/safety-rules" } aptos-schemadb = { path = "storage/schemadb" } aptos-scratchpad = { path = "storage/scratchpad" } +aptos-script-composer = { path = "aptos-move/script-composer" } aptos-sdk = { path = "sdk" } aptos-sdk-builder = { path = "aptos-move/aptos-sdk-builder" } aptos-secure-net = { path = "secure/net" } @@ -524,7 +527,12 @@ cfg_block = "0.1.1" cfg-if = "1.0.0" ciborium = "0.2" claims = "0.7" -clap = { version = "4.3.9", features = ["derive", "env", "unstable-styles", "wrap_help"] } +clap = { version = "4.3.9", features = [ + "derive", + "env", + "unstable-styles", + "wrap_help", +] } clap-verbosity-flag = "2.1.1" clap_complete = "4.4.1" cloud-storage = { version = "0.11.1", features = [ @@ -680,8 +688,14 @@ petgraph = "0.6.5" pin-project = "1.0.10" plotters = { version = "0.3.5", default-features = false } # We're using git deps until https://github.com/poem-web/poem/pull/829 gets formally released. -poem = { git = "https://github.com/poem-web/poem.git", rev = "809b2816d3504beeba140fef3fdfe9432d654c5b", features = ["anyhow", "rustls"] } -poem-openapi = { git = "https://github.com/poem-web/poem.git", rev = "809b2816d3504beeba140fef3fdfe9432d654c5b", features = ["swagger-ui", "url"] } +poem = { git = "https://github.com/poem-web/poem.git", rev = "809b2816d3504beeba140fef3fdfe9432d654c5b", features = [ + "anyhow", + "rustls", +] } +poem-openapi = { git = "https://github.com/poem-web/poem.git", rev = "809b2816d3504beeba140fef3fdfe9432d654c5b", features = [ + "swagger-ui", + "url", +] } poem-openapi-derive = { git = "https://github.com/poem-web/poem.git", rev = "809b2816d3504beeba140fef3fdfe9432d654c5b" } poseidon-ark = { git = "https://github.com/arnaucube/poseidon-ark.git", rev = "6d2487aa1308d9d3860a2b724c485d73095c1c68" } pprof = { version = "0.11", features = ["flamegraph", "protobuf-codec"] } @@ -699,6 +713,7 @@ prost = { version = "0.12.3", features = ["no-recursion-limit"] } prost-types = "0.12.3" quanta = "0.10.1" quick_cache = "0.5.1" +quick-junit = "0.5.0" quote = "1.0.18" rand = "0.7.3" rand_core = "0.5.1" @@ -761,6 +776,7 @@ stats_alloc = "0.1.8" status-line = "0.2.0" strum = "0.24.1" strum_macros = "0.24.2" +sugars = "3.0.1" syn = { version = "1.0.92", features = ["derive", "extra-traits"] } sysinfo = "0.28.4" tar = "0.4.40" @@ -799,6 +815,7 @@ tonic = { version = "0.11.0", features = [ tonic-reflection = "0.11.0" topological-sort = "0.2.2" triomphe = "0.1.9" +tsify-next = "0.5.4" tui = "0.19.0" typed-arena = "2.0.2" typenum = "1.17.0" @@ -813,6 +830,8 @@ variant_count = "1.1.0" walkdir = "2.3.3" warp = { version = "0.3.5", features = ["tls"] } warp-reverse-proxy = "1.0.0" +wasm-bindgen = "0.2.95" +wasm-bindgen-futures = "0.4.42" which = "4.2.5" whoami = "1.5.0" x25519-dalek = "1.2.0" @@ -853,6 +872,7 @@ move-transactional-test-runner = { path = "third_party/move/testing-infra/transa move-unit-test = { path = "third_party/move/tools/move-unit-test", features = [ "table-extension", ] } +move-vm-metrics = { path = "third_party/move/move-vm/metrics" } move-vm-runtime = { path = "third_party/move/move-vm/runtime" } move-vm-test-utils = { path = "third_party/move/move-vm/test-utils", features = [ "table-extension", diff --git a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs index 801d44b6992c5..d48c19c67e04b 100644 --- a/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs +++ b/aptos-move/aptos-gas-schedule/src/gas_schedule/aptos_framework.rs @@ -6,7 +6,7 @@ use crate::{ gas_feature_versions::{RELEASE_V1_14, RELEASE_V1_8, RELEASE_V1_9_SKIPPED}, gas_schedule::NativeGasParameters, - ver::gas_feature_versions::{RELEASE_V1_12, RELEASE_V1_13}, + ver::gas_feature_versions::{RELEASE_V1_12, RELEASE_V1_13, RELEASE_V1_23}, }; use aptos_gas_algebra::{ InternalGas, InternalGasPerAbstractValueUnit, InternalGasPerArg, InternalGasPerByte, @@ -322,5 +322,7 @@ crate::gas_schedule::macros::define_gas_parameters!( [object_exists_at_per_item_loaded: InternalGas, { 7.. => "object.exists_at.per_item_loaded" }, 1470], [string_utils_base: InternalGas, { 8.. => "string_utils.format.base" }, 1102], [string_utils_per_byte: InternalGasPerByte, { 8.. =>"string_utils.format.per_byte" }, 3], + + [randomness_fetch_and_inc_counter: InternalGas, { RELEASE_V1_23.. => "randomness.fetch_and_inc_counter" }, 1], ] ); diff --git a/aptos-move/aptos-release-builder/src/components/feature_flags.rs b/aptos-move/aptos-release-builder/src/components/feature_flags.rs index e3087add0c647..4cd1b2a9db29d 100644 --- a/aptos-move/aptos-release-builder/src/components/feature_flags.rs +++ b/aptos-move/aptos-release-builder/src/components/feature_flags.rs @@ -131,7 +131,6 @@ pub enum FeatureFlag { FederatedKeyless, TransactionSimulationEnhancement, CollectionOwner, - TransactionContextHashFunctionUpdate, EnableLoaderV2, } @@ -349,9 +348,6 @@ impl From for AptosFeatureFlag { AptosFeatureFlag::TRANSACTION_SIMULATION_ENHANCEMENT }, FeatureFlag::CollectionOwner => AptosFeatureFlag::COLLECTION_OWNER, - FeatureFlag::TransactionContextHashFunctionUpdate => { - AptosFeatureFlag::TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE - }, FeatureFlag::EnableLoaderV2 => AptosFeatureFlag::ENABLE_LOADER_V2, } } @@ -496,9 +492,6 @@ impl From for FeatureFlag { FeatureFlag::TransactionSimulationEnhancement }, AptosFeatureFlag::COLLECTION_OWNER => FeatureFlag::CollectionOwner, - AptosFeatureFlag::TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE => { - FeatureFlag::TransactionContextHashFunctionUpdate - }, AptosFeatureFlag::ENABLE_LOADER_V2 => FeatureFlag::EnableLoaderV2, } } diff --git a/aptos-move/aptos-vm/Cargo.toml b/aptos-move/aptos-vm/Cargo.toml index cc5fd9eb3f1bb..a3458288716d2 100644 --- a/aptos-move/aptos-vm/Cargo.toml +++ b/aptos-move/aptos-vm/Cargo.toml @@ -49,6 +49,7 @@ hex = { workspace = true } move-binary-format = { workspace = true } move-core-types = { workspace = true } move-unit-test = { workspace = true, optional = true } +move-vm-metrics = { workspace = true } move-vm-runtime = { workspace = true } move-vm-types = { workspace = true } num_cpus = { workspace = true } @@ -64,6 +65,7 @@ aptos-block-executor = { workspace = true, features = ["testing"] } aptos-language-e2e-tests = { workspace = true } aptos-types = { workspace = true, features = ["fuzzing"] } claims = { workspace = true } +move-vm-types = { workspace = true, features = ["testing"] } proptest = { workspace = true } rand_core = { workspace = true } diff --git a/aptos-move/aptos-vm/src/aptos_vm.rs b/aptos-move/aptos-vm/src/aptos_vm.rs index fbc363f7b810a..798b1eadbb2c8 100644 --- a/aptos-move/aptos-vm/src/aptos_vm.rs +++ b/aptos-move/aptos-vm/src/aptos_vm.rs @@ -107,6 +107,7 @@ use move_core_types::{ value::{serialize_values, MoveTypeLayout, MoveValue}, vm_status::StatusType, }; +use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_runtime::{ logging::expect_no_verification_errors, module_traversal::{TraversalContext, TraversalStorage}, @@ -1908,6 +1909,8 @@ impl AptosVM { gas_meter: &mut impl AptosGasMeter, log_context: &AdapterLogSchema, ) -> (VMStatus, VMOutput) { + let _timer = VM_TIMER.timer_with_label("AptosVM::execute_user_transaction_impl"); + let traversal_storage = TraversalStorage::new(); let mut traversal_context = TraversalContext::new(&traversal_storage); @@ -1938,6 +1941,8 @@ impl AptosVM { code_storage, )); + let account_init_for_sponsored_transaction_timer = + VM_TIMER.timer_with_label("AptosVM::account_init_for_sponsored_transaction"); let is_account_init_for_sponsored_transaction = unwrap_or_discard!(is_account_init_for_sponsored_transaction( &txn_data, @@ -1956,6 +1961,10 @@ impl AptosVM { )) ); } + drop(account_init_for_sponsored_transaction_timer); + + let payload_timer = + VM_TIMER.timer_with_label("AptosVM::execute_user_transaction_impl [payload]"); // We keep track of whether any newly published modules are loaded into the Vm's loader // cache as part of executing transactions. This would allow us to decide whether the cache @@ -1996,6 +2005,7 @@ impl AptosVM { unwrap_or_discard!(Err(deprecated_module_bundle!())) }, }; + drop(payload_timer); let gas_usage = txn_data .max_gas_amount() diff --git a/aptos-move/aptos-vm/src/move_vm_ext/session/mod.rs b/aptos-move/aptos-vm/src/move_vm_ext/session/mod.rs index 274c840c9a226..e20b94c89c68c 100644 --- a/aptos-move/aptos-vm/src/move_vm_ext/session/mod.rs +++ b/aptos-move/aptos-vm/src/move_vm_ext/session/mod.rs @@ -79,24 +79,24 @@ impl<'r, 'l> SessionExt<'r, 'l> { resolver: &'r R, ) -> Self { let mut extensions = NativeContextExtensions::default(); - let unique_session_hash: [u8; 32] = session_id + let txn_hash: [u8; 32] = session_id .as_uuid() .to_vec() .try_into() .expect("HashValue should convert to [u8; 32]"); - extensions.add(NativeTableContext::new(unique_session_hash, resolver)); + extensions.add(NativeTableContext::new(txn_hash, resolver)); extensions.add(NativeRistrettoPointContext::new()); extensions.add(AlgebraContext::new()); extensions.add(NativeAggregatorContext::new( - unique_session_hash, + txn_hash, resolver, move_vm.vm_config().delayed_field_optimization_enabled, resolver, )); extensions.add(RandomnessContext::new()); extensions.add(NativeTransactionContext::new( - unique_session_hash.to_vec(), + txn_hash.to_vec(), session_id.into_script_hash(), chain_id.id(), maybe_user_transaction_context, diff --git a/aptos-move/aptos-vm/src/transaction_metadata.rs b/aptos-move/aptos-vm/src/transaction_metadata.rs index 6de8b2c233df1..65358aee33e82 100644 --- a/aptos-move/aptos-vm/src/transaction_metadata.rs +++ b/aptos-move/aptos-vm/src/transaction_metadata.rs @@ -2,15 +2,14 @@ // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 -use aptos_crypto::{hash::CryptoHash, HashValue}; +use aptos_crypto::HashValue; use aptos_gas_algebra::{FeePerGasUnit, Gas, NumBytes}; use aptos_types::{ account_address::AccountAddress, chain_id::ChainId, transaction::{ - authenticator::TransactionAuthenticator::{FeePayer, MultiAgent}, - user_transaction_context::UserTransactionContext, - EntryFunction, Multisig, RawTransactionWithData, SignedTransaction, TransactionPayload, + user_transaction_context::UserTransactionContext, EntryFunction, Multisig, + SignedTransaction, TransactionPayload, }, }; @@ -32,7 +31,6 @@ pub struct TransactionMetadata { pub is_keyless: bool, pub entry_function_payload: Option, pub multisig_payload: Option, - pub raw_transaction_hash: Vec, } impl TransactionMetadata { @@ -91,36 +89,6 @@ impl TransactionMetadata { TransactionPayload::Multisig(m) => Some(m.clone()), _ => None, }, - raw_transaction_hash: match txn.authenticator_ref() { - MultiAgent { - sender: _, - secondary_signer_addresses, - secondary_signers: _, - } => { - let raw_txn = RawTransactionWithData::new_multi_agent( - txn.clone().into_raw_transaction(), - secondary_signer_addresses.clone(), - ); - raw_txn.hash().to_vec() - }, - FeePayer { - sender: _, - secondary_signer_addresses, - secondary_signers: _, - fee_payer_address: _, - fee_payer_signer: _, - } => { - // In the case of a fee payer transaction, the hash value is generated using - // AccountAddress::ZERO as the fee payer address. - let raw_txn = RawTransactionWithData::new_fee_payer( - txn.clone().into_raw_transaction(), - secondary_signer_addresses.clone(), - AccountAddress::ZERO, - ); - raw_txn.hash().to_vec() - }, - _ => txn.raw_transaction_ref().hash().to_vec(), - }, } } @@ -190,10 +158,6 @@ impl TransactionMetadata { self.multisig_payload.clone() } - pub fn raw_transaction_hash(&self) -> Vec { - self.raw_transaction_hash.clone() - } - pub fn as_user_transaction_context(&self) -> UserTransactionContext { UserTransactionContext::new( self.sender, @@ -206,7 +170,6 @@ impl TransactionMetadata { .map(|entry_func| entry_func.as_entry_function_payload()), self.multisig_payload() .map(|multisig| multisig.as_multisig_payload()), - self.raw_transaction_hash(), ) } } diff --git a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs index d8a57d3257161..153f26da17ecf 100644 --- a/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs +++ b/aptos-move/aptos-vm/src/verifier/transaction_arg_validation.rs @@ -21,6 +21,7 @@ use move_core_types::{ value::MoveValue, vm_status::StatusCode, }; +use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_runtime::{ module_traversal::{TraversalContext, TraversalStorage}, LoadedFunction, @@ -110,6 +111,8 @@ pub fn validate_combine_signer_and_txn_args( func: &LoadedFunction, are_struct_constructors_enabled: bool, ) -> Result>, VMStatus> { + let _timer = VM_TIMER.timer_with_label("AptosVM::validate_combine_signer_and_txn_args"); + // Entry function should not return. if !func.return_tys().is_empty() { return Err(VMStatus::error( diff --git a/aptos-move/e2e-benchmark/src/main.rs b/aptos-move/e2e-benchmark/src/main.rs index 1d3872f346afc..7169989088d13 100644 --- a/aptos-move/e2e-benchmark/src/main.rs +++ b/aptos-move/e2e-benchmark/src/main.rs @@ -91,59 +91,59 @@ fn main() { // data_length: Some(32), // }), // (, EntryPoints::IncGlobal), - (32800, EntryPoints::Loop { + (34651, EntryPoints::Loop { loop_count: Some(100000), loop_type: LoopType::NoOp, }), - (19880, EntryPoints::Loop { + (21145, EntryPoints::Loop { loop_count: Some(10000), loop_type: LoopType::Arithmetic, }), // This is a cheap bcs (serializing vec), so not representative of what BCS native call should cost. // (, EntryPoints::Loop { loop_count: Some(1000), loop_type: LoopType::BCS { len: 1024 }}), - (125, EntryPoints::CreateObjects { + (124, EntryPoints::CreateObjects { num_objects: 10, object_payload_size: 0, }), - (7800, EntryPoints::CreateObjects { + (8090, EntryPoints::CreateObjects { num_objects: 10, object_payload_size: 10 * 1024, }), - (1250, EntryPoints::CreateObjects { + (1246, EntryPoints::CreateObjects { num_objects: 100, object_payload_size: 0, }), - (9000, EntryPoints::CreateObjects { + (9556, EntryPoints::CreateObjects { num_objects: 100, object_payload_size: 10 * 1024, }), - (65, EntryPoints::InitializeVectorPicture { length: 40 }), - (14, EntryPoints::VectorPicture { length: 40 }), - (14, EntryPoints::VectorPictureRead { length: 40 }), - (29000, EntryPoints::InitializeVectorPicture { + (61, EntryPoints::InitializeVectorPicture { length: 40 }), + (16, EntryPoints::VectorPicture { length: 40 }), + (16, EntryPoints::VectorPictureRead { length: 40 }), + (23256, EntryPoints::InitializeVectorPicture { length: 30 * 1024, }), - (5900, EntryPoints::VectorPicture { length: 30 * 1024 }), - (5870, EntryPoints::VectorPictureRead { length: 30 * 1024 }), - (33580, EntryPoints::SmartTablePicture { + (5860, EntryPoints::VectorPicture { length: 30 * 1024 }), + (5849, EntryPoints::VectorPictureRead { length: 30 * 1024 }), + (35440, EntryPoints::SmartTablePicture { length: 30 * 1024, num_points_per_txn: 200, }), - (57370, EntryPoints::SmartTablePicture { + (60464, EntryPoints::SmartTablePicture { length: 1024 * 1024, num_points_per_txn: 300, }), - (12, EntryPoints::ResourceGroupsSenderWriteTag { + (13, EntryPoints::ResourceGroupsSenderWriteTag { string_length: 1024, }), - (26, EntryPoints::ResourceGroupsSenderMultiChange { + (27, EntryPoints::ResourceGroupsSenderMultiChange { string_length: 1024, }), - (281, EntryPoints::TokenV1MintAndTransferFT), - (474, EntryPoints::TokenV1MintAndTransferNFTSequential), - (401, EntryPoints::TokenV2AmbassadorMint { numbered: true }), + (291, EntryPoints::TokenV1MintAndTransferFT), + (468, EntryPoints::TokenV1MintAndTransferNFTSequential), + (386, EntryPoints::TokenV2AmbassadorMint { numbered: true }), (467, EntryPoints::LiquidityPoolSwap { is_stable: true }), - (415, EntryPoints::LiquidityPoolSwap { is_stable: false }), + (429, EntryPoints::LiquidityPoolSwap { is_stable: false }), ]; let mut failures = Vec::new(); diff --git a/aptos-move/e2e-move-tests/src/aggregator.rs b/aptos-move/e2e-move-tests/src/aggregator.rs index 2905422dbfc87..9589b1419a174 100644 --- a/aptos-move/e2e-move-tests/src/aggregator.rs +++ b/aptos-move/e2e-move-tests/src/aggregator.rs @@ -39,19 +39,14 @@ pub fn check( ) } -pub fn new( - harness: &mut MoveHarness, - account: &Account, - index: u64, - limit: u128, -) -> SignedTransaction { +pub fn new(harness: &mut MoveHarness, account: &Account, index: u64) -> SignedTransaction { harness.create_entry_function( account, str::parse("0x1::aggregator_test::new").unwrap(), vec![], vec![ bcs::to_bytes(&index).unwrap(), - bcs::to_bytes(&limit).unwrap(), + bcs::to_bytes(&u128::MAX).unwrap(), ], ) } diff --git a/aptos-move/e2e-move-tests/src/tests/aggregator.rs b/aptos-move/e2e-move-tests/src/tests/aggregator.rs index d22ffeda887b8..be473248b396b 100644 --- a/aptos-move/e2e-move-tests/src/tests/aggregator.rs +++ b/aptos-move/e2e-move-tests/src/tests/aggregator.rs @@ -20,29 +20,52 @@ fn setup() -> (MoveHarness, Account) { initialize(common::test_dir_path("aggregator.data/pack")) } -#[test_case(BlockSplit::Whole)] -#[test_case(BlockSplit::SingleTxnPerBlock)] -fn test_aggregators_e2e(block_split: BlockSplit) { +#[test_case(BlockSplit::Whole, false)] +#[test_case(BlockSplit::Whole, true)] +#[test_case(BlockSplit::SingleTxnPerBlock, false)] +#[test_case(BlockSplit::SingleTxnPerBlock, true)] +fn test_aggregators_e2e(block_split: BlockSplit, upper_limit: bool) { let (mut h, acc) = setup(); let block_size = 200; // Create many aggregators with deterministic limit. let txns = (0..block_size) - .map(|i| (SUCCESS, new(&mut h, &acc, i, (i as u128) * 100000))) + .map(|i| (SUCCESS, new(&mut h, &acc, i))) .collect(); h.run_block_in_parts_and_check(block_split, txns); + if upper_limit { + let txns = (0..block_size) + .map(|i| { + ( + SUCCESS, + add(&mut h, &acc, i, u128::MAX - (i as u128) * 100000), + ) + }) + .collect(); + h.run_block_in_parts_and_check(block_split, txns); + } + // All transactions in block must fail, so values of aggregators are still 0. let failed_txns = (0..block_size) - .map(|i| match i % 2 { - 0 => ( - EAGGREGATOR_OVERFLOW, - materialize_and_add(&mut h, &acc, i, (i as u128) * 100000 + 1), - ), - _ => ( - EAGGREGATOR_UNDERFLOW, - materialize_and_sub(&mut h, &acc, i, (i as u128) * 100000 + 1), - ), + .filter_map(|i| { + if upper_limit { + match i % 2 { + 0 => Some(( + EAGGREGATOR_OVERFLOW, + materialize_and_add(&mut h, &acc, i, (i as u128) * 100000 + 1), + )), + _ => None, + } + } else { + match i % 2 { + 0 => None, + _ => Some(( + EAGGREGATOR_UNDERFLOW, + materialize_and_sub(&mut h, &acc, i, (i as u128) * 100000 + 1), + )), + } + } }) .collect(); h.run_block_in_parts_and_check(block_split, failed_txns); @@ -69,11 +92,16 @@ fn test_aggregators_e2e(block_split: BlockSplit) { // Finally, check values. let txns = (0..block_size) .map(|i| { + let offset = if upper_limit { + u128::MAX - (i as u128) * 100000 + } else { + 0 + }; (SUCCESS, match i % 4 { - 0 => check(&mut h, &acc, i, (i as u128) * 3000), - 1 => check(&mut h, &acc, i, (i as u128) * 2000), - 2 => check(&mut h, &acc, i, 0), - _ => check(&mut h, &acc, i, (i as u128) * 1000 + (i as u128)), + 0 => check(&mut h, &acc, i, offset + (i as u128) * 3000), + 1 => check(&mut h, &acc, i, offset + (i as u128) * 2000), + 2 => check(&mut h, &acc, i, offset), + _ => check(&mut h, &acc, i, offset + (i as u128) * 1000 + (i as u128)), }) }) .collect(); @@ -90,11 +118,39 @@ proptest! { })] #[test] - fn test_aggregator_lifetime(block_split in BlockSplit::arbitrary(15)) { + fn test_aggregator_lifetime_upper_limit(block_split in BlockSplit::arbitrary(15)) { let (mut h, acc) = setup(); + let offset = u128::MAX - 1500; let txns = vec![ - (SUCCESS, new(&mut h, &acc, 0, 1500)), + (SUCCESS, new(&mut h, &acc, 0)), + (SUCCESS, add(&mut h, &acc, 0, offset)), + (SUCCESS, add(&mut h, &acc, 0, 400)), // 400 + (SUCCESS, materialize(&mut h, &acc, 0)), + (SUCCESS, add(&mut h, &acc, 0, 500)), // 900 + (SUCCESS, check(&mut h, &acc, 0, offset + 900)), + (SUCCESS, materialize_and_add(&mut h, &acc, 0, 600)), // 1500 + (SUCCESS, materialize_and_sub(&mut h, &acc, 0, 600)), // 900 + (SUCCESS, check(&mut h, &acc, 0, offset + 900)), + (SUCCESS, sub_add(&mut h, &acc, 0, 200, 300)), // 1000 + (SUCCESS, check(&mut h, &acc, 0, offset + 1000)), + // These 2 transactions fail, and should have no side-effects. + (EAGGREGATOR_OVERFLOW, add_and_materialize(&mut h, &acc, 0, 501)), + (SUCCESS, check(&mut h, &acc, 0, offset + 1000)), + (SUCCESS, destroy(&mut h, &acc, 0)), + // Aggregator has been destroyed and we cannot add this delta. + (25863, add(&mut h, &acc, 0, 1)), + ]; + + h.run_block_in_parts_and_check(block_split, txns); + } + + #[test] + fn test_aggregator_lifetime_lower_limit(block_split in BlockSplit::arbitrary(14)) { + let (mut h, acc) = setup(); + + let txns = vec![ + (SUCCESS, new(&mut h, &acc, 0)), (SUCCESS, add(&mut h, &acc, 0, 400)), // 400 (SUCCESS, materialize(&mut h, &acc, 0)), (SUCCESS, add(&mut h, &acc, 0, 500)), // 900 @@ -104,8 +160,7 @@ proptest! { (SUCCESS, check(&mut h, &acc, 0, 900)), (SUCCESS, sub_add(&mut h, &acc, 0, 200, 300)), // 1000 (SUCCESS, check(&mut h, &acc, 0, 1000)), - // These 2 transactions fail, and should have no side-effects. - (EAGGREGATOR_OVERFLOW, add_and_materialize(&mut h, &acc, 0, 501)), + // transactions fails, and should have no side-effects. (EAGGREGATOR_UNDERFLOW, sub_and_materialize(&mut h, &acc, 0, 1001)), (SUCCESS, check(&mut h, &acc, 0, 1000)), (SUCCESS, destroy(&mut h, &acc, 0)), @@ -122,7 +177,7 @@ proptest! { let (mut h, acc) = setup(); let txns = vec![ - (SUCCESS, new(&mut h, &acc, 0, 600)), + (SUCCESS, new(&mut h, &acc, 0)), (SUCCESS, add(&mut h, &acc, 0, 400)), // Value dropped below zero - abort with EAGGREGATOR_UNDERFLOW. // We cannot catch it, because we don't materialize it. @@ -137,7 +192,8 @@ proptest! { let (mut h, acc) = setup(); let txns = vec![ - (SUCCESS, new(&mut h, &acc, 0, 600)), + (SUCCESS, new(&mut h, &acc, 0)), + // Underflow on materialized value leads to abort with EAGGREGATOR_UNDERFLOW. // We can catch it, because we materialize it. (EAGGREGATOR_UNDERFLOW, materialize_and_sub(&mut h, &acc, 0, 400)), @@ -148,11 +204,12 @@ proptest! { #[test] #[should_panic] - fn test_aggregator_overflow(block_split in BlockSplit::arbitrary(3)) { + fn test_aggregator_overflow(block_split in BlockSplit::arbitrary(4)) { let (mut h, acc) = setup(); let txns = vec![ - (SUCCESS, new(&mut h, &acc, 0, 600)), + (SUCCESS, new(&mut h, &acc, 0)), + (SUCCESS, add(&mut h, &acc, 0, u128::MAX - 600)), (SUCCESS, add(&mut h, &acc, 0, 400)), // Currently, this one will panic, instead of throwing this code. // We cannot catch it, because we don't materialize it. @@ -164,11 +221,12 @@ proptest! { #[test] - fn test_aggregator_materialize_overflow(block_split in BlockSplit::arbitrary(2)) { + fn test_aggregator_materialize_overflow(block_split in BlockSplit::arbitrary(3)) { let (mut h, acc) = setup(); let txns = vec![ - (SUCCESS, new(&mut h, &acc, 0, 399)), + (SUCCESS, new(&mut h, &acc, 0)), + (SUCCESS, add(&mut h, &acc, 0, u128::MAX - 399)), // Overflow on materialized value leads to abort with EAGGREGATOR_OVERFLOW. // We can catch it, because we materialize it. (EAGGREGATOR_OVERFLOW, materialize_and_add(&mut h, &acc, 0, 400)), diff --git a/aptos-move/e2e-move-tests/src/tests/large_package_publishing.rs b/aptos-move/e2e-move-tests/src/tests/large_package_publishing.rs index 2476ff308c81b..159dcc6ceb1b3 100644 --- a/aptos-move/e2e-move-tests/src/tests/large_package_publishing.rs +++ b/aptos-move/e2e-move-tests/src/tests/large_package_publishing.rs @@ -21,7 +21,7 @@ use move_core_types::{ account_address::AccountAddress, parser::parse_struct_tag, vm_status::StatusCode, }; use serde::{Deserialize, Serialize}; -use std::{collections::BTreeMap, option::Option, path::Path}; +use std::{collections::BTreeMap, option::Option, path::Path, str::FromStr}; /// Number of transactions needed for staging code chunks before publishing to accounts or objects /// This is used to derive object address for testing object code deployment feature @@ -143,6 +143,7 @@ impl LargePackageTestContext { package_code, publish_type, Some(self.object_address), + AccountAddress::from_str(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), ) } } diff --git a/aptos-move/e2e-move-tests/src/tests/transaction_context.data/pack/sources/transaction_context_test.move b/aptos-move/e2e-move-tests/src/tests/transaction_context.data/pack/sources/transaction_context_test.move index e5f919560d837..0116d1035c9b0 100644 --- a/aptos-move/e2e-move-tests/src/tests/transaction_context.data/pack/sources/transaction_context_test.move +++ b/aptos-move/e2e-move-tests/src/tests/transaction_context.data/pack/sources/transaction_context_test.move @@ -24,7 +24,6 @@ module admin::transaction_context_test { type_arg_names: vector, args: vector>, multisig_address: address, - raw_transaction_hash: vector, } /// Called when the module is first deployed at address `signer`, which is supposed to be @admin (= 0x1). @@ -45,7 +44,6 @@ module admin::transaction_context_test { args: vector[], type_arg_names: vector[], multisig_address: @0x0, - raw_transaction_hash: vector[], } ); } @@ -143,14 +141,4 @@ module admin::transaction_context_test { store.multisig_address = multisig_account; } - - entry fun store_raw_transaction_hash_from_native_txn_context(_s: &signer) acquires TransactionContextStore { - let store = borrow_global_mut(@admin); - store.raw_transaction_hash = transaction_context::raw_transaction_hash(); - } - - entry fun store_raw_transaction_hash_from_native_txn_context_multi(_s: &signer, _s2: &signer) acquires TransactionContextStore { - let store = borrow_global_mut(@admin); - store.raw_transaction_hash = transaction_context::raw_transaction_hash(); - } } diff --git a/aptos-move/e2e-move-tests/src/tests/transaction_context.rs b/aptos-move/e2e-move-tests/src/tests/transaction_context.rs index 1e9e80d4ce93f..300a362fde4e8 100644 --- a/aptos-move/e2e-move-tests/src/tests/transaction_context.rs +++ b/aptos-move/e2e-move-tests/src/tests/transaction_context.rs @@ -2,14 +2,11 @@ // SPDX-License-Identifier: Apache-2.0 use crate::{assert_success, tests::common, MoveHarness}; -use aptos_crypto::hash::CryptoHash; use aptos_language_e2e_tests::account::{Account, TransactionBuilder}; use aptos_types::{ move_utils::MemberId, on_chain_config::FeatureFlag, - transaction::{ - EntryFunction, MultisigTransactionPayload, RawTransactionWithData, TransactionPayload, - }, + transaction::{EntryFunction, MultisigTransactionPayload, TransactionPayload}, }; use bcs::to_bytes; use move_core_types::{ @@ -34,7 +31,6 @@ struct TransactionContextStore { type_arg_names: Vec, args: Vec>, multisig_address: AccountAddress, - raw_transaction_hash: Vec, } fn setup(harness: &mut MoveHarness) -> Account { @@ -472,136 +468,3 @@ fn test_transaction_context_multisig_payload() { assert!(txn_ctx_store.type_arg_names.is_empty()); assert!(txn_ctx_store.args.is_empty()); } - -#[test] -fn test_transaction_context_raw_transaction_hash_simple() { - let mut harness = new_move_harness(); - let account = setup(&mut harness); - let signed_txn = harness.create_entry_function( - &account, - str::parse( - "0x1::transaction_context_test::store_raw_transaction_hash_from_native_txn_context", - ) - .unwrap(), - vec![], - vec![], - ); - let expected_hash = signed_txn.clone().into_raw_transaction().hash(); - let status = harness.run(signed_txn); - assert!(status.status().unwrap().is_success()); - let txn_ctx_store = harness - .read_resource::( - account.address(), - parse_struct_tag("0x1::transaction_context_test::TransactionContextStore").unwrap(), - ) - .unwrap(); - let hash = txn_ctx_store.raw_transaction_hash; - assert_eq!(hash, expected_hash.to_vec()); -} - -#[test] -fn test_transaction_context_raw_transaction_hash_multiagent() { - let mut harness = new_move_harness(); - - let alice = setup(&mut harness); - let bob = harness.new_account_with_balance_and_sequence_number(1000000, 0); - - let fun: MemberId = str::parse( - "0x1::transaction_context_test::store_raw_transaction_hash_from_native_txn_context_multi", - ) - .unwrap(); - let MemberId { - module_id, - member_id: function_id, - } = fun; - let ty_args = vec![]; - let args = vec![]; - let payload = TransactionPayload::EntryFunction(EntryFunction::new( - module_id, - function_id, - ty_args, - args, - )); - let signed_txn = TransactionBuilder::new(alice.clone()) - .secondary_signers(vec![bob.clone()]) - .payload(payload) - .sequence_number(harness.sequence_number(alice.address())) - .max_gas_amount(1_000_000) - .gas_unit_price(1) - .sign_multi_agent(); - - let raw_txn_with_data = - RawTransactionWithData::new_multi_agent(signed_txn.clone().into_raw_transaction(), vec![ - *bob.address(), - ]); - let expected_hash = raw_txn_with_data.hash(); - - let output = harness.run_raw(signed_txn); - assert_success!(*output.status()); - - let txn_ctx_store = harness - .read_resource::( - alice.address(), - parse_struct_tag("0x1::transaction_context_test::TransactionContextStore").unwrap(), - ) - .unwrap(); - - let hash = txn_ctx_store.raw_transaction_hash; - assert_eq!(hash, expected_hash.to_vec()); -} - -#[test] -fn test_transaction_context_raw_transaction_hash_multiagent_with_fee_payer() { - let mut harness = new_move_harness(); - - let alice = setup(&mut harness); - let bob = harness.new_account_with_balance_and_sequence_number(1000000, 0); - let fee_payer = harness.new_account_with_balance_and_sequence_number(1000000, 0); - - let fun: MemberId = str::parse( - "0x1::transaction_context_test::store_raw_transaction_hash_from_native_txn_context_multi", - ) - .unwrap(); - let MemberId { - module_id, - member_id: function_id, - } = fun; - let ty_args = vec![]; - let args = vec![]; - let payload = TransactionPayload::EntryFunction(EntryFunction::new( - module_id, - function_id, - ty_args, - args, - )); - let signed_txn = TransactionBuilder::new(alice.clone()) - .fee_payer(fee_payer.clone()) - .secondary_signers(vec![bob.clone()]) - .payload(payload) - .sequence_number(harness.sequence_number(alice.address())) - .max_gas_amount(1_000_000) - .gas_unit_price(1) - .sign_fee_payer(); - - // In the case of a fee payer transaction, the hash value is generated using - // AccountAddress::ZERO as the fee payer address. - let raw_txn_with_data = RawTransactionWithData::new_fee_payer( - signed_txn.clone().into_raw_transaction(), - vec![*bob.address()], - AccountAddress::ZERO, - ); - let expected_hash = raw_txn_with_data.hash(); - - let output = harness.run_raw(signed_txn); - assert_success!(*output.status()); - - let txn_ctx_store = harness - .read_resource::( - alice.address(), - parse_struct_tag("0x1::transaction_context_test::TransactionContextStore").unwrap(), - ) - .unwrap(); - - let hash = txn_ctx_store.raw_transaction_hash; - assert_eq!(hash, expected_hash.to_vec()); -} diff --git a/aptos-move/e2e-tests/src/executor.rs b/aptos-move/e2e-tests/src/executor.rs index 9dbe8a6b6004d..4c44a7e585c63 100644 --- a/aptos-move/e2e-tests/src/executor.rs +++ b/aptos-move/e2e-tests/src/executor.rs @@ -1,8 +1,4 @@ -// Copyright (c) Aptos Foundation -// SPDX-License-Identifier: Apache-2.0 - // Copyright © Aptos Foundation - // Parts of the project are originally copyright © Meta Platforms, Inc. // SPDX-License-Identifier: Apache-2.0 diff --git a/aptos-move/framework/aptos-framework/doc/aggregator_factory.md b/aptos-move/framework/aptos-framework/doc/aggregator_factory.md index e29646e2d4b09..4e53e07bd5b20 100644 --- a/aptos-move/framework/aptos-framework/doc/aggregator_factory.md +++ b/aptos-move/framework/aptos-framework/doc/aggregator_factory.md @@ -68,6 +68,15 @@ account can. ## Constants + + + + +
const MAX_U128: u128 = 340282366920938463463374607431768211455;
+
+ + + Aggregator factory is not published yet. @@ -78,6 +87,16 @@ Aggregator factory is not published yet. + + +Aggregator V1 only supports limit == MAX_U128. + + +
const EAGG_V1_LIMIT_DEPRECATED: u64 = 2;
+
+ + + ## Function `initialize_aggregator_factory` @@ -114,7 +133,7 @@ Creates a new factory for aggregators. Can only be called during genesis. Creates a new aggregator instance which overflows on exceeding a limit. -
public(friend) fun create_aggregator_internal(limit: u128): aggregator::Aggregator
+
public(friend) fun create_aggregator_internal(): aggregator::Aggregator
 
@@ -123,14 +142,14 @@ Creates a new aggregator instance which overflows on exceeding a limitImplementation -
public(friend) fun create_aggregator_internal(limit: u128): Aggregator acquires AggregatorFactory {
+
public(friend) fun create_aggregator_internal(): Aggregator acquires AggregatorFactory {
     assert!(
         exists<AggregatorFactory>(@aptos_framework),
         error::not_found(EAGGREGATOR_FACTORY_NOT_FOUND)
     );
 
     let aggregator_factory = borrow_global_mut<AggregatorFactory>(@aptos_framework);
-    new_aggregator(aggregator_factory, limit)
+    new_aggregator(aggregator_factory, MAX_U128)
 }
 
@@ -146,7 +165,8 @@ This is currently a function closed for public. This can be updated in the futur to allow any signer to call. -
public fun create_aggregator(account: &signer, limit: u128): aggregator::Aggregator
+
#[deprecated]
+public fun create_aggregator(account: &signer, limit: u128): aggregator::Aggregator
 
@@ -156,9 +176,15 @@ to allow any signer to call.
public fun create_aggregator(account: &signer, limit: u128): Aggregator acquires AggregatorFactory {
+    // deprecated. Currently used only in aptos-move/e2e-move-tests/src/tests/aggregator.data/pack/sources/aggregator_test.move
+
     // Only Aptos Framework (0x1) account can call this for now.
     system_addresses::assert_aptos_framework(account);
-    create_aggregator_internal(limit)
+    assert!(
+        limit == MAX_U128,
+        error::invalid_argument(EAGG_V1_LIMIT_DEPRECATED)
+    );
+    create_aggregator_internal()
 }
 
@@ -279,7 +305,7 @@ AggregatorFactory is not under the caller before creating the resource. ### Function `create_aggregator_internal` -
public(friend) fun create_aggregator_internal(limit: u128): aggregator::Aggregator
+
public(friend) fun create_aggregator_internal(): aggregator::Aggregator
 
@@ -287,7 +313,7 @@ AggregatorFactory is not under the caller before creating the resource.
// This enforces high-level requirement 2:
 include CreateAggregatorInternalAbortsIf;
-ensures aggregator::spec_get_limit(result) == limit;
+ensures aggregator::spec_get_limit(result) == MAX_U128;
 ensures aggregator::spec_aggregator_get_val(result) == 0;
 
@@ -309,7 +335,8 @@ AggregatorFactory is not under the caller before creating the resource. ### Function `create_aggregator` -
public fun create_aggregator(account: &signer, limit: u128): aggregator::Aggregator
+
#[deprecated]
+public fun create_aggregator(account: &signer, limit: u128): aggregator::Aggregator
 
@@ -320,6 +347,7 @@ AggregatorFactory existed under the @aptos_framework when Creating a new aggrega
let addr = signer::address_of(account);
 // This enforces high-level requirement 3:
 aborts_if addr != @aptos_framework;
+aborts_if limit != MAX_U128;
 aborts_if !exists<AggregatorFactory>(@aptos_framework);
 
diff --git a/aptos-move/framework/aptos-framework/doc/aptos_account.md b/aptos-move/framework/aptos-framework/doc/aptos_account.md index 5ae53dbe92683..4777da7049787 100644 --- a/aptos-move/framework/aptos-framework/doc/aptos_account.md +++ b/aptos-move/framework/aptos-framework/doc/aptos_account.md @@ -15,6 +15,9 @@ - [Function `batch_transfer_coins`](#0x1_aptos_account_batch_transfer_coins) - [Function `transfer_coins`](#0x1_aptos_account_transfer_coins) - [Function `deposit_coins`](#0x1_aptos_account_deposit_coins) +- [Function `batch_transfer_fungible_assets`](#0x1_aptos_account_batch_transfer_fungible_assets) +- [Function `transfer_fungible_assets`](#0x1_aptos_account_transfer_fungible_assets) +- [Function `deposit_fungible_assets`](#0x1_aptos_account_deposit_fungible_assets) - [Function `assert_account_exists`](#0x1_aptos_account_assert_account_exists) - [Function `assert_account_is_registered_for_apt`](#0x1_aptos_account_assert_account_is_registered_for_apt) - [Function `set_allow_direct_coin_transfers`](#0x1_aptos_account_set_allow_direct_coin_transfers) @@ -34,6 +37,9 @@ - [Function `batch_transfer_coins`](#@Specification_1_batch_transfer_coins) - [Function `transfer_coins`](#@Specification_1_transfer_coins) - [Function `deposit_coins`](#@Specification_1_deposit_coins) + - [Function `batch_transfer_fungible_assets`](#@Specification_1_batch_transfer_fungible_assets) + - [Function `transfer_fungible_assets`](#@Specification_1_transfer_fungible_assets) + - [Function `deposit_fungible_assets`](#@Specification_1_deposit_fungible_assets) - [Function `assert_account_exists`](#@Specification_1_assert_account_exists) - [Function `assert_account_is_registered_for_apt`](#@Specification_1_assert_account_is_registered_for_apt) - [Function `set_allow_direct_coin_transfers`](#@Specification_1_set_allow_direct_coin_transfers) @@ -411,6 +417,100 @@ This would create the recipient account first and register it to receive the Coi + + + + +## Function `batch_transfer_fungible_assets` + +Batch version of transfer_fungible_assets. + + +
public entry fun batch_transfer_fungible_assets(from: &signer, metadata: object::Object<fungible_asset::Metadata>, recipients: vector<address>, amounts: vector<u64>)
+
+ + + +
+Implementation + + +
public entry fun batch_transfer_fungible_assets(
+    from: &signer,
+    metadata: Object<Metadata>,
+    recipients: vector<address>,
+    amounts: vector<u64>
+) {
+    let recipients_len = vector::length(&recipients);
+    assert!(
+        recipients_len == vector::length(&amounts),
+        error::invalid_argument(EMISMATCHING_RECIPIENTS_AND_AMOUNTS_LENGTH),
+    );
+
+    vector::enumerate_ref(&recipients, |i, to| {
+        let amount = *vector::borrow(&amounts, i);
+        transfer_fungible_assets(from, metadata, *to, amount);
+    });
+}
+
+ + + +
+ + + +## Function `transfer_fungible_assets` + +Convenient function to deposit fungible asset into a recipient account that might not exist. +This would create the recipient account first to receive the fungible assets. + + +
public entry fun transfer_fungible_assets(from: &signer, metadata: object::Object<fungible_asset::Metadata>, to: address, amount: u64)
+
+ + + +
+Implementation + + +
public entry fun transfer_fungible_assets(from: &signer, metadata: Object<Metadata>, to: address, amount: u64) {
+    deposit_fungible_assets(to, primary_fungible_store::withdraw(from, metadata, amount));
+}
+
+ + + +
+ + + +## Function `deposit_fungible_assets` + +Convenient function to deposit fungible asset into a recipient account that might not exist. +This would create the recipient account first to receive the fungible assets. + + +
public fun deposit_fungible_assets(to: address, fa: fungible_asset::FungibleAsset)
+
+ + + +
+Implementation + + +
public fun deposit_fungible_assets(to: address, fa: FungibleAsset) {
+    if (!account::exists_at(to)) {
+        create_account(to);
+    };
+    primary_fungible_store::deposit(to, fa)
+}
+
+ + +
@@ -1024,6 +1124,54 @@ Limit the address of auth_key is not @vm_reserved / @aptos_framework / @aptos_to + + +### Function `batch_transfer_fungible_assets` + + +
public entry fun batch_transfer_fungible_assets(from: &signer, metadata: object::Object<fungible_asset::Metadata>, recipients: vector<address>, amounts: vector<u64>)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `transfer_fungible_assets` + + +
public entry fun transfer_fungible_assets(from: &signer, metadata: object::Object<fungible_asset::Metadata>, to: address, amount: u64)
+
+ + + + +
pragma verify = false;
+
+ + + + + +### Function `deposit_fungible_assets` + + +
public fun deposit_fungible_assets(to: address, fa: fungible_asset::FungibleAsset)
+
+ + + + +
pragma verify = false;
+
+ + + ### Function `assert_account_exists` diff --git a/aptos-move/framework/aptos-framework/doc/coin.md b/aptos-move/framework/aptos-framework/doc/coin.md index 1754c634bec8a..273f2a2f3e1f0 100644 --- a/aptos-move/framework/aptos-framework/doc/coin.md +++ b/aptos-move/framework/aptos-framework/doc/coin.md @@ -53,7 +53,6 @@ This module provides the foundation for typesafe Coins. - [Function `convert_and_take_paired_burn_ref`](#0x1_coin_convert_and_take_paired_burn_ref) - [Function `return_paired_burn_ref`](#0x1_coin_return_paired_burn_ref) - [Function `borrow_paired_burn_ref`](#0x1_coin_borrow_paired_burn_ref) -- [Function `initialize_supply_config`](#0x1_coin_initialize_supply_config) - [Function `allow_supply_upgrades`](#0x1_coin_allow_supply_upgrades) - [Function `calculate_amount_to_withdraw`](#0x1_coin_calculate_amount_to_withdraw) - [Function `maybe_convert_to_fungible_store`](#0x1_coin_maybe_convert_to_fungible_store) @@ -102,7 +101,6 @@ This module provides the foundation for typesafe Coins. - [Struct `AggregatableCoin`](#@Specification_1_AggregatableCoin) - [Function `coin_to_fungible_asset`](#@Specification_1_coin_to_fungible_asset) - [Function `fungible_asset_to_coin`](#@Specification_1_fungible_asset_to_coin) - - [Function `initialize_supply_config`](#@Specification_1_initialize_supply_config) - [Function `allow_supply_upgrades`](#@Specification_1_allow_supply_upgrades) - [Function `maybe_convert_to_fungible_store`](#@Specification_1_maybe_convert_to_fungible_store) - [Function `coin_address`](#@Specification_1_coin_address) @@ -270,7 +268,8 @@ Configuration that controls the behavior of total coin supply. If the field is set, coin creators are allowed to upgrade to parallelizable implementations. -
struct SupplyConfig has key
+
#[deprecated]
+struct SupplyConfig has key
 
@@ -988,16 +987,6 @@ Maximum possible aggregatable coin value. - - -Maximum possible coin supply. - - -
const MAX_U128: u128 = 340282366920938463463374607431768211455;
-
- - - Not enough coins to complete transaction @@ -1959,32 +1948,6 @@ Return the BurnRef with the hot potato receipt. - - - - -## Function `initialize_supply_config` - -Publishes supply configuration. Initially, upgrading is not allowed. - - -
public(friend) fun initialize_supply_config(aptos_framework: &signer)
-
- - - -
-Implementation - - -
public(friend) fun initialize_supply_config(aptos_framework: &signer) {
-    system_addresses::assert_aptos_framework(aptos_framework);
-    move_to(aptos_framework, SupplyConfig { allow_upgrades: false });
-}
-
- - -
@@ -1995,7 +1958,7 @@ This should be called by on-chain governance to update the config and allow or disallow upgradability of total supply. -
public fun allow_supply_upgrades(aptos_framework: &signer, allowed: bool)
+
public fun allow_supply_upgrades(_aptos_framework: &signer, _allowed: bool)
 
@@ -2004,10 +1967,8 @@ or disallow upgradability of total supply. Implementation -
public fun allow_supply_upgrades(aptos_framework: &signer, allowed: bool) acquires SupplyConfig {
-    system_addresses::assert_aptos_framework(aptos_framework);
-    let allow_upgrades = &mut borrow_global_mut<SupplyConfig>(@aptos_framework).allow_upgrades;
-    *allow_upgrades = allowed;
+
public fun allow_supply_upgrades(_aptos_framework: &signer, _allowed: bool) {
+    abort error::invalid_state(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED)
 }
 
@@ -2886,7 +2847,7 @@ Upgrade total supply to use a parallelizable implementation if it is available. -
public entry fun upgrade_supply<CoinType>(account: &signer)
+
public entry fun upgrade_supply<CoinType>(_account: &signer)
 
@@ -2895,30 +2856,8 @@ available. Implementation -
public entry fun upgrade_supply<CoinType>(account: &signer) acquires CoinInfo, SupplyConfig {
-    let account_addr = signer::address_of(account);
-
-    // Only coin creators can upgrade total supply.
-    assert!(
-        coin_address<CoinType>() == account_addr,
-        error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH),
-    );
-
-    // Can only succeed once on-chain governance agreed on the upgrade.
-    assert!(
-        borrow_global<SupplyConfig>(@aptos_framework).allow_upgrades,
-        error::permission_denied(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED)
-    );
-
-    let maybe_supply = &mut borrow_global_mut<CoinInfo<CoinType>>(account_addr).supply;
-    if (option::is_some(maybe_supply)) {
-        let supply = option::borrow_mut(maybe_supply);
-
-        // If supply is tracked and the current implementation uses an integer - upgrade.
-        if (!optional_aggregator::is_parallelizable(supply)) {
-            optional_aggregator::switch(supply);
-        }
-    }
+
public entry fun upgrade_supply<CoinType>(_account: &signer) {
+    abort error::invalid_state(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED)
 }
 
@@ -3035,7 +2974,7 @@ Same as initialize but supply can be initialized to parallelizable decimals, supply: if (monitor_supply) { option::some( - optional_aggregator::new(MAX_U128, parallelizable) + optional_aggregator::new(parallelizable) ) } else { option::none() }, }; @@ -3682,46 +3621,19 @@ initialize, initialize_internal, initialize_with_parallelizable_supply; - - -### Function `initialize_supply_config` - - -
public(friend) fun initialize_supply_config(aptos_framework: &signer)
-
- - -Can only be initialized once. -Can only be published by reserved addresses. - - -
let aptos_addr = signer::address_of(aptos_framework);
-aborts_if !system_addresses::is_aptos_framework_address(aptos_addr);
-aborts_if exists<SupplyConfig>(aptos_addr);
-ensures !global<SupplyConfig>(aptos_addr).allow_upgrades;
-ensures exists<SupplyConfig>(aptos_addr);
-
- - - ### Function `allow_supply_upgrades` -
public fun allow_supply_upgrades(aptos_framework: &signer, allowed: bool)
+
public fun allow_supply_upgrades(_aptos_framework: &signer, _allowed: bool)
 
Can only be updated by @aptos_framework. -
modifies global<SupplyConfig>(@aptos_framework);
-let aptos_addr = signer::address_of(aptos_framework);
-aborts_if !system_addresses::is_aptos_framework_address(aptos_addr);
-aborts_if !exists<SupplyConfig>(aptos_addr);
-let post allow_upgrades_post = global<SupplyConfig>(@aptos_framework);
-ensures allow_upgrades_post.allow_upgrades == allowed;
+
aborts_if true;
 
@@ -4226,7 +4138,7 @@ The value of zero_coin must be 0. ### Function `upgrade_supply` -
public entry fun upgrade_supply<CoinType>(account: &signer)
+
public entry fun upgrade_supply<CoinType>(_account: &signer)
 
@@ -4234,26 +4146,7 @@ The creator of CoinType must be @aptos_framework. SupplyConfig allow upgrade. -
let account_addr = signer::address_of(account);
-let coin_address = type_info::type_of<CoinType>().account_address;
-aborts_if coin_address != account_addr;
-aborts_if !exists<SupplyConfig>(@aptos_framework);
-// This enforces high-level requirement 1:
-aborts_if !exists<CoinInfo<CoinType>>(account_addr);
-let supply_config = global<SupplyConfig>(@aptos_framework);
-aborts_if !supply_config.allow_upgrades;
-modifies global<CoinInfo<CoinType>>(account_addr);
-let maybe_supply = global<CoinInfo<CoinType>>(account_addr).supply;
-let supply = option::spec_borrow(maybe_supply);
-let value = optional_aggregator::optional_aggregator_value(supply);
-let post post_maybe_supply = global<CoinInfo<CoinType>>(account_addr).supply;
-let post post_supply = option::spec_borrow(post_maybe_supply);
-let post post_value = optional_aggregator::optional_aggregator_value(post_supply);
-let supply_no_parallel = option::spec_is_some(maybe_supply) &&
-    !optional_aggregator::is_parallelizable(supply);
-aborts_if supply_no_parallel && !exists<aggregator_factory::AggregatorFactory>(@aptos_framework);
-ensures supply_no_parallel ==>
-    optional_aggregator::is_parallelizable(post_supply) && post_value == value;
+
aborts_if true;
 
@@ -4353,7 +4246,7 @@ Only the creator of CoinType can initialize. && coin_info.symbol == symbol && coin_info.decimals == decimals; ensures if (monitor_supply) { - value == 0 && limit == MAX_U128 + value == 0 && limit == MAX_U128 && (parallelizable == optional_aggregator::is_parallelizable(supply)) } else { option::spec_is_none(coin_info.supply) diff --git a/aptos-move/framework/aptos-framework/doc/genesis.md b/aptos-move/framework/aptos-framework/doc/genesis.md index e767985fbd881..4df4a2f99b301 100644 --- a/aptos-move/framework/aptos-framework/doc/genesis.md +++ b/aptos-move/framework/aptos-framework/doc/genesis.md @@ -358,7 +358,6 @@ Genesis step 1: Initialize aptos framework account and core modules on chain. // Ensure we can create aggregators for supply, but not enable it for common use just yet. aggregator_factory::initialize_aggregator_factory(&aptos_framework_account); - coin::initialize_supply_config(&aptos_framework_account); chain_id::initialize(&aptos_framework_account, chain_id); reconfiguration::initialize(&aptos_framework_account); diff --git a/aptos-move/framework/aptos-framework/doc/optional_aggregator.md b/aptos-move/framework/aptos-framework/doc/optional_aggregator.md index 309ee697c2448..10ece6b6de997 100644 --- a/aptos-move/framework/aptos-framework/doc/optional_aggregator.md +++ b/aptos-move/framework/aptos-framework/doc/optional_aggregator.md @@ -18,9 +18,6 @@ aggregator (parallelizable) or via normal integers. - [Function `destroy_integer`](#0x1_optional_aggregator_destroy_integer) - [Function `new`](#0x1_optional_aggregator_new) - [Function `switch`](#0x1_optional_aggregator_switch) -- [Function `switch_and_zero_out`](#0x1_optional_aggregator_switch_and_zero_out) -- [Function `switch_to_integer_and_zero_out`](#0x1_optional_aggregator_switch_to_integer_and_zero_out) -- [Function `switch_to_aggregator_and_zero_out`](#0x1_optional_aggregator_switch_to_aggregator_and_zero_out) - [Function `destroy`](#0x1_optional_aggregator_destroy) - [Function `destroy_optional_aggregator`](#0x1_optional_aggregator_destroy_optional_aggregator) - [Function `destroy_optional_integer`](#0x1_optional_aggregator_destroy_optional_integer) @@ -40,9 +37,6 @@ aggregator (parallelizable) or via normal integers. - [Function `destroy_integer`](#@Specification_1_destroy_integer) - [Function `new`](#@Specification_1_new) - [Function `switch`](#@Specification_1_switch) - - [Function `switch_and_zero_out`](#@Specification_1_switch_and_zero_out) - - [Function `switch_to_integer_and_zero_out`](#@Specification_1_switch_to_integer_and_zero_out) - - [Function `switch_to_aggregator_and_zero_out`](#@Specification_1_switch_to_aggregator_and_zero_out) - [Function `destroy`](#@Specification_1_destroy) - [Function `destroy_optional_aggregator`](#@Specification_1_destroy_optional_aggregator) - [Function `destroy_optional_integer`](#@Specification_1_destroy_optional_integer) @@ -132,6 +126,15 @@ Contains either an aggregator or a normal integer, both overflowing on limit. ## Constants + + + + +
const MAX_U128: u128 = 340282366920938463463374607431768211455;
+
+ + + The value of aggregator underflows (goes below zero). Raised by native code. @@ -152,6 +155,16 @@ Aggregator feature is not supported. Raised by native code. + + +OptionalAggregator (Agg V1) switch not supported any more. + + +
const ESWITCH_DEPRECATED: u64 = 3;
+
+ + + ## Function `new_integer` @@ -317,7 +330,7 @@ Destroys an integer. Creates a new optional aggregator. -
public(friend) fun new(limit: u128, parallelizable: bool): optional_aggregator::OptionalAggregator
+
public(friend) fun new(parallelizable: bool): optional_aggregator::OptionalAggregator
 
@@ -326,16 +339,16 @@ Creates a new optional aggregator. Implementation -
public(friend) fun new(limit: u128, parallelizable: bool): OptionalAggregator {
+
public(friend) fun new(parallelizable: bool): OptionalAggregator {
     if (parallelizable) {
         OptionalAggregator {
-            aggregator: option::some(aggregator_factory::create_aggregator_internal(limit)),
+            aggregator: option::some(aggregator_factory::create_aggregator_internal()),
             integer: option::none(),
         }
     } else {
         OptionalAggregator {
             aggregator: option::none(),
-            integer: option::some(new_integer(limit)),
+            integer: option::some(new_integer(MAX_U128)),
         }
     }
 }
@@ -352,7 +365,7 @@ Creates a new optional aggregator.
 Switches between parallelizable and non-parallelizable implementations.
 
 
-
public fun switch(optional_aggregator: &mut optional_aggregator::OptionalAggregator)
+
public fun switch(_optional_aggregator: &mut optional_aggregator::OptionalAggregator)
 
@@ -361,106 +374,8 @@ Switches between parallelizable and non-parallelizable implementations. Implementation -
public fun switch(optional_aggregator: &mut OptionalAggregator) {
-    let value = read(optional_aggregator);
-    switch_and_zero_out(optional_aggregator);
-    add(optional_aggregator, value);
-}
-
- - - - - - - -## Function `switch_and_zero_out` - -Switches between parallelizable and non-parallelizable implementations, setting -the value of the new optional aggregator to zero. - - -
fun switch_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator)
-
- - - -
-Implementation - - -
fun switch_and_zero_out(optional_aggregator: &mut OptionalAggregator) {
-    if (is_parallelizable(optional_aggregator)) {
-        switch_to_integer_and_zero_out(optional_aggregator);
-    } else {
-        switch_to_aggregator_and_zero_out(optional_aggregator);
-    }
-}
-
- - - -
- - - -## Function `switch_to_integer_and_zero_out` - -Switches from parallelizable to non-parallelizable implementation, zero-initializing -the value. - - -
fun switch_to_integer_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator): u128
-
- - - -
-Implementation - - -
fun switch_to_integer_and_zero_out(
-    optional_aggregator: &mut OptionalAggregator
-): u128 {
-    let aggregator = option::extract(&mut optional_aggregator.aggregator);
-    let limit = aggregator::limit(&aggregator);
-    aggregator::destroy(aggregator);
-    let integer = new_integer(limit);
-    option::fill(&mut optional_aggregator.integer, integer);
-    limit
-}
-
- - - -
- - - -## Function `switch_to_aggregator_and_zero_out` - -Switches from non-parallelizable to parallelizable implementation, zero-initializing -the value. - - -
fun switch_to_aggregator_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator): u128
-
- - - -
-Implementation - - -
fun switch_to_aggregator_and_zero_out(
-    optional_aggregator: &mut OptionalAggregator
-): u128 {
-    let integer = option::extract(&mut optional_aggregator.integer);
-    let limit = limit(&integer);
-    destroy_integer(integer);
-    let aggregator = aggregator_factory::create_aggregator_internal(limit);
-    option::fill(&mut optional_aggregator.aggregator, aggregator);
-    limit
+
public fun switch(_optional_aggregator: &mut OptionalAggregator) {
+    abort error::invalid_state(ESWITCH_DEPRECATED)
 }
 
@@ -796,7 +711,7 @@ Check for overflow.
aborts_if value > (integer.limit - integer.value);
-aborts_if integer.value + value > MAX_U128;
+aborts_if integer.value + value > MAX_U128;
 ensures integer.value <= integer.limit;
 ensures integer.value == old(integer.value) + value;
 
@@ -876,7 +791,7 @@ Check for overflow. ### Function `new` -
public(friend) fun new(limit: u128, parallelizable: bool): optional_aggregator::OptionalAggregator
+
public(friend) fun new(parallelizable: bool): optional_aggregator::OptionalAggregator
 
@@ -896,89 +811,13 @@ Check for overflow. ### Function `switch` -
public fun switch(optional_aggregator: &mut optional_aggregator::OptionalAggregator)
-
- - - - -
let vec_ref = optional_aggregator.integer.vec;
-aborts_if is_parallelizable(optional_aggregator) && len(vec_ref) != 0;
-aborts_if !is_parallelizable(optional_aggregator) && len(vec_ref) == 0;
-aborts_if !is_parallelizable(optional_aggregator) && !exists<aggregator_factory::AggregatorFactory>(@aptos_framework);
-ensures optional_aggregator_value(optional_aggregator) == optional_aggregator_value(old(optional_aggregator));
-
- - - - - -### Function `switch_and_zero_out` - - -
fun switch_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator)
-
- - -Option does not exist When Option exists. -Option exists when Option does not exist. -The AggregatorFactory is under the @aptos_framework when Option does not exist. - - -
let vec_ref = optional_aggregator.integer.vec;
-aborts_if is_parallelizable(optional_aggregator) && len(vec_ref) != 0;
-aborts_if !is_parallelizable(optional_aggregator) && len(vec_ref) == 0;
-aborts_if !is_parallelizable(optional_aggregator) && !exists<aggregator_factory::AggregatorFactory>(@aptos_framework);
-// This enforces high-level requirement 3:
-ensures is_parallelizable(old(optional_aggregator)) ==> !is_parallelizable(optional_aggregator);
-ensures !is_parallelizable(old(optional_aggregator)) ==> is_parallelizable(optional_aggregator);
-ensures optional_aggregator_value(optional_aggregator) == 0;
-
- - - - - -### Function `switch_to_integer_and_zero_out` - - -
fun switch_to_integer_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator): u128
+
public fun switch(_optional_aggregator: &mut optional_aggregator::OptionalAggregator)
 
-The aggregator exists and the integer dosex not exist when Switches from parallelizable to non-parallelizable implementation. -
let limit = aggregator::spec_get_limit(option::borrow(optional_aggregator.aggregator));
-aborts_if len(optional_aggregator.aggregator.vec) == 0;
-aborts_if len(optional_aggregator.integer.vec) != 0;
-ensures !is_parallelizable(optional_aggregator);
-ensures option::borrow(optional_aggregator.integer).limit == limit;
-ensures option::borrow(optional_aggregator.integer).value == 0;
-
- - - - - -### Function `switch_to_aggregator_and_zero_out` - - -
fun switch_to_aggregator_and_zero_out(optional_aggregator: &mut optional_aggregator::OptionalAggregator): u128
-
- - -The integer exists and the aggregator does not exist when Switches from non-parallelizable to parallelizable implementation. -The AggregatorFactory is under the @aptos_framework. - - -
let limit = option::borrow(optional_aggregator.integer).limit;
-aborts_if len(optional_aggregator.integer.vec) == 0;
-aborts_if !exists<aggregator_factory::AggregatorFactory>(@aptos_framework);
-aborts_if len(optional_aggregator.aggregator.vec) != 0;
-ensures is_parallelizable(optional_aggregator);
-ensures aggregator::spec_get_limit(option::borrow(optional_aggregator.aggregator)) == limit;
-ensures aggregator::spec_aggregator_get_val(option::borrow(optional_aggregator.aggregator)) == 0;
+
aborts_if true;
 
@@ -1095,9 +934,9 @@ The integer exists and the aggregator does not exist when destroy the integer. aborts_if is_parallelizable(optional_aggregator) && (aggregator::spec_aggregator_get_val(option::borrow(optional_aggregator.aggregator)) + value > aggregator::spec_get_limit(option::borrow(optional_aggregator.aggregator))); aborts_if is_parallelizable(optional_aggregator) && (aggregator::spec_aggregator_get_val(option::borrow(optional_aggregator.aggregator)) - + value > MAX_U128); + + value > MAX_U128); aborts_if !is_parallelizable(optional_aggregator) && - (option::borrow(optional_aggregator.integer).value + value > MAX_U128); + (option::borrow(optional_aggregator.integer).value + value > MAX_U128); aborts_if !is_parallelizable(optional_aggregator) && (value > (option::borrow(optional_aggregator.integer).limit - option::borrow(optional_aggregator.integer).value)); } diff --git a/aptos-move/framework/aptos-framework/doc/randomness.md b/aptos-move/framework/aptos-framework/doc/randomness.md index 729012327c81d..fa210cfb1023a 100644 --- a/aptos-move/framework/aptos-framework/doc/randomness.md +++ b/aptos-move/framework/aptos-framework/doc/randomness.md @@ -290,7 +290,7 @@ of the hash function). let seed = *option::borrow(&randomness.seed); vector::append(&mut input, seed); - vector::append(&mut input, transaction_context::unique_session_hash()); + vector::append(&mut input, transaction_context::get_transaction_hash()); vector::append(&mut input, fetch_and_increment_txn_counter()); hash::sha3_256(input) } diff --git a/aptos-move/framework/aptos-framework/doc/transaction_context.md b/aptos-move/framework/aptos-framework/doc/transaction_context.md index 9449934a41c2c..cc7d9010ffc74 100644 --- a/aptos-move/framework/aptos-framework/doc/transaction_context.md +++ b/aptos-move/framework/aptos-framework/doc/transaction_context.md @@ -9,9 +9,8 @@ - [Struct `EntryFunctionPayload`](#0x1_transaction_context_EntryFunctionPayload) - [Struct `MultisigPayload`](#0x1_transaction_context_MultisigPayload) - [Constants](#@Constants_0) -- [Function `unique_session_hash`](#0x1_transaction_context_unique_session_hash) -- [Function `get_transaction_hash`](#0x1_transaction_context_get_transaction_hash) - [Function `get_txn_hash`](#0x1_transaction_context_get_txn_hash) +- [Function `get_transaction_hash`](#0x1_transaction_context_get_transaction_hash) - [Function `generate_unique_address`](#0x1_transaction_context_generate_unique_address) - [Function `generate_auid_address`](#0x1_transaction_context_generate_auid_address) - [Function `get_script_hash`](#0x1_transaction_context_get_script_hash) @@ -40,12 +39,9 @@ - [Function `multisig_payload_internal`](#0x1_transaction_context_multisig_payload_internal) - [Function `multisig_address`](#0x1_transaction_context_multisig_address) - [Function `inner_entry_function_payload`](#0x1_transaction_context_inner_entry_function_payload) -- [Function `raw_transaction_hash`](#0x1_transaction_context_raw_transaction_hash) -- [Function `raw_transaction_hash_internal`](#0x1_transaction_context_raw_transaction_hash_internal) - [Specification](#@Specification_1) - - [Function `unique_session_hash`](#@Specification_1_unique_session_hash) - - [Function `get_transaction_hash`](#@Specification_1_get_transaction_hash) - [Function `get_txn_hash`](#@Specification_1_get_txn_hash) + - [Function `get_transaction_hash`](#@Specification_1_get_transaction_hash) - [Function `generate_unique_address`](#@Specification_1_generate_unique_address) - [Function `generate_auid_address`](#@Specification_1_generate_auid_address) - [Function `get_script_hash`](#@Specification_1_get_script_hash) @@ -60,7 +56,6 @@ - [Function `chain_id_internal`](#@Specification_1_chain_id_internal) - [Function `entry_function_payload_internal`](#@Specification_1_entry_function_payload_internal) - [Function `multisig_payload_internal`](#@Specification_1_multisig_payload_internal) - - [Function `raw_transaction_hash_internal`](#@Specification_1_raw_transaction_hash_internal)
use 0x1::error;
@@ -201,16 +196,6 @@ The transaction context extension feature is not enabled.
 
 
 
-
-
-The transaction context hash function update feature is not enabled.
-
-
-
const ETRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE_NOT_ENABLED: u64 = 3;
-
- - - Transaction context is only available in the user transaction prologue, execution, or epilogue phases. @@ -221,15 +206,14 @@ Transaction context is only available in the user transaction prologue, executio - + -## Function `unique_session_hash` +## Function `get_txn_hash` -Returns a unique session hash, ensuring a distinct value for each transaction -session: prologue, execution, epilogue. +Returns the transaction hash of the current transaction. -
public fun unique_session_hash(): vector<u8>
+
fun get_txn_hash(): vector<u8>
 
@@ -238,9 +222,7 @@ session: prologue, execution, epilogue. Implementation -
public fun unique_session_hash(): vector<u8> {
-    get_txn_hash()
-}
+
native fun get_txn_hash(): vector<u8>;
 
@@ -251,10 +233,12 @@ session: prologue, execution, epilogue. ## Function `get_transaction_hash` +Returns the transaction hash of the current transaction. +Internally calls the private function get_txn_hash. +This function is created for to feature gate the get_txn_hash function. -
#[deprecated]
-public fun get_transaction_hash(): vector<u8>
+
public fun get_transaction_hash(): vector<u8>
 
@@ -270,28 +254,6 @@ session: prologue, execution, epilogue. -
- - - -## Function `get_txn_hash` - - - -
fun get_txn_hash(): vector<u8>
-
- - - -
-Implementation - - -
native fun get_txn_hash(): vector<u8>;
-
- - -
@@ -1001,56 +963,6 @@ Returns the inner entry function payload of the multisig payload. - - - - -## Function `raw_transaction_hash` - -Returns the hash of the current raw transaction, which is used for transaction authentication. -This function calls an internal native function to retrieve the raw transaction hash. -In the case of a fee payer transaction, the hash value is generated using 0x0 as the fee payer address. - - -
public fun raw_transaction_hash(): vector<u8>
-
- - - -
-Implementation - - -
public fun raw_transaction_hash(): vector<u8> {
-    assert!(features::transaction_context_hash_function_update_enabled(), error::invalid_state(ETRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE_NOT_ENABLED));
-    raw_transaction_hash_internal()
-}
-
- - - -
- - - -## Function `raw_transaction_hash_internal` - - - -
fun raw_transaction_hash_internal(): vector<u8>
-
- - - -
-Implementation - - -
native fun raw_transaction_hash_internal(): vector<u8>;
-
- - -
@@ -1058,61 +970,49 @@ In the case of a fee payer transaction, the hash value is generated using 0x0 as ## Specification - + -### Function `unique_session_hash` +### Function `get_txn_hash` -
public fun unique_session_hash(): vector<u8>
+
fun get_txn_hash(): vector<u8>
 
pragma opaque;
-aborts_if false;
+aborts_if [abstract] false;
 ensures result == spec_get_txn_hash();
-ensures len(result) == 32;
 
- - -### Function `get_transaction_hash` - - -
#[deprecated]
-public fun get_transaction_hash(): vector<u8>
-
- + -
pragma opaque;
-aborts_if false;
-ensures result == spec_get_txn_hash();
-ensures len(result) == 32;
+
fun spec_get_txn_hash(): vector<u8>;
 
- + -### Function `get_txn_hash` +### Function `get_transaction_hash` -
fun get_txn_hash(): vector<u8>
+
public fun get_transaction_hash(): vector<u8>
 
pragma opaque;
-aborts_if false;
+aborts_if [abstract] false;
 ensures result == spec_get_txn_hash();
 // This enforces high-level requirement 1:
-ensures len(result) == 32;
+ensures [abstract] len(result) == 32;
 
@@ -1184,9 +1084,9 @@ In the case of a fee payer transaction, the hash value is generated using 0x0 as 1 -Fetching the unique session hash should return a vector with 32 bytes. +Fetching the transaction hash should return a vector with 32 bytes. Medium -The unique_session_hash function calls the native function unique_session_hash_internal, which fetches the NativeTransactionContext struct and returns the unique_session_hash field. +The get_transaction_hash function calls the native function get_txn_hash, which fetches the NativeTransactionContext struct and returns the txn_hash field. Audited that the native function returns the txn hash, whose size is 32 bytes. This has been modeled as the abstract postcondition that the returned vector is of length 32. Formally verified via get_txn_hash. @@ -1241,15 +1141,6 @@ In the case of a fee payer transaction, the hash value is generated using 0x0 as - - - - -
fun spec_get_txn_hash(): vector<u8>;
-
- - - ### Function `auid_address` @@ -1390,22 +1281,6 @@ In the case of a fee payer transaction, the hash value is generated using 0x0 as -
pragma opaque;
-
- - - - - -### Function `raw_transaction_hash_internal` - - -
fun raw_transaction_hash_internal(): vector<u8>
-
- - - -
pragma opaque;
 
diff --git a/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.move b/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.move index 7ec4dad805e2a..c7192e646d900 100644 --- a/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.move +++ b/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.move @@ -16,6 +16,11 @@ module aptos_framework::aggregator_factory { /// Aggregator factory is not published yet. const EAGGREGATOR_FACTORY_NOT_FOUND: u64 = 1; + /// Aggregator V1 only supports limit == MAX_U128. + const EAGG_V1_LIMIT_DEPRECATED: u64 = 2; + + const MAX_U128: u128 = 340282366920938463463374607431768211455; + /// Creates new aggregators. Used to control the numbers of aggregators in the /// system and who can create them. At the moment, only Aptos Framework (0x1) /// account can. @@ -33,27 +38,39 @@ module aptos_framework::aggregator_factory { } /// Creates a new aggregator instance which overflows on exceeding a `limit`. - public(friend) fun create_aggregator_internal(limit: u128): Aggregator acquires AggregatorFactory { + public(friend) fun create_aggregator_internal(): Aggregator acquires AggregatorFactory { assert!( exists(@aptos_framework), error::not_found(EAGGREGATOR_FACTORY_NOT_FOUND) ); let aggregator_factory = borrow_global_mut(@aptos_framework); - new_aggregator(aggregator_factory, limit) + new_aggregator(aggregator_factory, MAX_U128) } + #[deprecated] /// This is currently a function closed for public. This can be updated in the future by on-chain governance /// to allow any signer to call. public fun create_aggregator(account: &signer, limit: u128): Aggregator acquires AggregatorFactory { + // deprecated. Currently used only in aptos-move/e2e-move-tests/src/tests/aggregator.data/pack/sources/aggregator_test.move + // Only Aptos Framework (0x1) account can call this for now. system_addresses::assert_aptos_framework(account); - create_aggregator_internal(limit) + assert!( + limit == MAX_U128, + error::invalid_argument(EAGG_V1_LIMIT_DEPRECATED) + ); + create_aggregator_internal() } /// Returns a new aggregator. native fun new_aggregator(aggregator_factory: &mut AggregatorFactory, limit: u128): Aggregator; + #[test_only] + public fun create_aggregator_for_test(): Aggregator acquires AggregatorFactory { + create_aggregator_internal() + } + #[test_only] public fun initialize_aggregator_factory_for_test(aptos_framework: &signer) { initialize_aggregator_factory(aptos_framework); diff --git a/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.spec.move b/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.spec.move index 9ffe7a78d2dde..7606e54d49dc0 100644 --- a/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.spec.move +++ b/aptos-move/framework/aptos-framework/sources/aggregator/aggregator_factory.spec.move @@ -54,10 +54,10 @@ spec aptos_framework::aggregator_factory { ensures exists(addr); } - spec create_aggregator_internal(limit: u128): Aggregator { + spec create_aggregator_internal(): Aggregator { /// [high-level-req-2] include CreateAggregatorInternalAbortsIf; - ensures aggregator::spec_get_limit(result) == limit; + ensures aggregator::spec_get_limit(result) == MAX_U128; ensures aggregator::spec_aggregator_get_val(result) == 0; } spec schema CreateAggregatorInternalAbortsIf { @@ -71,6 +71,7 @@ spec aptos_framework::aggregator_factory { let addr = signer::address_of(account); /// [high-level-req-3] aborts_if addr != @aptos_framework; + aborts_if limit != MAX_U128; aborts_if !exists(@aptos_framework); } diff --git a/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.move b/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.move index f3a545600edbc..a5d9794862c52 100644 --- a/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.move +++ b/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.move @@ -16,6 +16,11 @@ module aptos_framework::optional_aggregator { /// Aggregator feature is not supported. Raised by native code. const EAGGREGATOR_UNDERFLOW: u64 = 2; + /// OptionalAggregator (Agg V1) switch not supported any more. + const ESWITCH_DEPRECATED: u64 = 3; + + const MAX_U128: u128 = 340282366920938463463374607431768211455; + /// Wrapper around integer with a custom overflow limit. Supports add, subtract and read just like `Aggregator`. struct Integer has store { value: u128, @@ -69,61 +74,23 @@ module aptos_framework::optional_aggregator { } /// Creates a new optional aggregator. - public(friend) fun new(limit: u128, parallelizable: bool): OptionalAggregator { + public(friend) fun new(parallelizable: bool): OptionalAggregator { if (parallelizable) { OptionalAggregator { - aggregator: option::some(aggregator_factory::create_aggregator_internal(limit)), + aggregator: option::some(aggregator_factory::create_aggregator_internal()), integer: option::none(), } } else { OptionalAggregator { aggregator: option::none(), - integer: option::some(new_integer(limit)), + integer: option::some(new_integer(MAX_U128)), } } } /// Switches between parallelizable and non-parallelizable implementations. - public fun switch(optional_aggregator: &mut OptionalAggregator) { - let value = read(optional_aggregator); - switch_and_zero_out(optional_aggregator); - add(optional_aggregator, value); - } - - /// Switches between parallelizable and non-parallelizable implementations, setting - /// the value of the new optional aggregator to zero. - fun switch_and_zero_out(optional_aggregator: &mut OptionalAggregator) { - if (is_parallelizable(optional_aggregator)) { - switch_to_integer_and_zero_out(optional_aggregator); - } else { - switch_to_aggregator_and_zero_out(optional_aggregator); - } - } - - /// Switches from parallelizable to non-parallelizable implementation, zero-initializing - /// the value. - fun switch_to_integer_and_zero_out( - optional_aggregator: &mut OptionalAggregator - ): u128 { - let aggregator = option::extract(&mut optional_aggregator.aggregator); - let limit = aggregator::limit(&aggregator); - aggregator::destroy(aggregator); - let integer = new_integer(limit); - option::fill(&mut optional_aggregator.integer, integer); - limit - } - - /// Switches from non-parallelizable to parallelizable implementation, zero-initializing - /// the value. - fun switch_to_aggregator_and_zero_out( - optional_aggregator: &mut OptionalAggregator - ): u128 { - let integer = option::extract(&mut optional_aggregator.integer); - let limit = limit(&integer); - destroy_integer(integer); - let aggregator = aggregator_factory::create_aggregator_internal(limit); - option::fill(&mut optional_aggregator.aggregator, aggregator); - limit + public fun switch(_optional_aggregator: &mut OptionalAggregator) { + abort error::invalid_state(ESWITCH_DEPRECATED) } /// Destroys optional aggregator. @@ -192,10 +159,19 @@ module aptos_framework::optional_aggregator { } #[test(account = @aptos_framework)] - fun optional_aggregator_test(account: signer) { + #[expected_failure(abort_code = 0x030003, location = Self)] + fun optional_aggregator_swith_fail_test(account: signer) { + aggregator_factory::initialize_aggregator_factory(&account); + let aggregator = new(true); + switch(&mut aggregator); + destroy(aggregator); + } + + #[test(account = @aptos_framework)] + fun optional_aggregator_test_integer(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(30, false); + let aggregator = new(false); assert!(!is_parallelizable(&aggregator), 0); add(&mut aggregator, 12); @@ -205,9 +181,27 @@ module aptos_framework::optional_aggregator { sub(&mut aggregator, 10); assert!(read(&aggregator) == 5, 0); - // Switch to parallelizable aggregator and check the value is preserved. - switch(&mut aggregator); + add(&mut aggregator, 12); + add(&mut aggregator, 3); + assert!(read(&aggregator) == 20, 0); + + sub(&mut aggregator, 10); + assert!(read(&aggregator) == 10, 0); + + destroy(aggregator); + } + + #[test(account = @aptos_framework)] + fun optional_aggregator_test_aggregator(account: signer) { + aggregator_factory::initialize_aggregator_factory(&account); + let aggregator = new(true); assert!(is_parallelizable(&aggregator), 0); + + add(&mut aggregator, 12); + add(&mut aggregator, 3); + assert!(read(&aggregator) == 15, 0); + + sub(&mut aggregator, 10); assert!(read(&aggregator) == 5, 0); add(&mut aggregator, 12); @@ -217,11 +211,6 @@ module aptos_framework::optional_aggregator { sub(&mut aggregator, 10); assert!(read(&aggregator) == 10, 0); - // Switch back! - switch(&mut aggregator); - assert!(!is_parallelizable(&aggregator), 0); - assert!(read(&aggregator) == 10, 0); - destroy(aggregator); } @@ -229,24 +218,25 @@ module aptos_framework::optional_aggregator { fun optional_aggregator_destroy_test(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(30, false); + let aggregator = new(false); destroy(aggregator); - let aggregator = new(30, true); + let aggregator = new(true); destroy(aggregator); - let aggregator = new(12, false); - assert!(destroy_optional_integer(aggregator) == 12, 0); + let aggregator = new(false); + assert!(destroy_optional_integer(aggregator) == MAX_U128, 0); - let aggregator = new(21, true); - assert!(destroy_optional_aggregator(aggregator) == 21, 0); + let aggregator = new(true); + assert!(destroy_optional_aggregator(aggregator) == MAX_U128, 0); } #[test(account = @aptos_framework)] #[expected_failure(abort_code = 0x020001, location = Self)] fun non_parallelizable_aggregator_overflow_test(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(15, false); + let aggregator = new(false); + add(&mut aggregator, MAX_U128 - 15); // Overflow! add(&mut aggregator, 16); @@ -258,7 +248,7 @@ module aptos_framework::optional_aggregator { #[expected_failure(abort_code = 0x020002, location = Self)] fun non_parallelizable_aggregator_underflow_test(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(100, false); + let aggregator = new(false); // Underflow! sub(&mut aggregator, 100); @@ -271,7 +261,8 @@ module aptos_framework::optional_aggregator { #[expected_failure(abort_code = 0x020001, location = aptos_framework::aggregator)] fun parallelizable_aggregator_overflow_test(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(15, true); + let aggregator = new(true); + add(&mut aggregator, MAX_U128 - 15); // Overflow! add(&mut aggregator, 16); @@ -283,7 +274,7 @@ module aptos_framework::optional_aggregator { #[expected_failure(abort_code = 0x020002, location = aptos_framework::aggregator)] fun parallelizable_aggregator_underflow_test(account: signer) { aggregator_factory::initialize_aggregator_factory(&account); - let aggregator = new(100, true); + let aggregator = new(true); // Underflow! add(&mut aggregator, 99); diff --git a/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.spec.move b/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.spec.move index bb8e29768447f..4a86db69d0ce7 100644 --- a/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.spec.move +++ b/aptos-move/framework/aptos-framework/sources/aggregator/optional_aggregator.spec.move @@ -105,12 +105,8 @@ spec aptos_framework::optional_aggregator { (value > (option::borrow(optional_aggregator.integer).limit - option::borrow(optional_aggregator.integer).value)); } - spec switch(optional_aggregator: &mut OptionalAggregator) { - let vec_ref = optional_aggregator.integer.vec; - aborts_if is_parallelizable(optional_aggregator) && len(vec_ref) != 0; - aborts_if !is_parallelizable(optional_aggregator) && len(vec_ref) == 0; - aborts_if !is_parallelizable(optional_aggregator) && !exists(@aptos_framework); - ensures optional_aggregator_value(optional_aggregator) == optional_aggregator_value(old(optional_aggregator)); + spec switch(_optional_aggregator: &mut OptionalAggregator) { + aborts_if true; } spec sub_integer(integer: &mut Integer, value: u128) { @@ -118,7 +114,7 @@ spec aptos_framework::optional_aggregator { ensures integer.value == old(integer.value) - value; } - spec new(limit: u128, parallelizable: bool): OptionalAggregator { + spec new(parallelizable: bool): OptionalAggregator { aborts_if parallelizable && !exists(@aptos_framework); ensures parallelizable ==> is_parallelizable(result); ensures !parallelizable ==> !is_parallelizable(result); @@ -126,46 +122,6 @@ spec aptos_framework::optional_aggregator { ensures optional_aggregator_value(result) <= optional_aggregator_limit(result); } - /// Option does not exist When Option exists. - /// Option exists when Option does not exist. - /// The AggregatorFactory is under the @aptos_framework when Option does not exist. - spec switch_and_zero_out(optional_aggregator: &mut OptionalAggregator) { - let vec_ref = optional_aggregator.integer.vec; - aborts_if is_parallelizable(optional_aggregator) && len(vec_ref) != 0; - aborts_if !is_parallelizable(optional_aggregator) && len(vec_ref) == 0; - aborts_if !is_parallelizable(optional_aggregator) && !exists(@aptos_framework); - /// [high-level-req-3] - ensures is_parallelizable(old(optional_aggregator)) ==> !is_parallelizable(optional_aggregator); - ensures !is_parallelizable(old(optional_aggregator)) ==> is_parallelizable(optional_aggregator); - ensures optional_aggregator_value(optional_aggregator) == 0; - } - - /// The aggregator exists and the integer dosex not exist when Switches from parallelizable to non-parallelizable implementation. - spec switch_to_integer_and_zero_out( - optional_aggregator: &mut OptionalAggregator - ): u128 { - let limit = aggregator::spec_get_limit(option::borrow(optional_aggregator.aggregator)); - aborts_if len(optional_aggregator.aggregator.vec) == 0; - aborts_if len(optional_aggregator.integer.vec) != 0; - ensures !is_parallelizable(optional_aggregator); - ensures option::borrow(optional_aggregator.integer).limit == limit; - ensures option::borrow(optional_aggregator.integer).value == 0; - } - - /// The integer exists and the aggregator does not exist when Switches from non-parallelizable to parallelizable implementation. - /// The AggregatorFactory is under the @aptos_framework. - spec switch_to_aggregator_and_zero_out( - optional_aggregator: &mut OptionalAggregator - ): u128 { - let limit = option::borrow(optional_aggregator.integer).limit; - aborts_if len(optional_aggregator.integer.vec) == 0; - aborts_if !exists(@aptos_framework); - aborts_if len(optional_aggregator.aggregator.vec) != 0; - ensures is_parallelizable(optional_aggregator); - ensures aggregator::spec_get_limit(option::borrow(optional_aggregator.aggregator)) == limit; - ensures aggregator::spec_aggregator_get_val(option::borrow(optional_aggregator.aggregator)) == 0; - } - spec destroy(optional_aggregator: OptionalAggregator) { aborts_if is_parallelizable(optional_aggregator) && len(optional_aggregator.integer.vec) != 0; aborts_if !is_parallelizable(optional_aggregator) && len(optional_aggregator.integer.vec) == 0; diff --git a/aptos-move/framework/aptos-framework/sources/aptos_account.move b/aptos-move/framework/aptos-framework/sources/aptos_account.move index 59679aada2903..d18abf2125186 100644 --- a/aptos-move/framework/aptos-framework/sources/aptos_account.move +++ b/aptos-move/framework/aptos-framework/sources/aptos_account.move @@ -4,7 +4,7 @@ module aptos_framework::aptos_account { use aptos_framework::coin::{Self, Coin}; use aptos_framework::create_signer::create_signer; use aptos_framework::event::{EventHandle, emit_event, emit}; - use aptos_framework::fungible_asset::{Self, Metadata, BurnRef}; + use aptos_framework::fungible_asset::{Self, Metadata, BurnRef, FungibleAsset}; use aptos_framework::primary_fungible_store; use aptos_framework::object; @@ -12,6 +12,7 @@ module aptos_framework::aptos_account { use std::features; use std::signer; use std::vector; + use aptos_framework::object::Object; friend aptos_framework::genesis; friend aptos_framework::resource_account; @@ -132,6 +133,40 @@ module aptos_framework::aptos_account { coin::deposit(to, coins) } + /// Batch version of transfer_fungible_assets. + public entry fun batch_transfer_fungible_assets( + from: &signer, + metadata: Object, + recipients: vector
, + amounts: vector + ) { + let recipients_len = vector::length(&recipients); + assert!( + recipients_len == vector::length(&amounts), + error::invalid_argument(EMISMATCHING_RECIPIENTS_AND_AMOUNTS_LENGTH), + ); + + vector::enumerate_ref(&recipients, |i, to| { + let amount = *vector::borrow(&amounts, i); + transfer_fungible_assets(from, metadata, *to, amount); + }); + } + + /// Convenient function to deposit fungible asset into a recipient account that might not exist. + /// This would create the recipient account first to receive the fungible assets. + public entry fun transfer_fungible_assets(from: &signer, metadata: Object, to: address, amount: u64) { + deposit_fungible_assets(to, primary_fungible_store::withdraw(from, metadata, amount)); + } + + /// Convenient function to deposit fungible asset into a recipient account that might not exist. + /// This would create the recipient account first to receive the fungible assets. + public fun deposit_fungible_assets(to: address, fa: FungibleAsset) { + if (!account::exists_at(to)) { + create_account(to); + }; + primary_fungible_store::deposit(to, fa) + } + public fun assert_account_exists(addr: address) { assert!(account::exists_at(addr), error::not_found(EACCOUNT_NOT_FOUND)); } diff --git a/aptos-move/framework/aptos-framework/sources/aptos_account.spec.move b/aptos-move/framework/aptos-framework/sources/aptos_account.spec.move index dc55f00112b4b..7c62849675512 100644 --- a/aptos-move/framework/aptos-framework/sources/aptos_account.spec.move +++ b/aptos-move/framework/aptos-framework/sources/aptos_account.spec.move @@ -238,6 +238,18 @@ spec aptos_framework::aptos_account { ensures if_exist_coin ==> post_coin_store_to == coin_store_to + coins.value; } + spec deposit_fungible_assets(to: address, fa: FungibleAsset) { + pragma verify = false; + } + + spec transfer_fungible_assets(from: &signer, metadata: Object, to: address, amount: u64) { + pragma verify = false; + } + + spec batch_transfer_fungible_assets(from: &signer, metadata: Object, recipients: vector
, amounts: vector) { + pragma verify = false; + } + spec transfer_coins(from: &signer, to: address, amount: u64) { // TODO(fa_migration) pragma verify = false; diff --git a/aptos-move/framework/aptos-framework/sources/coin.move b/aptos-move/framework/aptos-framework/sources/coin.move index ee4382be75e4e..f1d9a81962785 100644 --- a/aptos-move/framework/aptos-framework/sources/coin.move +++ b/aptos-move/framework/aptos-framework/sources/coin.move @@ -141,9 +141,7 @@ module aptos_framework::coin { withdraw_events: EventHandle, } - /// Maximum possible coin supply. - const MAX_U128: u128 = 340282366920938463463374607431768211455; - + #[deprecated] /// Configuration that controls the behavior of total coin supply. If the field /// is set, coin creators are allowed to upgrade to parallelizable implementations. struct SupplyConfig has key { @@ -541,18 +539,10 @@ module aptos_framework::coin { // Total supply config // - /// Publishes supply configuration. Initially, upgrading is not allowed. - public(friend) fun initialize_supply_config(aptos_framework: &signer) { - system_addresses::assert_aptos_framework(aptos_framework); - move_to(aptos_framework, SupplyConfig { allow_upgrades: false }); - } - /// This should be called by on-chain governance to update the config and allow /// or disallow upgradability of total supply. - public fun allow_supply_upgrades(aptos_framework: &signer, allowed: bool) acquires SupplyConfig { - system_addresses::assert_aptos_framework(aptos_framework); - let allow_upgrades = &mut borrow_global_mut(@aptos_framework).allow_upgrades; - *allow_upgrades = allowed; + public fun allow_supply_upgrades(_aptos_framework: &signer, _allowed: bool) { + abort error::invalid_state(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED) } inline fun calculate_amount_to_withdraw( @@ -927,30 +917,8 @@ module aptos_framework::coin { /// Upgrade total supply to use a parallelizable implementation if it is /// available. - public entry fun upgrade_supply(account: &signer) acquires CoinInfo, SupplyConfig { - let account_addr = signer::address_of(account); - - // Only coin creators can upgrade total supply. - assert!( - coin_address() == account_addr, - error::invalid_argument(ECOIN_INFO_ADDRESS_MISMATCH), - ); - - // Can only succeed once on-chain governance agreed on the upgrade. - assert!( - borrow_global(@aptos_framework).allow_upgrades, - error::permission_denied(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED) - ); - - let maybe_supply = &mut borrow_global_mut>(account_addr).supply; - if (option::is_some(maybe_supply)) { - let supply = option::borrow_mut(maybe_supply); - - // If supply is tracked and the current implementation uses an integer - upgrade. - if (!optional_aggregator::is_parallelizable(supply)) { - optional_aggregator::switch(supply); - } - } + public entry fun upgrade_supply(_account: &signer) { + abort error::invalid_state(ECOIN_SUPPLY_UPGRADE_NOT_SUPPORTED) } /// Creates a new Coin with given `CoinType` and returns minting/freezing/burning capabilities. @@ -1007,7 +975,7 @@ module aptos_framework::coin { decimals, supply: if (monitor_supply) { option::some( - optional_aggregator::new(MAX_U128, parallelizable) + optional_aggregator::new(parallelizable) ) } else { option::none() }, }; @@ -1694,6 +1662,10 @@ module aptos_framework::coin { assert!(optional_aggregator::read(supply) == 1000, 0); } + #[test_only] + /// Maximum possible coin supply. + const MAX_U128: u128 = 340282366920938463463374607431768211455; + #[test(framework = @aptos_framework)] #[expected_failure(abort_code = 0x20001, location = aptos_framework::aggregator)] fun test_supply_overflow(framework: signer) acquires CoinInfo { @@ -1708,50 +1680,6 @@ module aptos_framework::coin { optional_aggregator::sub(supply, 1); } - #[test(framework = @aptos_framework)] - #[expected_failure(abort_code = 0x5000B, location = aptos_framework::coin)] - fun test_supply_upgrade_fails(framework: signer) acquires CoinInfo, SupplyConfig { - initialize_supply_config(&framework); - aggregator_factory::initialize_aggregator_factory_for_test(&framework); - initialize_with_integer(&framework); - - let maybe_supply = &mut borrow_global_mut>(coin_address()).supply; - let supply = option::borrow_mut(maybe_supply); - - // Supply should be non-parallelizable. - assert!(!optional_aggregator::is_parallelizable(supply), 0); - - optional_aggregator::add(supply, 100); - optional_aggregator::sub(supply, 50); - optional_aggregator::add(supply, 950); - assert!(optional_aggregator::read(supply) == 1000, 0); - - upgrade_supply(&framework); - } - - #[test(framework = @aptos_framework)] - fun test_supply_upgrade(framework: signer) acquires CoinInfo, SupplyConfig { - initialize_supply_config(&framework); - aggregator_factory::initialize_aggregator_factory_for_test(&framework); - initialize_with_integer(&framework); - - // Ensure we have a non-parellelizable non-zero supply. - let maybe_supply = &mut borrow_global_mut>(coin_address()).supply; - let supply = option::borrow_mut(maybe_supply); - assert!(!optional_aggregator::is_parallelizable(supply), 0); - optional_aggregator::add(supply, 100); - - // Upgrade. - allow_supply_upgrades(&framework, true); - upgrade_supply(&framework); - - // Check supply again. - let maybe_supply = &mut borrow_global_mut>(coin_address()).supply; - let supply = option::borrow_mut(maybe_supply); - assert!(optional_aggregator::is_parallelizable(supply), 0); - assert!(optional_aggregator::read(supply) == 100, 0); - } - #[test_only] fun destroy_aggregatable_coin_for_test(aggregatable_coin: AggregatableCoin) { let AggregatableCoin { value } = aggregatable_coin; diff --git a/aptos-move/framework/aptos-framework/sources/coin.spec.move b/aptos-move/framework/aptos-framework/sources/coin.spec.move index 32bdc6645b3de..7033b42589b7f 100644 --- a/aptos-move/framework/aptos-framework/sources/coin.spec.move +++ b/aptos-move/framework/aptos-framework/sources/coin.spec.move @@ -119,24 +119,9 @@ spec aptos_framework::coin { ensures [abstract] result == type_info::type_of().account_address; } - /// Can only be initialized once. - /// Can only be published by reserved addresses. - spec initialize_supply_config(aptos_framework: &signer) { - let aptos_addr = signer::address_of(aptos_framework); - aborts_if !system_addresses::is_aptos_framework_address(aptos_addr); - aborts_if exists(aptos_addr); - ensures !global(aptos_addr).allow_upgrades; - ensures exists(aptos_addr); - } - /// Can only be updated by `@aptos_framework`. - spec allow_supply_upgrades(aptos_framework: &signer, allowed: bool) { - modifies global(@aptos_framework); - let aptos_addr = signer::address_of(aptos_framework); - aborts_if !system_addresses::is_aptos_framework_address(aptos_addr); - aborts_if !exists(aptos_addr); - let post allow_upgrades_post = global(@aptos_framework); - ensures allow_upgrades_post.allow_upgrades == allowed; + spec allow_supply_upgrades(_aptos_framework: &signer, _allowed: bool) { + aborts_if true; } spec balance(owner: address): u64 { @@ -394,32 +379,8 @@ spec aptos_framework::coin { /// The creator of `CoinType` must be `@aptos_framework`. /// `SupplyConfig` allow upgrade. - spec upgrade_supply(account: &signer) { - let account_addr = signer::address_of(account); - let coin_address = type_info::type_of().account_address; - aborts_if coin_address != account_addr; - aborts_if !exists(@aptos_framework); - /// [high-level-req-1.1] - aborts_if !exists>(account_addr); - - let supply_config = global(@aptos_framework); - aborts_if !supply_config.allow_upgrades; - modifies global>(account_addr); - - let maybe_supply = global>(account_addr).supply; - let supply = option::spec_borrow(maybe_supply); - let value = optional_aggregator::optional_aggregator_value(supply); - - let post post_maybe_supply = global>(account_addr).supply; - let post post_supply = option::spec_borrow(post_maybe_supply); - let post post_value = optional_aggregator::optional_aggregator_value(post_supply); - - let supply_no_parallel = option::spec_is_some(maybe_supply) && - !optional_aggregator::is_parallelizable(supply); - - aborts_if supply_no_parallel && !exists(@aptos_framework); - ensures supply_no_parallel ==> - optional_aggregator::is_parallelizable(post_supply) && post_value == value; + spec upgrade_supply(_account: &signer) { + aborts_if true; } spec initialize { diff --git a/aptos-move/framework/aptos-framework/sources/genesis.move b/aptos-move/framework/aptos-framework/sources/genesis.move index dde48974bc06b..207bcf74b351c 100644 --- a/aptos-move/framework/aptos-framework/sources/genesis.move +++ b/aptos-move/framework/aptos-framework/sources/genesis.move @@ -124,7 +124,6 @@ module aptos_framework::genesis { // Ensure we can create aggregators for supply, but not enable it for common use just yet. aggregator_factory::initialize_aggregator_factory(&aptos_framework_account); - coin::initialize_supply_config(&aptos_framework_account); chain_id::initialize(&aptos_framework_account, chain_id); reconfiguration::initialize(&aptos_framework_account); diff --git a/aptos-move/framework/aptos-framework/sources/object.move b/aptos-move/framework/aptos-framework/sources/object.move index 8132cffe4d739..abca67bb2451a 100644 --- a/aptos-move/framework/aptos-framework/sources/object.move +++ b/aptos-move/framework/aptos-framework/sources/object.move @@ -844,7 +844,7 @@ module aptos_framework::object { #[test(fx = @std)] fun test_correct_auid() { let auid1 = aptos_framework::transaction_context::generate_auid_address(); - let bytes = aptos_framework::transaction_context::unique_session_hash(); + let bytes = aptos_framework::transaction_context::get_transaction_hash(); std::vector::push_back(&mut bytes, 1); std::vector::push_back(&mut bytes, 0); std::vector::push_back(&mut bytes, 0); diff --git a/aptos-move/framework/aptos-framework/sources/randomness.move b/aptos-move/framework/aptos-framework/sources/randomness.move index b79e5ea869291..cde8328e67795 100644 --- a/aptos-move/framework/aptos-framework/sources/randomness.move +++ b/aptos-move/framework/aptos-framework/sources/randomness.move @@ -81,7 +81,7 @@ module aptos_framework::randomness { let seed = *option::borrow(&randomness.seed); vector::append(&mut input, seed); - vector::append(&mut input, transaction_context::unique_session_hash()); + vector::append(&mut input, transaction_context::get_transaction_hash()); vector::append(&mut input, fetch_and_increment_txn_counter()); hash::sha3_256(input) } diff --git a/aptos-move/framework/aptos-framework/sources/transaction_context.move b/aptos-move/framework/aptos-framework/sources/transaction_context.move index bb00fa16a82ed..c3bad25371cdc 100644 --- a/aptos-move/framework/aptos-framework/sources/transaction_context.move +++ b/aptos-move/framework/aptos-framework/sources/transaction_context.move @@ -10,9 +10,6 @@ module aptos_framework::transaction_context { /// The transaction context extension feature is not enabled. const ETRANSACTION_CONTEXT_EXTENSION_NOT_ENABLED: u64 = 2; - /// The transaction context hash function update feature is not enabled. - const ETRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE_NOT_ENABLED: u64 = 3; - /// A wrapper denoting aptos unique identifer (AUID) /// for storing an address struct AUID has drop, store { @@ -34,19 +31,15 @@ module aptos_framework::transaction_context { entry_function_payload: Option, } - /// Returns a unique session hash, ensuring a distinct value for each transaction - /// session: prologue, execution, epilogue. - public fun unique_session_hash(): vector { - get_txn_hash() - } - #[deprecated] - // This function is deprecated. Use `unique_session_hash` instead. + /// Returns the transaction hash of the current transaction. + native fun get_txn_hash(): vector; + + /// Returns the transaction hash of the current transaction. + /// Internally calls the private function `get_txn_hash`. + /// This function is created for to feature gate the `get_txn_hash` function. public fun get_transaction_hash(): vector { get_txn_hash() } - // This function will be removed when `get_transaction_hash` is deprecated. - native fun get_txn_hash(): vector; - /// Returns a universally unique identifier (of type address) generated /// by hashing the transaction hash of this transaction and a sequence number @@ -189,15 +182,6 @@ module aptos_framework::transaction_context { payload.entry_function_payload } - /// Returns the hash of the current raw transaction, which is used for transaction authentication. - /// This function calls an internal native function to retrieve the raw transaction hash. - /// In the case of a fee payer transaction, the hash value is generated using 0x0 as the fee payer address. - public fun raw_transaction_hash(): vector { - assert!(features::transaction_context_hash_function_update_enabled(), error::invalid_state(ETRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE_NOT_ENABLED)); - raw_transaction_hash_internal() - } - native fun raw_transaction_hash_internal(): vector; - #[test()] fun test_auid_uniquess() { use std::vector; @@ -275,11 +259,4 @@ module aptos_framework::transaction_context { // expected to fail with the error code of `invalid_state(E_TRANSACTION_CONTEXT_NOT_AVAILABLE)` let _multisig = multisig_payload(); } - - #[test] - #[expected_failure(abort_code=196609, location = Self)] - fun test_call_raw_txn_hash() { - // expected to fail with the error code of `invalid_state(E_TRANSACTION_CONTEXT_NOT_AVAILABLE)` - let _multisig = multisig_payload(); - } } diff --git a/aptos-move/framework/aptos-framework/sources/transaction_context.spec.move b/aptos-move/framework/aptos-framework/sources/transaction_context.spec.move index 4e9f967b1bc6a..f9837e26e6a75 100644 --- a/aptos-move/framework/aptos-framework/sources/transaction_context.spec.move +++ b/aptos-move/framework/aptos-framework/sources/transaction_context.spec.move @@ -1,10 +1,10 @@ spec aptos_framework::transaction_context { /// /// No.: 1 - /// Requirement: Fetching the unique session hash should return a vector with 32 bytes. + /// Requirement: Fetching the transaction hash should return a vector with 32 bytes. /// Criticality: Medium - /// Implementation: The unique_session_hash function calls the native function unique_session_hash_internal, which fetches the - /// NativeTransactionContext struct and returns the unique_session_hash field. + /// Implementation: The get_transaction_hash function calls the native function get_txn_hash, which fetches the + /// NativeTransactionContext struct and returns the txn_hash field. /// Enforcement: Audited that the native function returns the txn hash, whose size is 32 bytes. This has been /// modeled as the abstract postcondition that the returned vector is of length 32. Formally verified via [high-level-req-1](get_txn_hash). /// @@ -42,26 +42,19 @@ spec aptos_framework::transaction_context { ensures [abstract] len(result) == 32; } spec fun spec_get_script_hash(): vector; - spec fun spec_get_txn_hash(): vector; spec get_txn_hash(): vector { pragma opaque; - aborts_if false; + aborts_if [abstract] false; ensures result == spec_get_txn_hash(); - // property 1: Fetching the transaction hash should return a vector with 32 bytes, if the auid feature flag is enabled. - /// [high-level-req-1] - ensures len(result) == 32; } + spec fun spec_get_txn_hash(): vector; spec get_transaction_hash(): vector { pragma opaque; - aborts_if false; - ensures result == spec_get_txn_hash(); - ensures len(result) == 32; - } - spec unique_session_hash(): vector { - pragma opaque; - aborts_if false; + aborts_if [abstract] false; ensures result == spec_get_txn_hash(); - ensures len(result) == 32; + // property 1: Fetching the transaction hash should return a vector with 32 bytes, if the auid feature flag is enabled. + /// [high-level-req-1] + ensures [abstract] len(result) == 32; } spec generate_unique_address(): address { pragma opaque; @@ -108,12 +101,9 @@ spec aptos_framework::transaction_context { //TODO: temporary mockup pragma opaque; } + spec multisig_payload_internal(): Option { //TODO: temporary mockup pragma opaque; } - spec raw_transaction_hash_internal(): vector { - //TODO: temporary mockup - pragma opaque; - } } diff --git a/aptos-move/framework/aptos-framework/tests/aggregator_tests.move b/aptos-move/framework/aptos-framework/tests/aggregator_tests.move index 9350c245268d7..5a4ae5fa0c469 100644 --- a/aptos-move/framework/aptos-framework/tests/aggregator_tests.move +++ b/aptos-move/framework/aptos-framework/tests/aggregator_tests.move @@ -4,10 +4,12 @@ module aptos_framework::aggregator_tests { use aptos_framework::aggregator; use aptos_framework::aggregator_factory; + const MAX_U128: u128 = 340282366920938463463374607431768211455; + #[test(account = @aptos_framework)] fun test_can_add_and_sub_and_read(account: signer) { aggregator_factory::initialize_aggregator_factory_for_test(&account); - let aggregator = aggregator_factory::create_aggregator(&account, 1000); + let aggregator = aggregator_factory::create_aggregator_for_test(); aggregator::add(&mut aggregator, 12); assert!(aggregator::read(&aggregator) == 12, 0); @@ -30,7 +32,8 @@ module aptos_framework::aggregator_tests { #[expected_failure(abort_code = 0x020001, location = aptos_framework::aggregator)] fun test_overflow(account: signer) { aggregator_factory::initialize_aggregator_factory_for_test(&account); - let aggregator = aggregator_factory::create_aggregator(&account, 10); + let aggregator = aggregator_factory::create_aggregator_for_test(); + aggregator::add(&mut aggregator, MAX_U128 - 10); // Overflow! aggregator::add(&mut aggregator, 12); @@ -42,7 +45,7 @@ module aptos_framework::aggregator_tests { #[expected_failure(abort_code = 0x020002, location = aptos_framework::aggregator)] fun test_underflow(account: signer) { aggregator_factory::initialize_aggregator_factory_for_test(&account); - let aggregator = aggregator_factory::create_aggregator(&account, 10); + let aggregator = aggregator_factory::create_aggregator_for_test(); // Underflow! aggregator::sub(&mut aggregator, 100); diff --git a/aptos-move/framework/move-stdlib/doc/features.md b/aptos-move/framework/move-stdlib/doc/features.md index f40f107d245e5..3919625f4ff9c 100644 --- a/aptos-move/framework/move-stdlib/doc/features.md +++ b/aptos-move/framework/move-stdlib/doc/features.md @@ -133,8 +133,6 @@ return true. - [Function `transaction_simulation_enhancement_enabled`](#0x1_features_transaction_simulation_enhancement_enabled) - [Function `get_collection_owner_feature`](#0x1_features_get_collection_owner_feature) - [Function `is_collection_owner_enabled`](#0x1_features_is_collection_owner_enabled) -- [Function `get_transaction_context_hash_function_update_feature`](#0x1_features_get_transaction_context_hash_function_update_feature) -- [Function `transaction_context_hash_function_update_enabled`](#0x1_features_transaction_context_hash_function_update_enabled) - [Function `change_feature_flags`](#0x1_features_change_feature_flags) - [Function `change_feature_flags_internal`](#0x1_features_change_feature_flags_internal) - [Function `change_feature_flags_for_next_epoch`](#0x1_features_change_feature_flags_for_next_epoch) @@ -882,21 +880,6 @@ Lifetime: transient - - -Whether the transaction context hash function update is enabled. This update introduces new APIs (public functions -and native functions) to the transaction context module: raw_transaction_hash and unique_session_hash. -raw_transaction_hash retrieves the hash of the raw transaction. Also, unique_session_hash will replace -in a later release the existing get_transaction_hash function which has a misleading name. - -Lifetime: transient - - -
const TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE: u64 = 80;
-
- - - Whether the simulation enhancement is enabled. This enables the simulation without an authentication check, @@ -3291,52 +3274,6 @@ Deprecated feature - - - - -## Function `get_transaction_context_hash_function_update_feature` - - - -
public fun get_transaction_context_hash_function_update_feature(): u64
-
- - - -
-Implementation - - -
public fun get_transaction_context_hash_function_update_feature(): u64 { TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE }
-
- - - -
- - - -## Function `transaction_context_hash_function_update_enabled` - - - -
public fun transaction_context_hash_function_update_enabled(): bool
-
- - - -
-Implementation - - -
public fun transaction_context_hash_function_update_enabled(): bool acquires Features {
-    is_enabled(TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE)
-}
-
- - -
diff --git a/aptos-move/framework/move-stdlib/sources/configs/features.move b/aptos-move/framework/move-stdlib/sources/configs/features.move index eeb9ae75d8668..2bdba4056eaae 100644 --- a/aptos-move/framework/move-stdlib/sources/configs/features.move +++ b/aptos-move/framework/move-stdlib/sources/configs/features.move @@ -607,20 +607,6 @@ module std::features { is_enabled(COLLECTION_OWNER) } - /// Whether the transaction context hash function update is enabled. This update introduces new APIs (public functions - /// and native functions) to the transaction context module: `raw_transaction_hash` and `unique_session_hash`. - /// `raw_transaction_hash` retrieves the hash of the raw transaction. Also, `unique_session_hash` will replace - /// in a later release the existing `get_transaction_hash` function which has a misleading name. - /// - /// Lifetime: transient - const TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE: u64 = 80; - - public fun get_transaction_context_hash_function_update_feature(): u64 { TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE } - - public fun transaction_context_hash_function_update_enabled(): bool acquires Features { - is_enabled(TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE) - } - // ============================================================================================ // Feature Flag Implementation diff --git a/aptos-move/framework/src/built_package.rs b/aptos-move/framework/src/built_package.rs index f6f2f85b9bc68..3f120349a6f04 100644 --- a/aptos-move/framework/src/built_package.rs +++ b/aptos-move/framework/src/built_package.rs @@ -484,6 +484,15 @@ impl BuiltPackage { }, CompiledUnit::Script(_) => None, }) + .chain( + self.package + .bytecode_deps + .iter() + .map(|(name, address)| PackageDep { + account: address.into_inner(), + package_name: name.as_str().to_string(), + }), + ) .collect::>() .into_iter() .collect(); diff --git a/aptos-move/framework/src/chunked_publish.rs b/aptos-move/framework/src/chunked_publish.rs index aa79b70e52134..8d64d5b591b8f 100644 --- a/aptos-move/framework/src/chunked_publish.rs +++ b/aptos-move/framework/src/chunked_publish.rs @@ -4,8 +4,10 @@ use aptos_types::transaction::{EntryFunction, TransactionPayload}; use move_core_types::{account_address::AccountAddress, ident_str, language_storage::ModuleId}; +/// The default address where the `large_packages.move` module is deployed. +/// This address is used on both mainnet and testnet. pub const LARGE_PACKAGES_MODULE_ADDRESS: &str = - "0x0e1ca3011bdd07246d4d16d909dbb2d6953a86c4735d5acf5865d962c630cce7"; // mainnet and testnet + "0x0e1ca3011bdd07246d4d16d909dbb2d6953a86c4735d5acf5865d962c630cce7"; /// Maximum code & metadata chunk size to be included in a transaction pub const MAX_CHUNK_SIZE_IN_BYTES: usize = 60_000; @@ -21,6 +23,7 @@ pub fn chunk_package_and_create_payloads( package_code: Vec>, publish_type: PublishType, object_address: Option, + large_packages_module_address: AccountAddress, ) -> Vec { // Chunk the metadata let mut metadata_chunks = create_chunks(metadata); @@ -30,7 +33,9 @@ pub fn chunk_package_and_create_payloads( let mut taken_size = metadata_chunk.len(); let mut payloads = metadata_chunks .into_iter() - .map(|chunk| large_packages_stage_code_chunk(chunk, vec![], vec![])) + .map(|chunk| { + large_packages_stage_code_chunk(chunk, vec![], vec![], large_packages_module_address) + }) .collect::>(); let mut code_indices: Vec = vec![]; @@ -45,6 +50,7 @@ pub fn chunk_package_and_create_payloads( metadata_chunk, code_indices.clone(), code_chunks.clone(), + large_packages_module_address, ); payloads.push(payload); @@ -66,17 +72,20 @@ pub fn chunk_package_and_create_payloads( metadata_chunk, code_indices, code_chunks, + large_packages_module_address, ), PublishType::ObjectDeploy => large_packages_stage_code_chunk_and_publish_to_object( metadata_chunk, code_indices, code_chunks, + large_packages_module_address, ), PublishType::ObjectUpgrade => large_packages_stage_code_chunk_and_upgrade_object_code( metadata_chunk, code_indices, code_chunks, object_address.expect("ObjectAddress is missing"), + large_packages_module_address, ), }; payloads.push(payload); @@ -96,10 +105,11 @@ fn large_packages_stage_code_chunk( metadata_chunk: Vec, code_indices: Vec, code_chunks: Vec>, + large_packages_module_address: AccountAddress, ) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - AccountAddress::from_hex_literal(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), + large_packages_module_address, ident_str!("large_packages").to_owned(), ), ident_str!("stage_code_chunk").to_owned(), @@ -117,10 +127,11 @@ fn large_packages_stage_code_chunk_and_publish_to_account( metadata_chunk: Vec, code_indices: Vec, code_chunks: Vec>, + large_packages_module_address: AccountAddress, ) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - AccountAddress::from_hex_literal(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), + large_packages_module_address, ident_str!("large_packages").to_owned(), ), ident_str!("stage_code_chunk_and_publish_to_account").to_owned(), @@ -138,10 +149,11 @@ fn large_packages_stage_code_chunk_and_publish_to_object( metadata_chunk: Vec, code_indices: Vec, code_chunks: Vec>, + large_packages_module_address: AccountAddress, ) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - AccountAddress::from_hex_literal(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), + large_packages_module_address, ident_str!("large_packages").to_owned(), ), ident_str!("stage_code_chunk_and_publish_to_object").to_owned(), @@ -160,10 +172,11 @@ fn large_packages_stage_code_chunk_and_upgrade_object_code( code_indices: Vec, code_chunks: Vec>, code_object: AccountAddress, + large_packages_module_address: AccountAddress, ) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - AccountAddress::from_hex_literal(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), + large_packages_module_address, ident_str!("large_packages").to_owned(), ), ident_str!("stage_code_chunk_and_upgrade_object_code").to_owned(), @@ -178,10 +191,12 @@ fn large_packages_stage_code_chunk_and_upgrade_object_code( } // Cleanup account's `StagingArea` resource. -pub fn large_packages_cleanup_staging_area() -> TransactionPayload { +pub fn large_packages_cleanup_staging_area( + large_packages_module_address: AccountAddress, +) -> TransactionPayload { TransactionPayload::EntryFunction(EntryFunction::new( ModuleId::new( - AccountAddress::from_hex_literal(LARGE_PACKAGES_MODULE_ADDRESS).unwrap(), + large_packages_module_address, ident_str!("large_packages").to_owned(), ), ident_str!("cleanup_staging_area").to_owned(), diff --git a/aptos-move/framework/src/natives/randomness.rs b/aptos-move/framework/src/natives/randomness.rs index a608dfb0441fb..20b5964aca620 100644 --- a/aptos-move/framework/src/natives/randomness.rs +++ b/aptos-move/framework/src/natives/randomness.rs @@ -1,6 +1,10 @@ // Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 +use aptos_gas_schedule::{ + gas_feature_versions::RELEASE_V1_23, + gas_params::natives::aptos_framework::RANDOMNESS_FETCH_AND_INC_COUNTER, +}; use aptos_native_interface::{ RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, }; @@ -55,6 +59,10 @@ pub fn fetch_and_increment_txn_counter( _ty_args: Vec, _args: VecDeque, ) -> SafeNativeResult> { + if context.gas_feature_version() >= RELEASE_V1_23 { + context.charge(RANDOMNESS_FETCH_AND_INC_COUNTER)?; + } + let ctx = context.extensions_mut().get_mut::(); if !ctx.is_unbiasable() { return Err(SafeNativeError::Abort { @@ -62,7 +70,6 @@ pub fn fetch_and_increment_txn_counter( }); } - // TODO: charge gas? let ret = ctx.txn_local_state.to_vec(); ctx.increment(); Ok(smallvec![Value::vector_u8(ret)]) diff --git a/aptos-move/framework/src/natives/transaction_context.rs b/aptos-move/framework/src/natives/transaction_context.rs index b1df7778164e5..044e948a0ecb5 100644 --- a/aptos-move/framework/src/natives/transaction_context.rs +++ b/aptos-move/framework/src/natives/transaction_context.rs @@ -31,7 +31,7 @@ pub mod abort_codes { /// is accessible from natives of this extension. #[derive(Tid)] pub struct NativeTransactionContext { - unique_session_hash: Vec, + txn_hash: Vec, /// The number of AUIDs (Aptos unique identifiers) issued during the /// execution of this transaction. auid_counter: u64, @@ -46,13 +46,13 @@ impl NativeTransactionContext { /// Create a new instance of a native transaction context. This must be passed in via an /// extension into VM session functions. pub fn new( - unique_session_hash: Vec, + txn_hash: Vec, script_hash: Vec, chain_id: u8, user_transaction_context_opt: Option, ) -> Self { Self { - unique_session_hash, + txn_hash, auid_counter: 0, script_hash, chain_id, @@ -66,12 +66,12 @@ impl NativeTransactionContext { } /*************************************************************************************************** - * native fun native_unique_session_hash + * native fun get_txn_hash * * gas cost: base_cost * **************************************************************************************************/ -fn native_unique_session_hash( +fn native_get_txn_hash( context: &mut SafeNativeContext, _ty_args: Vec, _args: VecDeque, @@ -80,7 +80,7 @@ fn native_unique_session_hash( let transaction_context = context.extensions().get::(); Ok(smallvec![Value::vector_u8( - transaction_context.unique_session_hash.clone() + transaction_context.txn_hash.clone() )]) } @@ -103,7 +103,7 @@ fn native_generate_unique_address( transaction_context.auid_counter += 1; let auid = AuthenticationKey::auid( - transaction_context.unique_session_hash.clone(), + transaction_context.txn_hash.clone(), transaction_context.auid_counter, ) .account_address(); @@ -368,25 +368,6 @@ fn native_multisig_payload_internal( } } -fn native_raw_transaction_hash_internal( - context: &mut SafeNativeContext, - _ty_args: Vec, - _args: VecDeque, -) -> SafeNativeResult> { - context.charge(TRANSACTION_CONTEXT_SENDER_BASE)?; - - let user_transaction_context_opt = get_user_transaction_context_opt_from_context(context); - if let Some(transaction_context) = user_transaction_context_opt { - Ok(smallvec![Value::vector_u8( - transaction_context.raw_txn_hash() - )]) - } else { - Err(SafeNativeError::Abort { - abort_code: error::invalid_state(abort_codes::ETRANSACTION_CONTEXT_NOT_AVAILABLE), - }) - } -} - fn get_user_transaction_context_opt_from_context<'a>( context: &'a SafeNativeContext, ) -> &'a Option { @@ -406,41 +387,24 @@ pub fn make_all( let natives = [ ("get_script_hash", native_get_script_hash as RawSafeNative), ("generate_unique_address", native_generate_unique_address), - ("get_txn_hash", native_unique_session_hash), - ("unique_session_hash", native_unique_session_hash), - ("sender", native_sender_internal), + ("get_txn_hash", native_get_txn_hash), ("sender_internal", native_sender_internal), - ("secondary_signers", native_secondary_signers_internal), ( "secondary_signers_internal", native_secondary_signers_internal, ), - ("gas_payer", native_gas_payer_internal), ("gas_payer_internal", native_gas_payer_internal), - ("max_gas_amount", native_max_gas_amount_internal), ("max_gas_amount_internal", native_max_gas_amount_internal), - ("gas_unit_price", native_gas_unit_price_internal), ("gas_unit_price_internal", native_gas_unit_price_internal), - ("chain_id", native_chain_id_internal), ("chain_id_internal", native_chain_id_internal), - ( - "entry_function_payload", - native_entry_function_payload_internal, - ), ( "entry_function_payload_internal", native_entry_function_payload_internal, ), - ("multisig_payload", native_multisig_payload_internal), ( "multisig_payload_internal", native_multisig_payload_internal, ), - ("raw_transaction_hash", native_raw_transaction_hash_internal), - ( - "raw_transaction_hash_internal", - native_raw_transaction_hash_internal, - ), ]; builder.make_named_natives(natives) diff --git a/aptos-move/script-composer/Cargo.toml b/aptos-move/script-composer/Cargo.toml new file mode 100644 index 0000000000000..4176089fa6a49 --- /dev/null +++ b/aptos-move/script-composer/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "aptos-dynamic-transaction-composer" +description = "Generating Move Script from a batched Move calls" +version = "0.1.0" + +# Workspace inherited keys +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +anyhow = { workspace = true } +bcs = { workspace = true } +getrandom = { workspace = true, features = ["js"] } +hex = { workspace = true } +move-binary-format = { workspace = true } +move-bytecode-verifier = { workspace = true } +move-core-types = { workspace = true } +reqwest = { workspace = true, features = ["blocking"] } +serde = { workspace = true } +serde_bytes = { workspace = true } +serde_json = { workspace = true } +tsify-next = { workspace = true } +wasm-bindgen = { workspace = true } +wasm-bindgen-futures = { workspace = true } + +[dev-dependencies] +aptos-types = { workspace = true } +e2e-move-tests = { path = "../e2e-move-tests" } + +[package.metadata.cargo-machete] +ignored = ["serde_bytes", "wasm-bindgen-futures", "getrandom"] diff --git a/aptos-move/script-composer/src/builder.rs b/aptos-move/script-composer/src/builder.rs new file mode 100644 index 0000000000000..4f93194d1924d --- /dev/null +++ b/aptos-move/script-composer/src/builder.rs @@ -0,0 +1,556 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +//! Code to generate compiled Move script from a series of individual Move calls. +//! +//! Defined a struct called `TransactionComposer`. With `TransactionComposer`, you will be able to add new Move calls +//! to it via the `add_batched_call` api. The code will perform a light weight type check to make sure the ability and +//! type safety of the Move calls will be held. After adding the calls, you will be able to consume the `TransactionComposer` +//! and get the corresponding `CompiledScript` via the `generate_batched_calls` api. + +#[cfg(test)] +use crate::MoveFunctionCall; +use crate::{ + helpers::{import_signature, import_type_tag, Script}, + ArgumentOperation, CallArgument, ComposerVersion, PreviousResult, APTOS_SCRIPT_COMPOSER_KEY, +}; +use anyhow::{anyhow, bail, Result}; +use move_binary_format::{ + access::ScriptAccess, + binary_views::BinaryIndexedView, + builders::CompiledScriptBuilder, + errors::PartialVMResult, + file_format::{ + empty_script, Bytecode, FunctionHandleIndex, FunctionInstantiation, + FunctionInstantiationIndex, Signature, SignatureToken, TableIndex, + }, + CompiledModule, +}; +use move_core_types::{ + identifier::Identifier, + language_storage::{ModuleId, TypeTag}, + metadata::Metadata, + transaction_argument::TransactionArgument, +}; +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use std::{collections::BTreeMap, str::FromStr}; +use tsify_next::Tsify; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +#[derive(Tsify, Clone, Serialize, Deserialize, PartialEq, Eq, Debug)] +pub struct AllocatedLocal { + op_type: ArgumentOperation, + is_parameter: bool, + local_idx: u16, +} + +#[derive(Clone, Debug)] +#[wasm_bindgen] +struct BuilderCall { + type_args: Vec, + call_idx: FunctionHandleIndex, + arguments: Vec, + // Assigned index of returned values in the local pool. + returns: Vec, + + #[cfg(test)] + type_tags: Vec, +} + +#[derive(Clone, Debug)] +#[wasm_bindgen] +pub struct TransactionComposer { + modules: BTreeMap, + builder: CompiledScriptBuilder, + calls: Vec, + parameters: Vec>, + locals_availability: Vec, + + locals_ty: Vec, + parameters_ty: Vec, + + #[cfg(test)] + signer_count: u16, +} + +#[wasm_bindgen] +impl TransactionComposer { + /// Create a builder with one distinct signer available. This should be the default configuration. + pub fn single_signer() -> Self { + let mut script = empty_script(); + script.code.code = vec![]; + + let builder = CompiledScriptBuilder::new(script); + Self { + modules: BTreeMap::new(), + builder, + calls: vec![], + parameters: vec![], + locals_availability: vec![], + locals_ty: vec![], + parameters_ty: vec![SignatureToken::Reference(Box::new(SignatureToken::Signer))], + + #[cfg(test)] + signer_count: 1, + } + } + + /// Create a builder with one signer needed for script. This would be needed for multi-agent + /// transaction where multiple signers are present. + pub fn multi_signer(signer_count: u16) -> Self { + let mut script = empty_script(); + script.code.code = vec![]; + + let builder = CompiledScriptBuilder::new(script); + Self { + modules: BTreeMap::new(), + builder, + calls: vec![], + parameters: vec![], + locals_availability: vec![], + locals_ty: vec![], + parameters_ty: std::iter::repeat(SignatureToken::Reference(Box::new( + SignatureToken::Signer, + ))) + .take(signer_count.into()) + .collect(), + + #[cfg(test)] + signer_count, + } + } + + /// Consume the builder and generate a serialized script with calls in the builder. + pub fn generate_batched_calls(self, with_metadata: bool) -> Result, String> { + self.generate_batched_calls_impl(with_metadata) + .map_err(|e| e.to_string()) + } + + /// Load up a module from a remote endpoint. Will need to invoke this function prior to the + /// call. + pub async fn load_module( + &mut self, + api_url: String, + module_name: String, + ) -> Result<(), JsValue> { + let module_id = ModuleId::from_str(&module_name) + .map_err(|err| JsValue::from(format!("Invalid module name: {:?}", err)))?; + self.load_module_impl(api_url.as_str(), module_id) + .await + .map_err(|err| JsValue::from(format!("{:?}", err))) + } + + /// Load up the dependency modules of a TypeTag from a remote endpoint. + pub async fn load_type_tag( + &mut self, + api_url: String, + type_tag: String, + ) -> Result<(), JsValue> { + let type_tag = TypeTag::from_str(&type_tag) + .map_err(|err| JsValue::from(format!("Invalid type name: {:?}", err)))?; + self.load_type_tag_impl(api_url.as_str(), &type_tag) + .await + .map_err(|err| JsValue::from(format!("{:?}", err))) + } + + /// This would be the core api for the `TransactionComposer`. The function would: + /// - add the function call to the builder + /// - allocate the locals and parameters needed for this function call + /// - return the arguments back to the caller which could be passed into subsequent calls + /// into `add_batched_call`. + /// + /// This function would also check for the ability and type safety when passing values + /// into the function call, and will abort if there's a violation. + #[wasm_bindgen(js_name = add_batched_call)] + pub fn add_batched_call_wasm( + &mut self, + module: String, + function: String, + ty_args: Vec, + args: Vec, + ) -> Result, JsValue> { + self.add_batched_call(module, function, ty_args, args) + .map_err(|err| JsValue::from(format!("{:?}", err))) + } +} + +impl TransactionComposer { + pub fn insert_module(&mut self, module: CompiledModule) { + self.modules.insert(module.self_id(), module); + } + + fn check_argument_compatibility( + &mut self, + argument: &AllocatedLocal, + expected_ty: &SignatureToken, + ) -> anyhow::Result<()> { + let local_ty = if argument.is_parameter { + self.parameters_ty[argument.local_idx as usize].clone() + } else { + self.locals_ty[argument.local_idx as usize].clone() + }; + + let ty = match argument.op_type { + ArgumentOperation::Borrow => SignatureToken::Reference(Box::new(local_ty)), + ArgumentOperation::BorrowMut => SignatureToken::MutableReference(Box::new(local_ty)), + ArgumentOperation::Copy => { + let ability = BinaryIndexedView::Script(self.builder.as_script()) + .abilities(&local_ty, &[]) + .map_err(|_| anyhow!("Failed to calculate ability for type"))?; + if !ability.has_copy() { + bail!("Trying to copy move values that does NOT have copy ability"); + } + local_ty + }, + ArgumentOperation::Move => { + if !argument.is_parameter { + if self.locals_availability[argument.local_idx as usize] { + self.locals_availability[argument.local_idx as usize] = false; + } else { + bail!("Trying to use a Move value that has already been moved"); + } + } + local_ty + }, + }; + + if &ty != expected_ty { + bail!("Type mismatch when passing arugments around"); + } + Ok(()) + } + + pub fn add_batched_call( + &mut self, + module: String, + function: String, + ty_args: Vec, + args: Vec, + ) -> anyhow::Result> { + let ty_args = ty_args + .iter() + .map(|s| TypeTag::from_str(s)) + .collect::>>()?; + let module = ModuleId::from_str(&module)?; + let function = Identifier::new(function)?; + + let target_module = match self.modules.get(&module) { + Some(module) => module, + None => { + bail!("Module {} is not yet loaded", module); + }, + }; + + let call_idx = self + .builder + .import_call_by_name(function.as_ident_str(), target_module)?; + let type_arguments = ty_args + .iter() + .map(|ty| import_type_tag(&mut self.builder, ty, &self.modules)) + .collect::>>()?; + + let mut arguments = vec![]; + let expected_args_ty = { + let script = self.builder.as_script(); + let func = script.function_handle_at(call_idx); + if script.signature_at(func.parameters).0.len() != args.len() { + bail!( + "Function {}::{} argument call size mismatch", + module, + function + ); + } + script + .signature_at(func.parameters) + .0 + .iter() + .map(|ty| ty.instantiate(&type_arguments)) + .collect::>() + }; + + for (arg, ty) in args.into_iter().zip(expected_args_ty) { + match arg { + CallArgument::PreviousResult(r) => { + let argument = AllocatedLocal { + op_type: r.operation_type, + is_parameter: false, + local_idx: self.calls[r.call_idx as usize].returns[r.return_idx as usize], + }; + self.check_argument_compatibility(&argument, &ty)?; + arguments.push(argument) + }, + CallArgument::Signer(i) => arguments.push(AllocatedLocal { + op_type: ArgumentOperation::Copy, + is_parameter: true, + local_idx: i, + }), + CallArgument::Raw(bytes) => { + let new_local_idx = self.parameters_ty.len() as u16; + self.parameters_ty.push(ty); + self.parameters.push(bytes); + arguments.push(AllocatedLocal { + op_type: ArgumentOperation::Move, + is_parameter: true, + local_idx: new_local_idx, + }) + }, + } + } + + let mut returns = vec![]; + + let expected_returns_ty = { + let func = self.builder.as_script().function_handle_at(call_idx); + self.builder + .as_script() + .signature_at(func.return_) + .0 + .iter() + .map(|ty| ty.instantiate(&type_arguments)) + .collect::>() + }; + + for return_ty in expected_returns_ty { + let local_idx = self.locals_ty.len() as u16; + self.locals_ty.push(return_ty); + self.locals_availability.push(true); + returns.push(local_idx); + } + + let num_of_calls = self.calls.len() as u16; + + self.calls.push(BuilderCall { + type_args: type_arguments, + call_idx, + arguments, + returns: returns.clone(), + #[cfg(test)] + type_tags: ty_args, + }); + + Ok((0..returns.len()) + .map(|idx| { + CallArgument::PreviousResult(PreviousResult { + operation_type: ArgumentOperation::Move, + call_idx: num_of_calls, + return_idx: idx as u16, + }) + }) + .collect()) + } + + fn check_drop_at_end(&self) -> anyhow::Result<()> { + let view = BinaryIndexedView::Script(self.builder.as_script()); + for (available, ty) in self.locals_availability.iter().zip(self.locals_ty.iter()) { + if *available { + let ability = view + .abilities(ty, &[]) + .map_err(|_| anyhow!("Failed to calculate ability for type"))?; + if !ability.has_drop() { + bail!("Unused non-droppable Move value"); + } + } + } + Ok(()) + } + + fn generate_batched_calls_impl(self, with_metadata: bool) -> anyhow::Result> { + self.check_drop_at_end()?; + let parameters_count = self.parameters_ty.len() as u16; + let mut script = self.builder.into_script(); + for call in self.calls { + for arg in call.arguments { + script.code.code.push(arg.to_instruction(parameters_count)?); + } + + // Calls + if call.type_args.is_empty() { + script.code.code.push(Bytecode::Call(call.call_idx)); + } else { + if script.function_instantiations.len() >= TableIndex::MAX as usize { + bail!("Too many function instantiations"); + } + let fi_idx = + FunctionInstantiationIndex(script.function_instantiations.len() as u16); + + let type_parameters = import_signature(&mut script, Signature(call.type_args))?; + + script.function_instantiations.push(FunctionInstantiation { + handle: call.call_idx, + type_parameters, + }); + script.code.code.push(Bytecode::CallGeneric(fi_idx)); + } + + // Storing return values + for arg in call.returns { + script + .code + .code + .push(Bytecode::StLoc((arg + parameters_count) as u8)); + } + } + script.code.code.push(Bytecode::Ret); + script.parameters = import_signature(&mut script, Signature(self.parameters_ty))?; + script.code.locals = import_signature(&mut script, Signature(self.locals_ty))?; + + move_bytecode_verifier::verify_script(&script).map_err(|err| anyhow!("{:?}", err))?; + if with_metadata { + script.metadata.push(Metadata { + key: APTOS_SCRIPT_COMPOSER_KEY.to_owned(), + value: bcs::to_bytes(&ComposerVersion::V1).unwrap(), + }); + } + let mut bytes = vec![]; + script + .serialize(&mut bytes) + .map_err(|err| anyhow!("Failed to serialize script: {:?}", err))?; + + Ok(bcs::to_bytes(&Script { + code: bytes, + ty_args: vec![], + args: self + .parameters + .into_iter() + .map(TransactionArgument::Serialized) + .collect(), + }) + .unwrap()) + } + + async fn load_module_impl(&mut self, api_url: &str, module_id: ModuleId) -> anyhow::Result<()> { + let url = format!( + "{}/{}/{}/{}/{}", + api_url, "accounts", &module_id.address, "module", &module_id.name + ); + let response = reqwest::get(url).await?; + let result = if response.status().is_success() { + Ok(response.text().await?) + } else { + Err(response.text().await?) + }; + + let bytes_result = match result { + Ok(json_string) => { + let v: Value = serde_json::from_str(&json_string)?; + Ok(v["bytecode"].to_string()) + }, + Err(json_string) => { + let v: Value = serde_json::from_str(&json_string)?; + Err(v["message"].to_string()) + }, + }; + + match bytes_result { + Ok(bytes_hex) => { + self.modules.insert( + module_id, + CompiledModule::deserialize( + hex::decode(bytes_hex.replace("0x", "").replace('\"', ""))?.as_slice(), + )?, + ); + Ok(()) + }, + Err(_message) => Ok(()), + } + } + + async fn load_type_tag_impl( + &mut self, + api_url: &str, + type_tag: &TypeTag, + ) -> anyhow::Result<()> { + match type_tag { + TypeTag::Struct(s) => { + self.load_module_impl(api_url, s.module_id()).await?; + for ty in s.type_args.iter() { + Box::pin(self.load_type_tag_impl(api_url, ty)).await?; + } + Ok(()) + }, + TypeTag::Vector(v) => Box::pin(self.load_type_tag_impl(api_url, v)).await, + _ => Ok(()), + } + } + + #[cfg(test)] + pub(crate) fn assert_decompilation_eq(&self, calls: &[MoveFunctionCall]) { + let script = self.builder.as_script(); + + assert_eq!(self.calls.len(), calls.len()); + for (lhs_call, rhs_call) in self.calls.iter().zip(calls.iter()) { + let fh = script.function_handle_at(lhs_call.call_idx); + assert_eq!( + script.identifier_at(fh.name), + rhs_call.function.as_ident_str() + ); + assert_eq!( + script.module_id_for_handle(script.module_handle_at(fh.module)), + rhs_call.module + ); + assert_eq!(lhs_call.type_tags, rhs_call.ty_args); + assert_eq!(lhs_call.arguments.len(), rhs_call.args.len()); + for (lhs_arg, rhs_arg) in lhs_call.arguments.iter().zip(rhs_call.args.iter()) { + self.check_argument_eq(lhs_arg, rhs_arg); + } + } + } + + #[cfg(test)] + fn check_argument_eq(&self, lhs: &AllocatedLocal, rhs: &CallArgument) { + use crate::PreviousResult; + + match rhs { + CallArgument::PreviousResult(PreviousResult { + call_idx, + return_idx, + operation_type, + }) => { + let local_idx = self.calls[*call_idx as usize].returns[*return_idx as usize]; + assert_eq!(lhs, &AllocatedLocal { + local_idx, + op_type: operation_type.clone(), + is_parameter: false, + }); + }, + CallArgument::Raw(input) => { + assert!(lhs.is_parameter); + assert_eq!(lhs.op_type, ArgumentOperation::Move); + assert_eq!( + &self.parameters[(lhs.local_idx - self.signer_count) as usize], + input + ); + }, + CallArgument::Signer(idx) => { + assert_eq!(lhs, &AllocatedLocal { + op_type: ArgumentOperation::Copy, + is_parameter: true, + local_idx: *idx + }) + }, + } + } +} + +impl AllocatedLocal { + fn to_instruction(&self, parameter_size: u16) -> anyhow::Result { + let local_idx = if self.is_parameter { + self.local_idx + } else { + parameter_size + .checked_add(self.local_idx) + .ok_or_else(|| anyhow!("Too many locals"))? + }; + if local_idx >= u8::MAX as u16 { + bail!("Too many locals"); + }; + Ok(match self.op_type { + ArgumentOperation::Borrow => Bytecode::ImmBorrowLoc(local_idx as u8), + ArgumentOperation::BorrowMut => Bytecode::MutBorrowLoc(local_idx as u8), + ArgumentOperation::Move => Bytecode::MoveLoc(local_idx as u8), + ArgumentOperation::Copy => Bytecode::CopyLoc(local_idx as u8), + }) + } +} diff --git a/aptos-move/script-composer/src/decompiler.rs b/aptos-move/script-composer/src/decompiler.rs new file mode 100644 index 0000000000000..8d9ee51ea2203 --- /dev/null +++ b/aptos-move/script-composer/src/decompiler.rs @@ -0,0 +1,282 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +//! Code to decode the series of individual Move calls from a compiled script. +//! +//! Core api is `generate_batched_call_payload` which takes in a compiled Move script and render it as a +//! series of `BatchedFunctionCall`. + +use crate::{ + ArgumentOperation, CallArgument, ComposerVersion, MoveFunctionCall, PreviousResult, + APTOS_SCRIPT_COMPOSER_KEY, +}; +use anyhow::{anyhow, bail, Result}; +use move_binary_format::{ + access::ScriptAccess, + file_format::{Bytecode, CompiledScript, SignatureToken}, +}; +use move_core_types::{ + identifier::Identifier, + language_storage::{ModuleId, StructTag, TypeTag}, + transaction_argument::{convert_txn_args, TransactionArgument}, +}; +use std::collections::BTreeMap; +use wasm_bindgen::{prelude::*, JsValue}; + +struct LocalState { + local_idx_to_return_idx: BTreeMap, + payload: Vec, + current_call: CallState, +} + +struct CallState { + args: Vec, + call_info: Option<(ModuleId, Identifier, Vec)>, + num_returns: u16, +} + +impl LocalState { + fn new() -> Self { + Self { + local_idx_to_return_idx: BTreeMap::new(), + payload: vec![], + current_call: CallState { + args: vec![], + call_info: None, + num_returns: 0, + }, + } + } + + fn process_script(&mut self, script: &CompiledScript, args: &[Vec]) -> anyhow::Result<()> { + let mut op_codes = script.code.code.iter().peekable(); + while !(matches!(op_codes.peek(), Some(Bytecode::Ret))) { + while !matches!( + op_codes.peek(), + Some(Bytecode::Call(_)) | Some(Bytecode::CallGeneric(_)) + ) { + let op_code = op_codes + .next() + .ok_or_else(|| anyhow!("Unexpected end of opcode sequence"))? + .clone(); + self.process_input_argument(op_code, script, args)?; + } + let op_code = op_codes + .next() + .ok_or_else(|| anyhow!("Unexpected end of opcode sequence"))? + .clone(); + self.process_call(op_code, script, args)?; + while matches!(op_codes.peek(), Some(Bytecode::StLoc(_))) { + let op_code = op_codes + .next() + .ok_or_else(|| anyhow!("Unexpected end of opcode sequence"))? + .clone(); + self.process_return(op_code, script, args)?; + } + self.add_new_call()?; + } + Ok(()) + } + + fn add_new_call(&mut self) -> anyhow::Result<()> { + let mut new_state = CallState { + args: vec![], + call_info: None, + num_returns: 0, + }; + std::mem::swap(&mut new_state, &mut self.current_call); + let (module, function, ty_args) = new_state + .call_info + .ok_or_else(|| anyhow!("Call information not available"))?; + self.payload.push(MoveFunctionCall { + module, + function, + ty_args, + args: new_state.args, + }); + Ok(()) + } + + fn process_input_argument( + &mut self, + op: Bytecode, + script: &CompiledScript, + args: &[Vec], + ) -> anyhow::Result<()> { + let (operation_type, local_idx) = match op { + Bytecode::MoveLoc(i) => (ArgumentOperation::Move, i), + Bytecode::CopyLoc(i) => (ArgumentOperation::Copy, i), + Bytecode::ImmBorrowLoc(i) => (ArgumentOperation::Borrow, i), + Bytecode::MutBorrowLoc(i) => (ArgumentOperation::BorrowMut, i), + _ => bail!("Unexpected opcode: {:?}", op), + }; + if local_idx as usize >= script.signature_at(script.parameters).0.len() { + // Local is a return value of previous output + let (call_idx, return_idx) = self + .local_idx_to_return_idx + .get(&local_idx) + .ok_or_else(|| anyhow!("Loading unknown index"))?; + self.current_call + .args + .push(CallArgument::PreviousResult(PreviousResult { + call_idx: *call_idx, + return_idx: *return_idx, + operation_type, + })) + } else { + // Local is an argument type + let signer_counts = script.signature_at(script.parameters).0.len() - args.len(); + if local_idx as usize >= signer_counts { + // Local is a passed in parameter + self.current_call.args.push(CallArgument::Raw( + args.get(local_idx as usize - signer_counts) + .ok_or_else(|| anyhow!("Parameter access out of bound"))? + .clone(), + )) + } else { + // Should signers be ignored to align with how we display script? + self.current_call + .args + .push(CallArgument::Signer(local_idx as u16)) + } + } + Ok(()) + } + + fn process_call( + &mut self, + op: Bytecode, + script: &CompiledScript, + _args: &[Vec], + ) -> anyhow::Result<()> { + let (fh_idx, ty_args) = match op { + Bytecode::Call(idx) => (idx, vec![]), + Bytecode::CallGeneric(idx) => { + let inst = script.function_instantiation_at(idx); + ( + inst.handle, + script + .signature_at(inst.type_parameters) + .0 + .iter() + .map(|tok| Self::type_tag_from_sig_token(script, tok)) + .collect::>>()?, + ) + }, + _ => bail!("Unexpected opcode: {:?}", op), + }; + let handle = script.function_handle_at(fh_idx); + let module = script.module_id_for_handle(script.module_handle_at(handle.module)); + let func_name = script.identifier_at(handle.name); + self.current_call.call_info = Some((module, func_name.to_owned(), ty_args)); + Ok(()) + } + + fn process_return( + &mut self, + op: Bytecode, + _script: &CompiledScript, + _args: &[Vec], + ) -> anyhow::Result<()> { + match op { + Bytecode::StLoc(i) => { + self.local_idx_to_return_idx.insert( + i, + (self.payload.len() as u16, self.current_call.num_returns), + ); + self.current_call.num_returns += 1; + }, + _ => bail!("Unexpected opcode: {:?}", op), + } + Ok(()) + } + + fn type_tag_from_sig_token( + script: &CompiledScript, + token: &SignatureToken, + ) -> anyhow::Result { + Ok(match token { + SignatureToken::Address => TypeTag::Address, + SignatureToken::U8 => TypeTag::U8, + SignatureToken::U16 => TypeTag::U16, + SignatureToken::U32 => TypeTag::U32, + SignatureToken::U64 => TypeTag::U64, + SignatureToken::U128 => TypeTag::U128, + SignatureToken::U256 => TypeTag::U256, + SignatureToken::Bool => TypeTag::Bool, + SignatureToken::Signer => TypeTag::Signer, + SignatureToken::Vector(s) => { + TypeTag::Vector(Box::new(Self::type_tag_from_sig_token(script, s)?)) + }, + SignatureToken::Struct(s) => { + let module_handle = script.module_handle_at(script.struct_handle_at(*s).module); + TypeTag::Struct(Box::new(StructTag { + module: script.identifier_at(module_handle.name).to_owned(), + address: *script.address_identifier_at(module_handle.address), + name: script + .identifier_at(script.struct_handle_at(*s).name) + .to_owned(), + type_args: vec![], + })) + }, + SignatureToken::TypeParameter(_) + | SignatureToken::Reference(_) + | SignatureToken::MutableReference(_) => { + bail!("Not supported arugment type: {:?}", token); + }, + SignatureToken::StructInstantiation(s, ty_args) => { + let module_handle = script.module_handle_at(script.struct_handle_at(*s).module); + TypeTag::Struct(Box::new(StructTag { + module: script.identifier_at(module_handle.name).to_owned(), + address: *script.address_identifier_at(module_handle.address), + name: script + .identifier_at(script.struct_handle_at(*s).name) + .to_owned(), + type_args: ty_args + .iter() + .map(|tok| Self::type_tag_from_sig_token(script, tok)) + .collect::>>()?, + })) + }, + }) + } +} + +/// Public function to decompiled a script and return the batched form for better readability. +pub fn generate_batched_call_payload( + script_code: &[u8], + args: &[TransactionArgument], +) -> anyhow::Result> { + let compiled_script = CompiledScript::deserialize(script_code) + .map_err(|err| anyhow!("Failed to deserialize payload: {:?}", err))?; + let expected_version = bcs::to_bytes(&ComposerVersion::V1) + .map_err(|err| anyhow!("Failed to serialize version metadata: {:?}", err))?; + if !compiled_script + .metadata + .iter() + .any(|md| md.key == APTOS_SCRIPT_COMPOSER_KEY && md.value == expected_version) + { + bail!("Script is not generated by script builder. Skip decompilation steps."); + } + let mut state = LocalState::new(); + let converted_args = convert_txn_args(args); + state.process_script(&compiled_script, &converted_args)?; + Ok(state.payload) +} + +/// Wrapper to decompile script in its serialized form. +pub fn generate_batched_call_payload_serialized( + script: &[u8], +) -> anyhow::Result> { + let script = bcs::from_bytes::(script)?; + generate_batched_call_payload(&script.code, &script.args) +} + +/// Wrapper to decompile script in its serialized form and wrap it with wasm errors. +#[wasm_bindgen] +pub fn generate_batched_call_payload_wasm( + script: Vec, +) -> Result, JsValue> { + generate_batched_call_payload_serialized(&script) + .map_err(|err| JsValue::from_str(format!("{:?}", err).as_str())) +} diff --git a/aptos-move/script-composer/src/helpers.rs b/aptos-move/script-composer/src/helpers.rs new file mode 100644 index 0000000000000..2bbab803fcfdc --- /dev/null +++ b/aptos-move/script-composer/src/helpers.rs @@ -0,0 +1,111 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use move_binary_format::{ + access::{ModuleAccess, ScriptAccess}, + builders::CompiledScriptBuilder, + errors::{PartialVMError, PartialVMResult}, + file_format::*, +}; +use move_core_types::{ + identifier::IdentStr, + language_storage::{ModuleId, TypeTag}, + transaction_argument::TransactionArgument, + vm_status::StatusCode, +}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Serialize, Deserialize)] +pub(crate) struct Script { + #[serde(with = "serde_bytes")] + pub code: Vec, + pub ty_args: Vec, + pub args: Vec, +} + +pub(crate) fn import_type_tag( + script_builder: &mut CompiledScriptBuilder, + type_tag: &TypeTag, + module_resolver: &BTreeMap, +) -> PartialVMResult { + Ok(match type_tag { + TypeTag::Address => SignatureToken::Address, + TypeTag::U8 => SignatureToken::U8, + TypeTag::U16 => SignatureToken::U16, + TypeTag::U32 => SignatureToken::U32, + TypeTag::U64 => SignatureToken::U64, + TypeTag::U128 => SignatureToken::U128, + TypeTag::U256 => SignatureToken::U256, + TypeTag::Bool => SignatureToken::Bool, + TypeTag::Signer => SignatureToken::Signer, + TypeTag::Vector(t) => SignatureToken::Vector(Box::new(import_type_tag( + script_builder, + t, + module_resolver, + )?)), + TypeTag::Struct(s) => { + let (module, handle_idx) = + find_struct(module_resolver, &s.module_id(), s.name.as_ident_str())?; + let struct_idx = script_builder.import_struct(module, handle_idx)?; + if s.type_args.is_empty() { + SignatureToken::Struct(struct_idx) + } else { + SignatureToken::StructInstantiation( + struct_idx, + s.type_args + .iter() + .map(|ty| import_type_tag(script_builder, ty, module_resolver)) + .collect::>>()?, + ) + } + }, + }) +} + +/// Given a module, return the handle idx of the named struct +pub(crate) fn find_struct<'a>( + map: &'a BTreeMap, + module_id: &ModuleId, + struct_name: &IdentStr, +) -> PartialVMResult<(&'a CompiledModule, StructHandleIndex)> { + if let Some(module) = map.get(module_id) { + for (idx, handle) in module.struct_handles().iter().enumerate() { + if module.identifier_at(handle.name) == struct_name { + return Ok((module, StructHandleIndex::new(idx as TableIndex))); + } + } + return Err( + PartialVMError::new(StatusCode::LOOKUP_FAILED).with_message(format!( + "Struct {}::{} doesn't yet exist in the cache", + module_id, struct_name + )), + ); + } + Err( + PartialVMError::new(StatusCode::LOOKUP_FAILED).with_message(format!( + "Module {} doesn't yet exist in the cache", + module_id + )), + ) +} + +/// Given a compiled script, add a signature into its pool if it's not present already. +pub(crate) fn import_signature( + script: &mut CompiledScript, + sig: Signature, +) -> PartialVMResult { + Ok(SignatureIndex( + match script.signatures().iter().position(|item| item == &sig) { + Some(idx) => idx, + None => { + let idx = script.signatures().len(); + if idx >= TableIndex::MAX as usize { + return Err(PartialVMError::new(StatusCode::INDEX_OUT_OF_BOUNDS)); + } + script.signatures.push(sig); + idx + }, + } as u16, + )) +} diff --git a/aptos-move/script-composer/src/lib.rs b/aptos-move/script-composer/src/lib.rs new file mode 100644 index 0000000000000..cdd212f4d953a --- /dev/null +++ b/aptos-move/script-composer/src/lib.rs @@ -0,0 +1,130 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +pub use crate::{ + builder::TransactionComposer, + decompiler::{generate_batched_call_payload, generate_batched_call_payload_wasm}, +}; +use move_core_types::{ + identifier::Identifier, + language_storage::{ModuleId, TypeTag}, +}; +use serde::{Deserialize, Serialize}; +use tsify_next::Tsify; +use wasm_bindgen::prelude::wasm_bindgen; + +mod builder; +mod decompiler; +mod helpers; + +#[cfg(test)] +pub mod tests; + +/// CompiledScript generated from script composer will have this key in its metadata to +/// distinguish from other scripts. +pub static APTOS_SCRIPT_COMPOSER_KEY: &[u8] = "aptos::script_composer".as_bytes(); + +/// Representing a returned value from a previous list of `MoveFunctionCall`s. +#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub struct PreviousResult { + /// Refering to the return value in the `call_idx`th call. + call_idx: u16, + /// Refering to the `return_idx`th return value in that call, since move function call can + /// return multiple values. + return_idx: u16, + /// How this result would be used. + operation_type: ArgumentOperation, +} + +/// Arguments to the `MoveFunctionCall`. +#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize, Tsify)] +#[tsify(into_wasm_abi, from_wasm_abi)] +pub enum CallArgument { + /// Passing raw bytes to the function. The bytes must follows the existing constraints for + /// transaction arguments. + Raw(Vec), + /// Refering to signer of the transaction. If it's a single signer transaction you will only + /// be able to access `Signer(0)`. You will be able to access other signers if it's a multi + /// agent transaction. + Signer(u16), + /// The arugment came from the returned value of a previous `MoveFunctionCall`. + PreviousResult(PreviousResult), +} + +/// How to consume the returned value coming from a previous `MoveFunctionCall`. +#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub enum ArgumentOperation { + /// Move the returned value to the next caller. This can be used for values that don't have + /// `copy` ability. + Move, + /// Copy the returned value and pass it to the next caller. + Copy, + /// Borrow an immutable reference from a returned value and pass it to the next caller. + Borrow, + /// Borrow a mutable reference from a returned value and pass it to the next caller. + BorrowMut, +} + +/// Calling a Move function. +/// +/// Similar to a public entry function call, but the arguments could specified as `CallArgument`, +/// which can be a return value of a previous `MoveFunctionCall`. +#[wasm_bindgen] +#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub struct MoveFunctionCall { + module: ModuleId, + function: Identifier, + ty_args: Vec, + args: Vec, +} + +/// Version of the script composer so that decompiler will know how to decode the script as we +/// upgrade. +#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] +pub enum ComposerVersion { + V1, +} + +impl MoveFunctionCall { + pub fn into_inner(self) -> (ModuleId, Identifier, Vec, Vec) { + (self.module, self.function, self.ty_args, self.args) + } +} + +#[wasm_bindgen] +impl CallArgument { + pub fn new_bytes(bytes: Vec) -> Self { + CallArgument::Raw(bytes) + } + + pub fn new_signer(signer_idx: u16) -> Self { + CallArgument::Signer(signer_idx) + } + + pub fn borrow(&self) -> Result { + self.change_op_type(ArgumentOperation::Borrow) + } + + pub fn borrow_mut(&self) -> Result { + self.change_op_type(ArgumentOperation::BorrowMut) + } + + pub fn copy(&self) -> Result { + self.change_op_type(ArgumentOperation::Copy) + } + + fn change_op_type(&self, operation_type: ArgumentOperation) -> Result { + match &self { + CallArgument::PreviousResult(r) => { + let mut result = r.clone(); + result.operation_type = operation_type; + Ok(CallArgument::PreviousResult(result)) + }, + _ => Err( + "Unexpected argument type, can only borrow from previous function results" + .to_string(), + ), + } + } +} diff --git a/aptos-move/script-composer/src/tests/mod.rs b/aptos-move/script-composer/src/tests/mod.rs new file mode 100644 index 0000000000000..a2d84338a7898 --- /dev/null +++ b/aptos-move/script-composer/src/tests/mod.rs @@ -0,0 +1,638 @@ +// Copyright © Aptos Foundation +// SPDX-License-Identifier: Apache-2.0 + +use crate::{CallArgument, TransactionComposer}; +use aptos_types::{ + state_store::state_key::StateKey, + transaction::{ExecutionStatus, TransactionStatus}, +}; +use e2e_move_tests::MoveHarness; +use move_binary_format::CompiledModule; +use move_core_types::{ + account_address::AccountAddress, language_storage::ModuleId, value::MoveValue, +}; +use std::{path::PathBuf, str::FromStr}; + +fn load_module(builder: &mut TransactionComposer, harness: &MoveHarness, module_name: &str) { + let module = ModuleId::from_str(module_name).unwrap(); + let bytes = harness + .read_state_value_bytes(&StateKey::module_id(&module)) + .unwrap(); + builder.insert_module(CompiledModule::deserialize(&bytes).unwrap()); +} + +#[test] +fn simple_builder() { + let mut h = MoveHarness::new(); + let alice = h.new_account_at(AccountAddress::from_hex_literal("0xcafe").unwrap()); + let bob = h.new_account_at(AccountAddress::from_hex_literal("0xface").unwrap()); + + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::aptos_account"); + builder + .add_batched_call( + "0x1::aptos_account".to_string(), + "transfer".to_string(), + vec![], + vec![ + CallArgument::new_signer(0), + CallArgument::new_bytes( + MoveValue::Address(*bob.address()) + .simple_serialize() + .unwrap(), + ), + CallArgument::new_bytes(MoveValue::U64(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + let script = builder.clone().generate_batched_calls(true).unwrap(); + + let txn = alice + .transaction() + .script(bcs::from_bytes(&script).unwrap()) + .sequence_number(10) + .sign(); + assert_eq!( + h.run(txn), + TransactionStatus::Keep(ExecutionStatus::Success) + ); + + assert_eq!(h.read_aptos_balance(bob.address()), 1_000_000_000_000_010); + + builder.assert_decompilation_eq( + &crate::decompiler::generate_batched_call_payload_serialized(&script).unwrap(), + ); +} + +#[test] +fn chained_deposit() { + let mut h = MoveHarness::new(); + let alice = h.new_account_at(AccountAddress::from_hex_literal("0xcafe").unwrap()); + let bob = h.new_account_at(AccountAddress::from_hex_literal("0xface").unwrap()); + + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::coin"); + load_module(&mut builder, &h, "0x1::aptos_coin"); + load_module(&mut builder, &h, "0x1::primary_fungible_store"); + let mut returns_1 = builder + .add_batched_call( + "0x1::coin".to_string(), + "withdraw".to_string(), + vec!["0x1::aptos_coin::AptosCoin".to_string()], + vec![ + CallArgument::new_signer(0), + CallArgument::new_bytes(MoveValue::U64(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + let mut returns_2 = builder + .add_batched_call( + "0x1::coin".to_string(), + "coin_to_fungible_asset".to_string(), + vec!["0x1::aptos_coin::AptosCoin".to_string()], + vec![returns_1.pop().unwrap()], + ) + .unwrap(); + builder + .add_batched_call( + "0x1::primary_fungible_store".to_string(), + "deposit".to_string(), + vec![], + vec![ + CallArgument::new_bytes( + MoveValue::Address(*bob.address()) + .simple_serialize() + .unwrap(), + ), + returns_2.pop().unwrap(), + ], + ) + .unwrap(); + + let script = builder.clone().generate_batched_calls(true).unwrap(); + + let txn = alice + .transaction() + .script(bcs::from_bytes(&script).unwrap()) + .sequence_number(10) + .sign(); + + assert_eq!( + h.run(txn), + TransactionStatus::Keep(ExecutionStatus::Success) + ); + + assert_eq!(h.read_aptos_balance(bob.address()), 1_000_000_000_000_010); + builder.assert_decompilation_eq( + &crate::decompiler::generate_batched_call_payload_serialized(&script).unwrap(), + ); +} + +#[test] +fn chained_deposit_mismatch() { + let mut h = MoveHarness::new(); + let bob = h.new_account_at(AccountAddress::from_hex_literal("0xface").unwrap()); + + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::coin"); + load_module(&mut builder, &h, "0x1::aptos_coin"); + load_module(&mut builder, &h, "0x1::primary_fungible_store"); + let mut returns_1 = builder + .add_batched_call( + "0x1::coin".to_string(), + "withdraw".to_string(), + vec!["0x1::aptos_coin::AptosCoin".to_string()], + vec![ + CallArgument::new_signer(0), + CallArgument::new_bytes(MoveValue::U64(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + assert!(builder + .add_batched_call( + "0x1::primary_fungible_store".to_string(), + "deposit".to_string(), + vec![], + vec![ + CallArgument::new_bytes( + MoveValue::Address(*bob.address()) + .simple_serialize() + .unwrap(), + ), + // Passing value of unexpected type + returns_1.pop().unwrap(), + ], + ) + .is_err()); +} + +#[test] +fn chained_deposit_invalid_copy() { + let mut h = MoveHarness::new(); + let bob = h.new_account_at(AccountAddress::from_hex_literal("0xface").unwrap()); + + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::coin"); + load_module(&mut builder, &h, "0x1::aptos_coin"); + load_module(&mut builder, &h, "0x1::primary_fungible_store"); + let mut returns_1 = builder + .add_batched_call( + "0x1::coin".to_string(), + "withdraw".to_string(), + vec!["0x1::aptos_coin::AptosCoin".to_string()], + vec![ + CallArgument::new_signer(0), + CallArgument::new_bytes(MoveValue::U64(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + let mut returns_2 = builder + .add_batched_call( + "0x1::coin".to_string(), + "coin_to_fungible_asset".to_string(), + vec!["0x1::aptos_coin::AptosCoin".to_string()], + vec![returns_1.pop().unwrap()], + ) + .unwrap(); + let return_val = returns_2.pop().unwrap(); + assert!(builder + .add_batched_call( + "0x1::primary_fungible_store".to_string(), + "deposit".to_string(), + vec![], + vec![ + CallArgument::new_bytes( + MoveValue::Address(*bob.address()) + .simple_serialize() + .unwrap(), + ), + // Copying a non-copyable value should be rejected. + return_val.copy().unwrap(), + ], + ) + .is_err()); + + assert!(builder + .add_batched_call( + "0x1::primary_fungible_store".to_string(), + "deposit".to_string(), + vec![], + vec![ + CallArgument::new_bytes( + MoveValue::Address(*bob.address()) + .simple_serialize() + .unwrap(), + ), + // Passing a reference should result in a type error + return_val.borrow().unwrap(), + ], + ) + .is_err()); +} + +#[test] +fn test_module() { + let mut h = MoveHarness::new(); + let account = h.new_account_at(AccountAddress::ONE); + let alice = h.new_account_at(AccountAddress::from_hex_literal("0xcafe").unwrap()); + let mut seq_num = 10; + + let module_path = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("src") + .join("tests") + .join("test_modules"); + h.publish_package_cache_building(&account, &module_path); + + let mut run_txn = |batch_builder: TransactionComposer, h: &mut MoveHarness| { + let script = batch_builder.generate_batched_calls(true).unwrap(); + let txn = alice + .transaction() + .script(bcs::from_bytes(&script).unwrap()) + .sequence_number(seq_num) + .sign(); + + seq_num += 1; + + assert_eq!( + h.run(txn), + TransactionStatus::Keep(ExecutionStatus::Success) + ); + }; + + // Create a copyable value and copy it twice + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_copyable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_copyable_value".to_string(), + vec![], + vec![ + returns_1.copy().unwrap(), + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_copyable_value".to_string(), + vec![], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + run_txn(builder, &mut h); + + // Create a copyable value and move it twice + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_copyable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_copyable_value".to_string(), + vec![], + vec![ + returns_1.clone(), + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + assert!(builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_copyable_value".to_string(), + vec![], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .is_err()); + + // Copying a non-copyable value should return error on call. + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + assert!(builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_non_droppable_value".to_string(), + vec![], + vec![ + returns_1.copy().unwrap(), + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .is_err()); + + // Create a value and pass it to the wrong type + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + assert!(builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_droppable_value".to_string(), + vec![], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .is_err()); + + // Create a non droppable value and never use it. + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let _returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + assert!(builder.generate_batched_calls(true).is_err()); + + // Create a value and pass by reference + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_copyable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "check_copyable_value".to_string(), + vec![], + vec![ + returns_1.borrow().unwrap(), + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_copyable_value".to_string(), + vec![], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + run_txn(builder, &mut h); + + // Create a value and pass by mutable reference and then mutate. + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "mutate_non_droppable_value".to_string(), + vec![], + vec![ + returns_1.borrow_mut().unwrap(), + CallArgument::new_bytes(MoveValue::U8(42).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_non_droppable_value".to_string(), + vec![], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(42).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + run_txn(builder, &mut h); + + // Create a value and pass it to a generic function + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + let returns_2 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "id".to_string(), + vec!["0x1::batched_execution::NonDroppableValue".to_string()], + vec![returns_1], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_non_droppable_value".to_string(), + vec![], + vec![ + returns_2, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + // Create a value and pass it to a generic function with invalid type. + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_non_droppable_value".to_string(), + vec![], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + assert!(builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "id".to_string(), + vec!["0x1::batched_execution::DroppableValue".to_string()], + vec![returns_1], + ) + .is_err()); + + // Create a droppable value with generics and don't use it + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_generic_droppable_value".to_string(), + vec!["0x1::batched_execution::Foo".to_string()], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap(); + run_txn(builder, &mut h); + + // Create a generic value and consume it + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_generic_non_droppable_value".to_string(), + vec!["0x1::batched_execution::Foo".to_string()], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_generic_non_droppable_value".to_string(), + vec!["0x1::batched_execution::Foo".to_string()], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .unwrap(); + + run_txn(builder, &mut h); + + // Create a generic value and destruct it with wrong type parameter. + let mut builder = TransactionComposer::single_signer(); + load_module(&mut builder, &h, "0x1::batched_execution"); + let returns_1 = builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "create_generic_non_droppable_value".to_string(), + vec!["0x1::batched_execution::Foo".to_string()], + vec![CallArgument::new_bytes( + MoveValue::U8(10).simple_serialize().unwrap(), + )], + ) + .unwrap() + .pop() + .unwrap(); + + assert!(builder + .add_batched_call( + "0x1::batched_execution".to_string(), + "consume_generic_non_droppable_value".to_string(), + vec!["0x1::batched_execution::Bar".to_string()], + vec![ + returns_1, + CallArgument::new_bytes(MoveValue::U8(10).simple_serialize().unwrap()), + ], + ) + .is_err()); +} diff --git a/aptos-move/script-composer/src/tests/test_modules/Move.toml b/aptos-move/script-composer/src/tests/test_modules/Move.toml new file mode 100644 index 0000000000000..b68f376cc8ac7 --- /dev/null +++ b/aptos-move/script-composer/src/tests/test_modules/Move.toml @@ -0,0 +1,6 @@ +[package] +name = "test_modules" +version = "1.0.0" +authors = [] + +[addresses] diff --git a/aptos-move/script-composer/src/tests/test_modules/sources/test.move b/aptos-move/script-composer/src/tests/test_modules/sources/test.move new file mode 100644 index 0000000000000..fbbc7cab8269b --- /dev/null +++ b/aptos-move/script-composer/src/tests/test_modules/sources/test.move @@ -0,0 +1,76 @@ +module 0x1::batched_execution { + struct Foo has drop {} + struct Bar {} + + struct DroppableValue has drop { + val: u8, + } + + struct NonDroppableValue { + val: u8, + } + + struct CopyableValue has copy { + val: u8, + } + + public fun create_droppable_value(val: u8): DroppableValue { + DroppableValue { val } + } + + public fun create_non_droppable_value(val: u8): NonDroppableValue { + NonDroppableValue { val } + } + + public fun create_copyable_value(val: u8): CopyableValue { + CopyableValue { val } + } + + public fun consume_droppable_value(v: DroppableValue, expected_val: u8) { + let DroppableValue { val } = v; + assert!(val == expected_val, 10); + } + + public fun consume_non_droppable_value(v: NonDroppableValue, expected_val: u8) { + let NonDroppableValue { val } = v; + assert!(val == expected_val, 10); + } + + public fun consume_copyable_value(v: CopyableValue, expected_val: u8) { + let CopyableValue { val } = v; + assert!(val == expected_val, 10); + } + + public fun check_copyable_value(v: &CopyableValue, expected_val: u8) { + assert!(v.val == expected_val, 10); + } + + public fun mutate_non_droppable_value(v: &mut NonDroppableValue, new_val: u8) { + v.val = new_val; + } + + public fun id(t: T): T { + t + } + + struct GenericDroppableValue has drop { + val: u8 + } + + struct GenericNonDroppableValue { + val: u8 + } + + public fun create_generic_droppable_value(val: u8): GenericDroppableValue { + GenericDroppableValue { val } + } + + public fun create_generic_non_droppable_value(val: u8): GenericNonDroppableValue { + GenericNonDroppableValue { val } + } + + public fun consume_generic_non_droppable_value(v: GenericNonDroppableValue, expected_val: u8) { + let GenericNonDroppableValue { val } = v; + assert!(val == expected_val, 10); + } +} diff --git a/crates/aptos/CHANGELOG.md b/crates/aptos/CHANGELOG.md index 882dd1dd4ac76..ff469c04b0232 100644 --- a/crates/aptos/CHANGELOG.md +++ b/crates/aptos/CHANGELOG.md @@ -3,6 +3,9 @@ All notable changes to the Aptos CLI will be captured in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html) and the format set out by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased + +## [4.3.0] - 2024/10/30 +- Allow for setting large-packages module for chunking publish mode with `--large-packages-module-address` - [`Fix`] Remove unwraps to make outputs go through regular error handling ## [4.2.6] - 2024/10/23 diff --git a/crates/aptos/Cargo.toml b/crates/aptos/Cargo.toml index ca6e7627773b0..4f31c89554ae3 100644 --- a/crates/aptos/Cargo.toml +++ b/crates/aptos/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "aptos" description = "Aptos tool for management of nodes and interacting with the blockchain" -version = "4.2.6" +version = "4.3.0" # Workspace inherited keys authors = { workspace = true } diff --git a/crates/aptos/src/common/types.rs b/crates/aptos/src/common/types.rs index dc8b22e8f758e..581a0caaeec3e 100644 --- a/crates/aptos/src/common/types.rs +++ b/crates/aptos/src/common/types.rs @@ -25,6 +25,7 @@ use aptos_crypto::{ encoding_type::{EncodingError, EncodingType}, x25519, PrivateKey, ValidCryptoMaterialStringExt, }; +use aptos_framework::chunked_publish::LARGE_PACKAGES_MODULE_ADDRESS; use aptos_global_constants::adjust_gas_headroom; use aptos_keygen::KeyGen; use aptos_logger::Level; @@ -2350,4 +2351,12 @@ pub struct ChunkedPublishOption { /// Use this option for publishing large packages exceeding `MAX_PUBLISH_PACKAGE_SIZE`. #[clap(long)] pub(crate) chunked_publish: bool, + + /// Address of the `large_packages` move module for chunked publishing + /// + /// By default, on the module is published at `0x0e1ca3011bdd07246d4d16d909dbb2d6953a86c4735d5acf5865d962c630cce7` + /// on Testnet and Mainnet. On any other network, you will need to first publish it from the framework + /// under move-examples/large_packages. + #[clap(long, default_value = LARGE_PACKAGES_MODULE_ADDRESS, value_parser = crate::common::types::load_account_arg)] + pub(crate) large_packages_module_address: AccountAddress, } diff --git a/crates/aptos/src/move_tool/mod.rs b/crates/aptos/src/move_tool/mod.rs index 87959c5785e2e..4b9b6e2dfb196 100644 --- a/crates/aptos/src/move_tool/mod.rs +++ b/crates/aptos/src/move_tool/mod.rs @@ -816,8 +816,12 @@ impl AsyncTryInto for &PublishPackage { async fn async_try_into(self) -> Result { let package = build_package_options(&self.move_options, &self.included_artifacts_args)?; - let chunked_publish_payloads = - create_chunked_publish_payloads(package, PublishType::AccountDeploy, None)?; + let chunked_publish_payloads = create_chunked_publish_payloads( + package, + PublishType::AccountDeploy, + None, + self.chunked_publish_option.large_packages_module_address, + )?; let size = &chunked_publish_payloads .payloads @@ -1008,6 +1012,7 @@ fn create_chunked_publish_payloads( package: BuiltPackage, publish_type: PublishType, object_address: Option, + large_packages_module_address: AccountAddress, ) -> CliTypedResult { let compiled_units = package.extract_code(); let metadata = package.extract_metadata()?; @@ -1024,6 +1029,7 @@ fn create_chunked_publish_payloads( compiled_units, publish_type, maybe_object_address, + large_packages_module_address, ); Ok(ChunkedPublishPayloads { payloads }) @@ -1044,6 +1050,7 @@ impl CliCommand for PublishPackage { submit_chunked_publish_transactions( chunked_package_payloads.payloads, &self.txn_options, + self.chunked_publish_option.large_packages_module_address, ) .await } else { @@ -1145,9 +1152,13 @@ impl CliCommand for CreateObjectAndPublishPackage { self.move_options .add_named_address(self.address_name.clone(), mock_object_address.to_string()); let package = build_package_options(&self.move_options, &self.included_artifacts_args)?; - let mock_payloads = - create_chunked_publish_payloads(package, PublishType::AccountDeploy, None)? - .payloads; + let mock_payloads = create_chunked_publish_payloads( + package, + PublishType::AccountDeploy, + None, + self.chunked_publish_option.large_packages_module_address, + )? + .payloads; let staging_tx_count = (mock_payloads.len() - 1) as u64; self.txn_options.sequence_number(sender_address).await? + staging_tx_count + 1 } else { @@ -1167,8 +1178,13 @@ impl CliCommand for CreateObjectAndPublishPackage { prompt_yes_with_override(&message, self.txn_options.prompt_options)?; let result = if self.chunked_publish_option.chunked_publish { - let payloads = - create_chunked_publish_payloads(package, PublishType::ObjectDeploy, None)?.payloads; + let payloads = create_chunked_publish_payloads( + package, + PublishType::ObjectDeploy, + None, + self.chunked_publish_option.large_packages_module_address, + )? + .payloads; let size = &payloads .iter() @@ -1178,7 +1194,12 @@ impl CliCommand for CreateObjectAndPublishPackage { let message = format!("Publishing package in chunked mode will submit {} transactions for staging and publishing code.\n", &payloads.len()); println!("{}", message.bold()); - submit_chunked_publish_transactions(payloads, &self.txn_options).await + submit_chunked_publish_transactions( + payloads, + &self.txn_options, + self.chunked_publish_option.large_packages_module_address, + ) + .await } else { let payload = create_package_publication_data( package, @@ -1273,6 +1294,7 @@ impl CliCommand for UpgradeObjectPackage { built_package, PublishType::ObjectUpgrade, Some(self.object_address), + self.chunked_publish_option.large_packages_module_address, )? .payloads; @@ -1283,7 +1305,12 @@ impl CliCommand for UpgradeObjectPackage { println!("package size {} bytes", size); let message = format!("Upgrading package in chunked mode will submit {} transactions for staging and upgrading code.\n", &payloads.len()); println!("{}", message.bold()); - submit_chunked_publish_transactions(payloads, &self.txn_options).await + submit_chunked_publish_transactions( + payloads, + &self.txn_options, + self.chunked_publish_option.large_packages_module_address, + ) + .await } else { let payload = create_package_publication_data( built_package, @@ -1354,9 +1381,13 @@ impl CliCommand for DeployObjectCode { self.move_options .add_named_address(self.address_name.clone(), mock_object_address.to_string()); let package = build_package_options(&self.move_options, &self.included_artifacts_args)?; - let mock_payloads = - create_chunked_publish_payloads(package, PublishType::AccountDeploy, None)? - .payloads; + let mock_payloads = create_chunked_publish_payloads( + package, + PublishType::AccountDeploy, + None, + self.chunked_publish_option.large_packages_module_address, + )? + .payloads; let staging_tx_count = (mock_payloads.len() - 1) as u64; self.txn_options.sequence_number(sender_address).await? + staging_tx_count + 1 } else { @@ -1376,8 +1407,13 @@ impl CliCommand for DeployObjectCode { prompt_yes_with_override(&message, self.txn_options.prompt_options)?; let result = if self.chunked_publish_option.chunked_publish { - let payloads = - create_chunked_publish_payloads(package, PublishType::ObjectDeploy, None)?.payloads; + let payloads = create_chunked_publish_payloads( + package, + PublishType::ObjectDeploy, + None, + self.chunked_publish_option.large_packages_module_address, + )? + .payloads; let size = &payloads .iter() @@ -1387,7 +1423,12 @@ impl CliCommand for DeployObjectCode { let message = format!("Publishing package in chunked mode will submit {} transactions for staging and publishing code.\n", &payloads.len()); println!("{}", message.bold()); - submit_chunked_publish_transactions(payloads, &self.txn_options).await + submit_chunked_publish_transactions( + payloads, + &self.txn_options, + self.chunked_publish_option.large_packages_module_address, + ) + .await } else { let payload = create_package_publication_data( package, @@ -1488,6 +1529,7 @@ impl CliCommand for UpgradeCodeObject { package, PublishType::ObjectUpgrade, Some(self.object_address), + self.chunked_publish_option.large_packages_module_address, )? .payloads; @@ -1498,7 +1540,12 @@ impl CliCommand for UpgradeCodeObject { println!("package size {} bytes", size); let message = format!("Upgrading package in chunked mode will submit {} transactions for staging and upgrading code.\n", &payloads.len()); println!("{}", message.bold()); - submit_chunked_publish_transactions(payloads, &self.txn_options).await + submit_chunked_publish_transactions( + payloads, + &self.txn_options, + self.chunked_publish_option.large_packages_module_address, + ) + .await } else { let payload = create_package_publication_data( package, @@ -1547,6 +1594,7 @@ fn build_package_options( async fn submit_chunked_publish_transactions( payloads: Vec, txn_options: &TransactionOptions, + large_packages_module_address: AccountAddress, ) -> CliTypedResult { let mut publishing_result = Err(CliError::UnexpectedError( "No payload provided for batch transaction run".to_string(), @@ -1556,12 +1604,12 @@ async fn submit_chunked_publish_transactions( let account_address = txn_options.profile_options.account_address()?; - if !is_staging_area_empty(txn_options).await? { + if !is_staging_area_empty(txn_options, large_packages_module_address).await? { let message = format!( "The resource {}::large_packages::StagingArea under account {} is not empty.\ \nThis may cause package publishing to fail if the data is unexpected. \ \nUse the `aptos move clear-staging-area` command to clean up the `StagingArea` resource under the account.", - LARGE_PACKAGES_MODULE_ADDRESS, account_address, + large_packages_module_address, account_address, ) .bold(); println!("{}", message); @@ -1616,7 +1664,10 @@ async fn submit_chunked_publish_transactions( publishing_result } -async fn is_staging_area_empty(txn_options: &TransactionOptions) -> CliTypedResult { +async fn is_staging_area_empty( + txn_options: &TransactionOptions, + large_packages_module_address: AccountAddress, +) -> CliTypedResult { let url = txn_options.rest_options.url(&txn_options.profile_options)?; let client = Client::new(url); @@ -1625,7 +1676,7 @@ async fn is_staging_area_empty(txn_options: &TransactionOptions) -> CliTypedResu txn_options.profile_options.account_address()?, &format!( "{}::large_packages::StagingArea", - LARGE_PACKAGES_MODULE_ADDRESS + large_packages_module_address ), ) .await; @@ -1649,6 +1700,10 @@ async fn is_staging_area_empty(txn_options: &TransactionOptions) -> CliTypedResu pub struct ClearStagingArea { #[clap(flatten)] pub(crate) txn_options: TransactionOptions, + + /// Address of the `large_packages` move module for chunked publishing + #[clap(long, default_value = LARGE_PACKAGES_MODULE_ADDRESS, value_parser = crate::common::types::load_account_arg)] + pub(crate) large_packages_module_address: AccountAddress, } #[async_trait] @@ -1660,10 +1715,10 @@ impl CliCommand for ClearStagingArea { async fn execute(self) -> CliTypedResult { println!( "Cleaning up resource {}::large_packages::StagingArea under account {}.", - LARGE_PACKAGES_MODULE_ADDRESS, + &self.large_packages_module_address, self.txn_options.profile_options.account_address()? ); - let payload = large_packages_cleanup_staging_area(); + let payload = large_packages_cleanup_staging_area(self.large_packages_module_address); self.txn_options .submit_transaction(payload) .await diff --git a/crates/aptos/src/test/mod.rs b/crates/aptos/src/test/mod.rs index 7f2b139885ff1..c92fa415c0bd9 100644 --- a/crates/aptos/src/test/mod.rs +++ b/crates/aptos/src/test/mod.rs @@ -53,6 +53,7 @@ use aptos_crypto::{ ed25519::{Ed25519PrivateKey, Ed25519PublicKey}, x25519, PrivateKey, }; +use aptos_framework::chunked_publish::LARGE_PACKAGES_MODULE_ADDRESS; use aptos_genesis::config::HostAndPort; use aptos_keygen::KeyGen; use aptos_logger::warn; @@ -895,6 +896,10 @@ impl CliTestFramework { }, chunked_publish_option: ChunkedPublishOption { chunked_publish: false, + large_packages_module_address: AccountAddress::from_str( + LARGE_PACKAGES_MODULE_ADDRESS, + ) + .unwrap(), }, } .execute() diff --git a/crates/transaction-generator-lib/src/publishing/publish_util.rs b/crates/transaction-generator-lib/src/publishing/publish_util.rs index 6bc18b01eec7f..75b2bf7ee3a46 100644 --- a/crates/transaction-generator-lib/src/publishing/publish_util.rs +++ b/crates/transaction-generator-lib/src/publishing/publish_util.rs @@ -2,7 +2,9 @@ // SPDX-License-Identifier: Apache-2.0 use crate::publishing::{module_simple, raw_module_data}; -use aptos_framework::{natives::code::PackageMetadata, KnownAttribute}; +use aptos_framework::{ + natives::code::PackageMetadata, KnownAttribute, APTOS_METADATA_KEY, APTOS_METADATA_KEY_V1, +}; use aptos_sdk::{ bcs, move_types::{identifier::Identifier, language_storage::ModuleId}, @@ -272,10 +274,17 @@ fn update( } }); }); - assert!(new_module.metadata.len() == 1); + let mut count = 0; new_module.metadata.iter_mut().for_each(|metadata_holder| { - metadata_holder.value = bcs::to_bytes(&metadata).expect("Metadata must serialize"); - }) + if metadata_holder.key == APTOS_METADATA_KEY_V1 + || metadata_holder.key == APTOS_METADATA_KEY + { + metadata_holder.value = + bcs::to_bytes(&metadata).expect("Metadata must serialize"); + count += 1; + } + }); + assert!(count == 1, "{:?}", new_module.metadata); } new_modules.push((original_name.clone(), new_module)); diff --git a/crates/transaction-generator-lib/src/publishing/raw_module_data.rs b/crates/transaction-generator-lib/src/publishing/raw_module_data.rs index c46f5cacc01b3..66e6fe439a825 100644 --- a/crates/transaction-generator-lib/src/publishing/raw_module_data.rs +++ b/crates/transaction-generator-lib/src/publishing/raw_module_data.rs @@ -19,10 +19,10 @@ use std::collections::HashMap; pub static PACKAGE_COMPLEX_METADATA: Lazy> = Lazy::new(|| { vec![ 7, 99, 111, 109, 112, 108, 101, 120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 53, 51, 55, 56, 49, 65, 49, 50, 49, 55, 53, 56, 66, 55, 56, 70, 54, 56, - 54, 56, 53, 69, 54, 70, 68, 66, 51, 55, 67, 57, 70, 48, 48, 57, 49, 68, - 53, 57, 52, 52, 55, 50, 54, 57, 69, 57, 48, 51, 70, 48, 53, 65, 49, 65, - 66, 66, 51, 50, 66, 66, 67, 66, 70, 50, 156, 1, 31, 139, 8, 0, 0, 0, + 67, 48, 56, 54, 51, 53, 54, 52, 53, 50, 54, 68, 66, 70, 66, 68, 48, 52, + 49, 52, 56, 49, 51, 68, 48, 53, 66, 52, 55, 50, 51, 70, 51, 49, 67, 65, + 48, 67, 69, 57, 57, 56, 48, 68, 68, 68, 54, 54, 49, 70, 67, 51, 51, 49, + 48, 67, 67, 49, 66, 56, 57, 52, 55, 51, 156, 1, 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 77, 141, 77, 14, 194, 32, 16, 133, 247, 156, 130, 116, 195, 74, 138, 7, 112, 81, 53, 94, 162, 105, 12, 194, 168, 164, 192, 16, 70, 107, 19, 227, 221, 133, 164, 154, 38, 179, 152, 247, 229, 253, 244, 73, 155, 81, 223, 96, 96, 81, @@ -50,665 +50,680 @@ pub static PACKAGE_COMPLEX_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_COMPLEX_LIQUIDITY_POOL: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 13, 1, 0, 30, 2, 30, 82, 3, 112, 181, - 3, 4, 165, 4, 86, 5, 251, 4, 226, 6, 7, 221, 11, 232, 12, 8, 197, 24, - 64, 6, 133, 25, 169, 1, 16, 174, 26, 149, 9, 10, 195, 35, 131, 1, 12, 198, - 36, 199, 23, 13, 141, 60, 38, 15, 179, 60, 2, 0, 1, 1, 2, 1, 3, 1, - 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, - 13, 1, 14, 1, 15, 0, 16, 6, 0, 0, 17, 8, 0, 0, 18, 4, 0, 0, - 19, 8, 0, 0, 20, 8, 0, 0, 21, 6, 0, 7, 22, 7, 1, 0, 1, 4, - 24, 0, 0, 4, 27, 8, 0, 7, 29, 2, 0, 4, 31, 8, 0, 11, 55, 4, - 2, 0, 0, 0, 0, 4, 60, 6, 0, 4, 62, 6, 0, 4, 64, 6, 0, 12, - 70, 4, 1, 0, 0, 13, 86, 7, 0, 8, 93, 7, 1, 0, 0, 0, 23, 0, - 1, 0, 0, 25, 2, 3, 0, 0, 26, 4, 5, 0, 0, 28, 6, 7, 0, 0, - 30, 8, 9, 0, 0, 32, 10, 11, 1, 8, 0, 33, 12, 13, 0, 0, 34, 14, - 15, 0, 0, 35, 16, 0, 0, 0, 36, 7, 17, 0, 0, 1, 18, 7, 0, 0, - 37, 18, 19, 0, 0, 38, 18, 20, 0, 0, 39, 21, 22, 1, 8, 0, 40, 0, - 23, 0, 0, 41, 24, 0, 0, 0, 42, 21, 13, 1, 8, 0, 43, 7, 25, 0, - 0, 44, 26, 27, 0, 0, 45, 7, 23, 0, 0, 46, 0, 23, 0, 0, 47, 28, - 0, 0, 0, 48, 4, 0, 0, 12, 76, 30, 23, 1, 0, 12, 77, 31, 32, 1, - 0, 10, 78, 16, 19, 0, 7, 79, 35, 19, 1, 8, 11, 80, 37, 17, 2, 2, - 0, 11, 81, 38, 39, 2, 3, 0, 4, 82, 41, 27, 1, 8, 4, 83, 21, 42, - 1, 8, 4, 84, 21, 27, 1, 8, 11, 85, 45, 46, 2, 3, 0, 13, 87, 48, - 49, 0, 4, 88, 21, 49, 1, 8, 13, 89, 50, 0, 0, 13, 90, 51, 0, 0, - 1, 91, 32, 48, 1, 0, 14, 89, 53, 0, 1, 0, 7, 92, 54, 55, 0, 8, - 94, 0, 56, 1, 0, 9, 95, 57, 0, 0, 7, 96, 8, 58, 0, 7, 97, 8, - 21, 1, 8, 4, 98, 59, 11, 1, 8, 7, 99, 16, 55, 0, 11, 100, 0, 60, - 2, 7, 4, 7, 101, 21, 62, 2, 8, 8, 12, 102, 63, 0, 1, 4, 3, 103, - 65, 0, 1, 6, 4, 104, 8, 66, 0, 4, 105, 8, 67, 0, 4, 106, 8, 68, - 0, 9, 107, 10, 11, 1, 8, 9, 108, 10, 11, 1, 8, 4, 109, 21, 17, 1, - 8, 4, 110, 69, 0, 1, 8, 4, 111, 21, 23, 1, 8, 2, 112, 23, 23, 0, - 12, 100, 0, 72, 1, 4, 7, 113, 19, 21, 1, 8, 7, 114, 74, 19, 0, 4, - 115, 21, 75, 1, 8, 8, 116, 56, 65, 1, 0, 4, 117, 77, 42, 0, 4, 118, - 77, 23, 0, 5, 119, 22, 22, 0, 4, 120, 78, 0, 1, 8, 6, 121, 13, 23, - 0, 4, 122, 79, 0, 1, 8, 4, 41, 80, 27, 0, 4, 123, 81, 0, 1, 8, - 4, 124, 84, 27, 0, 4, 125, 87, 0, 1, 8, 9, 111, 10, 23, 1, 8, 11, - 77, 37, 46, 2, 2, 0, 11, 126, 89, 90, 2, 3, 2, 11, 127, 89, 0, 2, - 3, 2, 23, 7, 24, 7, 26, 34, 27, 36, 28, 36, 29, 40, 30, 40, 31, 43, - 32, 36, 34, 43, 26, 43, 37, 19, 38, 52, 37, 17, 40, 22, 43, 43, 44, 43, - 46, 36, 47, 61, 48, 7, 49, 64, 53, 65, 54, 65, 55, 40, 26, 65, 56, 40, - 57, 40, 59, 7, 60, 34, 62, 65, 63, 22, 5, 34, 62, 34, 67, 34, 69, 40, - 71, 40, 49, 85, 73, 40, 74, 34, 13, 34, 75, 36, 76, 36, 77, 36, 0, 1, - 10, 11, 6, 1, 8, 3, 3, 6, 12, 6, 12, 11, 6, 1, 8, 3, 2, 8, - 7, 8, 7, 2, 5, 11, 6, 1, 8, 3, 2, 4, 4, 4, 6, 12, 11, 6, - 1, 8, 8, 11, 6, 1, 8, 8, 1, 1, 11, 6, 1, 8, 3, 1, 6, 8, - 9, 1, 8, 2, 2, 5, 11, 6, 1, 9, 0, 1, 11, 6, 1, 8, 10, 3, - 11, 6, 1, 8, 3, 11, 6, 1, 8, 8, 3, 2, 3, 3, 3, 15, 15, 15, - 1, 15, 1, 6, 12, 1, 1, 3, 11, 6, 1, 8, 8, 11, 6, 1, 8, 8, - 1, 1, 5, 2, 1, 5, 1, 11, 6, 1, 9, 0, 1, 4, 1, 3, 4, 6, - 12, 8, 7, 8, 7, 1, 1, 10, 11, 6, 1, 8, 8, 3, 6, 12, 11, 6, - 1, 8, 3, 8, 7, 1, 8, 7, 4, 6, 12, 11, 6, 1, 8, 3, 5, 3, - 4, 6, 11, 15, 1, 11, 6, 1, 8, 3, 3, 3, 10, 11, 6, 1, 8, 3, - 1, 6, 11, 15, 1, 9, 0, 2, 6, 11, 15, 1, 9, 0, 3, 1, 6, 9, - 0, 11, 4, 4, 8, 7, 8, 7, 4, 4, 8, 7, 8, 7, 7, 8, 1, 5, - 6, 8, 3, 1, 8, 3, 1, 6, 11, 6, 1, 9, 0, 2, 5, 4, 2, 6, - 11, 11, 2, 9, 0, 9, 1, 9, 0, 2, 7, 11, 11, 2, 9, 0, 9, 1, - 9, 0, 1, 9, 1, 1, 8, 10, 3, 6, 12, 11, 6, 1, 9, 0, 3, 1, - 11, 6, 1, 8, 8, 1, 8, 8, 8, 4, 5, 6, 11, 11, 2, 5, 4, 4, - 5, 6, 11, 11, 2, 5, 4, 4, 6, 8, 1, 3, 6, 11, 11, 2, 9, 0, - 9, 1, 9, 0, 6, 9, 1, 1, 6, 9, 1, 40, 5, 11, 6, 1, 8, 10, - 8, 9, 11, 6, 1, 8, 10, 8, 9, 11, 6, 1, 8, 10, 8, 9, 11, 6, - 1, 8, 10, 6, 12, 7, 10, 2, 5, 7, 10, 2, 8, 9, 12, 3, 8, 2, - 8, 9, 7, 8, 4, 1, 1, 11, 6, 1, 8, 8, 6, 8, 9, 11, 6, 1, - 8, 3, 6, 8, 9, 6, 12, 6, 12, 10, 2, 10, 2, 11, 6, 1, 8, 8, - 11, 6, 1, 8, 8, 11, 6, 1, 8, 8, 11, 6, 1, 8, 8, 11, 6, 1, - 8, 8, 11, 6, 1, 8, 8, 11, 6, 1, 8, 8, 11, 6, 1, 8, 8, 11, - 6, 1, 8, 8, 11, 6, 1, 8, 8, 8, 16, 8, 16, 1, 10, 2, 1, 8, - 16, 2, 7, 8, 16, 8, 16, 2, 7, 8, 16, 10, 2, 1, 2, 2, 7, 10, - 9, 0, 10, 9, 0, 2, 6, 12, 10, 2, 1, 8, 9, 1, 11, 17, 1, 9, - 0, 7, 6, 8, 9, 11, 17, 1, 4, 8, 16, 8, 16, 2, 8, 16, 8, 16, - 1, 12, 2, 6, 8, 9, 11, 6, 1, 9, 0, 1, 11, 11, 2, 9, 0, 9, - 1, 2, 8, 8, 8, 3, 1, 11, 6, 1, 9, 1, 2, 7, 11, 15, 1, 9, - 0, 9, 0, 1, 8, 0, 1, 9, 0, 1, 8, 12, 1, 8, 13, 1, 8, 14, - 3, 6, 8, 14, 11, 6, 1, 9, 0, 1, 18, 15, 15, 15, 15, 3, 15, 3, - 3, 3, 15, 6, 8, 3, 6, 8, 3, 15, 15, 15, 15, 15, 15, 11, 15, 15, - 3, 15, 15, 15, 15, 15, 15, 15, 15, 1, 11, 15, 1, 9, 0, 10, 5, 7, - 10, 2, 5, 7, 10, 2, 5, 6, 5, 1, 10, 2, 11, 6, 1, 8, 8, 11, - 6, 1, 8, 8, 2, 6, 5, 10, 2, 1, 11, 17, 1, 4, 26, 1, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 11, 6, 1, 8, 10, 4, 8, 7, 6, 8, - 13, 11, 6, 1, 8, 3, 6, 8, 3, 3, 3, 11, 6, 1, 8, 10, 11, 6, - 1, 8, 10, 11, 6, 1, 8, 8, 3, 11, 6, 1, 8, 8, 3, 3, 1, 6, - 8, 7, 3, 6, 8, 13, 11, 6, 1, 9, 0, 3, 2, 11, 6, 1, 9, 0, - 8, 7, 2, 6, 8, 13, 3, 3, 6, 8, 14, 11, 6, 1, 9, 0, 8, 7, - 1, 6, 8, 3, 22, 15, 8, 7, 15, 3, 3, 8, 7, 7, 8, 1, 3, 4, - 11, 6, 1, 8, 8, 15, 15, 8, 7, 6, 8, 3, 6, 8, 3, 6, 8, 3, - 15, 15, 15, 15, 11, 6, 1, 8, 10, 11, 6, 1, 8, 10, 2, 7, 8, 7, - 3, 1, 8, 5, 3, 5, 11, 6, 1, 8, 10, 11, 6, 1, 8, 10, 4, 6, - 8, 14, 11, 6, 1, 9, 0, 11, 6, 1, 9, 0, 3, 19, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 7, 8, 1, 4, 4, 4, 4, 7, 4, 7, - 4, 3, 7, 11, 11, 2, 9, 0, 9, 1, 9, 0, 9, 1, 1, 7, 9, 1, - 22, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, 95, 119, 114, - 97, 112, 112, 101, 114, 14, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, - 111, 108, 3, 98, 99, 115, 5, 101, 114, 114, 111, 114, 5, 101, 118, 101, 110, 116, - 14, 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 7, 109, 97, - 116, 104, 49, 50, 56, 6, 109, 97, 116, 104, 54, 52, 6, 111, 98, 106, 101, 99, - 116, 6, 111, 112, 116, 105, 111, 110, 22, 112, 114, 105, 109, 97, 114, 121, 95, 102, - 117, 110, 103, 105, 98, 108, 101, 95, 115, 116, 111, 114, 101, 6, 115, 105, 103, 110, - 101, 114, 11, 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, 101, 12, 115, 109, 97, - 114, 116, 95, 118, 101, 99, 116, 111, 114, 6, 115, 116, 114, 105, 110, 103, 6, 118, - 101, 99, 116, 111, 114, 10, 67, 114, 101, 97, 116, 101, 80, 111, 111, 108, 14, 70, - 101, 101, 115, 65, 99, 99, 111, 117, 110, 116, 105, 110, 103, 11, 76, 80, 84, 111, - 107, 101, 110, 82, 101, 102, 115, 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, - 111, 111, 108, 20, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, 108, 67, - 111, 110, 102, 105, 103, 115, 4, 83, 119, 97, 112, 6, 79, 98, 106, 101, 99, 116, - 9, 97, 108, 108, 95, 112, 111, 111, 108, 115, 13, 70, 117, 110, 103, 105, 98, 108, - 101, 65, 115, 115, 101, 116, 10, 99, 108, 97, 105, 109, 95, 102, 101, 101, 115, 14, - 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, 101, 115, 8, 77, 101, 116, - 97, 100, 97, 116, 97, 6, 99, 114, 101, 97, 116, 101, 14, 67, 111, 110, 115, 116, - 114, 117, 99, 116, 111, 114, 82, 101, 102, 20, 99, 114, 101, 97, 116, 101, 95, 108, - 112, 95, 116, 111, 107, 101, 110, 95, 114, 101, 102, 115, 13, 70, 117, 110, 103, 105, - 98, 108, 101, 83, 116, 111, 114, 101, 21, 101, 110, 115, 117, 114, 101, 95, 108, 112, - 95, 116, 111, 107, 101, 110, 95, 115, 116, 111, 114, 101, 14, 103, 101, 116, 95, 97, - 109, 111, 117, 110, 116, 95, 111, 117, 116, 5, 103, 101, 116, 95, 121, 11, 105, 110, - 105, 116, 95, 109, 111, 100, 117, 108, 101, 9, 105, 115, 95, 115, 116, 97, 98, 108, - 101, 22, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, 95, 97, - 100, 100, 114, 101, 115, 115, 27, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, - 111, 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 95, 115, 97, 102, 101, 15, 108, - 112, 95, 116, 111, 107, 101, 110, 95, 115, 117, 112, 112, 108, 121, 13, 109, 105, 110, - 95, 108, 105, 113, 117, 105, 100, 105, 116, 121, 4, 109, 105, 110, 116, 13, 112, 111, - 111, 108, 95, 114, 101, 115, 101, 114, 118, 101, 115, 22, 115, 117, 112, 112, 111, 114, - 116, 101, 100, 95, 105, 110, 110, 101, 114, 95, 97, 115, 115, 101, 116, 115, 4, 115, - 119, 97, 112, 12, 115, 119, 97, 112, 95, 102, 101, 101, 95, 98, 112, 115, 21, 116, - 111, 116, 97, 108, 95, 110, 117, 109, 98, 101, 114, 95, 111, 102, 95, 112, 111, 111, - 108, 115, 8, 116, 114, 97, 110, 115, 102, 101, 114, 21, 117, 112, 100, 97, 116, 101, - 95, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, 101, 115, 4, 112, 111, - 111, 108, 7, 116, 111, 107, 101, 110, 95, 49, 7, 116, 111, 107, 101, 110, 95, 50, - 12, 116, 111, 116, 97, 108, 95, 102, 101, 101, 115, 95, 49, 12, 116, 111, 116, 97, - 108, 95, 102, 101, 101, 115, 95, 50, 26, 116, 111, 116, 97, 108, 95, 102, 101, 101, - 115, 95, 97, 116, 95, 108, 97, 115, 116, 95, 99, 108, 97, 105, 109, 95, 49, 10, - 83, 109, 97, 114, 116, 84, 97, 98, 108, 101, 26, 116, 111, 116, 97, 108, 95, 102, - 101, 101, 115, 95, 97, 116, 95, 108, 97, 115, 116, 95, 99, 108, 97, 105, 109, 95, - 50, 11, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 49, 11, 99, 108, 97, 105, - 109, 97, 98, 108, 101, 95, 50, 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, - 117, 114, 110, 82, 101, 102, 8, 109, 105, 110, 116, 95, 114, 101, 102, 7, 77, 105, - 110, 116, 82, 101, 102, 12, 116, 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, - 11, 84, 114, 97, 110, 115, 102, 101, 114, 82, 101, 102, 13, 116, 111, 107, 101, 110, - 95, 115, 116, 111, 114, 101, 95, 49, 13, 116, 111, 107, 101, 110, 95, 115, 116, 111, - 114, 101, 95, 50, 12, 102, 101, 101, 115, 95, 115, 116, 111, 114, 101, 95, 49, 12, - 102, 101, 101, 115, 95, 115, 116, 111, 114, 101, 95, 50, 13, 108, 112, 95, 116, 111, - 107, 101, 110, 95, 114, 101, 102, 115, 11, 83, 109, 97, 114, 116, 86, 101, 99, 116, - 111, 114, 9, 105, 115, 95, 112, 97, 117, 115, 101, 100, 14, 115, 116, 97, 98, 108, - 101, 95, 102, 101, 101, 95, 98, 112, 115, 16, 118, 111, 108, 97, 116, 105, 108, 101, - 95, 102, 101, 101, 95, 98, 112, 115, 10, 102, 114, 111, 109, 95, 116, 111, 107, 101, - 110, 9, 97, 109, 111, 117, 110, 116, 95, 105, 110, 6, 108, 101, 110, 103, 116, 104, - 6, 98, 111, 114, 114, 111, 119, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, - 14, 111, 98, 106, 101, 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, 8, 99, 111, - 110, 116, 97, 105, 110, 115, 6, 114, 101, 109, 111, 118, 101, 8, 119, 105, 116, 104, - 100, 114, 97, 119, 14, 115, 116, 111, 114, 101, 95, 109, 101, 116, 97, 100, 97, 116, - 97, 4, 122, 101, 114, 111, 19, 98, 111, 114, 114, 111, 119, 95, 119, 105, 116, 104, - 95, 100, 101, 102, 97, 117, 108, 116, 6, 83, 116, 114, 105, 110, 103, 4, 117, 116, - 102, 56, 6, 115, 121, 109, 98, 111, 108, 6, 97, 112, 112, 101, 110, 100, 11, 97, - 112, 112, 101, 110, 100, 95, 117, 116, 102, 56, 8, 116, 111, 95, 98, 121, 116, 101, - 115, 19, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, 100, 95, 111, 98, 106, - 101, 99, 116, 6, 79, 112, 116, 105, 111, 110, 4, 110, 111, 110, 101, 43, 99, 114, - 101, 97, 116, 101, 95, 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, - 95, 101, 110, 97, 98, 108, 101, 100, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, - 97, 115, 115, 101, 116, 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, - 110, 101, 114, 27, 111, 98, 106, 101, 99, 116, 95, 102, 114, 111, 109, 95, 99, 111, - 110, 115, 116, 114, 117, 99, 116, 111, 114, 95, 114, 101, 102, 12, 99, 114, 101, 97, - 116, 101, 95, 115, 116, 111, 114, 101, 25, 99, 114, 101, 97, 116, 101, 95, 111, 98, - 106, 101, 99, 116, 95, 102, 114, 111, 109, 95, 111, 98, 106, 101, 99, 116, 3, 110, - 101, 119, 7, 99, 111, 110, 118, 101, 114, 116, 9, 112, 117, 115, 104, 95, 98, 97, - 99, 107, 4, 101, 109, 105, 116, 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 98, - 117, 114, 110, 95, 114, 101, 102, 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 109, - 105, 110, 116, 95, 114, 101, 102, 21, 103, 101, 110, 101, 114, 97, 116, 101, 95, 116, - 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, 27, 101, 110, 115, 117, 114, 101, - 95, 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 120, 105, - 115, 116, 115, 13, 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 9, - 105, 115, 95, 102, 114, 111, 122, 101, 110, 15, 115, 101, 116, 95, 102, 114, 111, 122, - 101, 110, 95, 102, 108, 97, 103, 7, 98, 97, 108, 97, 110, 99, 101, 16, 105, 110, - 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 17, 97, 100, 100, - 114, 101, 115, 115, 95, 116, 111, 95, 111, 98, 106, 101, 99, 116, 21, 99, 114, 101, - 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, - 6, 115, 117, 112, 112, 108, 121, 12, 100, 101, 115, 116, 114, 111, 121, 95, 115, 111, - 109, 101, 19, 109, 101, 116, 97, 100, 97, 116, 97, 95, 102, 114, 111, 109, 95, 97, - 115, 115, 101, 116, 6, 97, 109, 111, 117, 110, 116, 4, 115, 113, 114, 116, 7, 109, - 105, 110, 116, 95, 116, 111, 3, 109, 105, 110, 7, 100, 101, 112, 111, 115, 105, 116, - 16, 100, 101, 112, 111, 115, 105, 116, 95, 119, 105, 116, 104, 95, 114, 101, 102, 7, - 101, 120, 116, 114, 97, 99, 116, 17, 116, 114, 97, 110, 115, 102, 101, 114, 95, 119, - 105, 116, 104, 95, 114, 101, 102, 23, 98, 111, 114, 114, 111, 119, 95, 109, 117, 116, - 95, 119, 105, 116, 104, 95, 100, 101, 102, 97, 117, 108, 116, 6, 117, 112, 115, 101, - 114, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 13, 1, 0, 30, 2, 30, 82, 3, 112, 131, + 4, 4, 243, 4, 86, 5, 201, 5, 215, 6, 7, 160, 12, 232, 12, 8, 136, 25, + 64, 6, 200, 25, 56, 16, 128, 26, 180, 9, 10, 180, 35, 131, 1, 12, 183, 36, + 250, 23, 13, 177, 60, 38, 15, 215, 60, 2, 0, 0, 1, 4, 1, 8, 1, 16, + 1, 37, 1, 55, 1, 58, 1, 64, 1, 66, 1, 69, 1, 72, 1, 83, 1, 91, + 1, 95, 1, 97, 0, 1, 6, 0, 1, 3, 7, 1, 0, 1, 0, 5, 8, 0, + 2, 7, 11, 0, 0, 11, 8, 0, 3, 15, 4, 2, 0, 0, 0, 0, 0, 20, + 4, 0, 2, 22, 6, 0, 2, 24, 6, 0, 2, 26, 6, 0, 2, 28, 8, 0, + 0, 34, 8, 0, 4, 36, 4, 1, 0, 0, 0, 41, 6, 0, 2, 45, 0, 0, + 6, 60, 7, 0, 1, 68, 2, 0, 9, 71, 7, 1, 0, 0, 0, 44, 0, 1, + 0, 1, 2, 46, 3, 4, 0, 1, 2, 47, 3, 5, 0, 1, 0, 48, 6, 7, + 0, 1, 2, 49, 8, 1, 0, 1, 1, 50, 10, 11, 1, 8, 1, 2, 51, 13, + 5, 1, 8, 1, 2, 52, 13, 4, 1, 8, 1, 2, 53, 14, 2, 1, 8, 1, + 2, 54, 15, 1, 1, 8, 1, 5, 56, 17, 2, 1, 6, 1, 0, 57, 19, 20, + 0, 1, 6, 59, 21, 22, 0, 1, 2, 61, 13, 22, 1, 8, 1, 6, 62, 24, + 2, 0, 1, 6, 63, 25, 2, 0, 1, 7, 65, 27, 21, 1, 0, 1, 8, 62, + 28, 2, 1, 0, 1, 1, 67, 30, 31, 0, 1, 9, 70, 2, 33, 1, 0, 1, + 10, 73, 34, 2, 0, 1, 1, 74, 35, 36, 0, 1, 1, 75, 35, 13, 1, 8, + 1, 2, 76, 37, 38, 1, 8, 1, 1, 77, 39, 31, 0, 1, 0, 78, 35, 40, + 0, 1, 3, 79, 2, 42, 2, 7, 4, 1, 1, 80, 13, 44, 2, 8, 8, 1, + 4, 81, 45, 2, 1, 4, 1, 0, 82, 48, 2, 0, 1, 11, 84, 39, 11, 0, + 1, 0, 85, 49, 38, 1, 8, 1, 0, 86, 50, 2, 0, 1, 2, 87, 51, 2, + 1, 8, 1, 0, 88, 53, 2, 0, 1, 0, 0, 54, 20, 0, 1, 2, 89, 13, + 55, 1, 8, 1, 9, 90, 33, 17, 1, 0, 1, 12, 92, 32, 32, 0, 1, 2, + 93, 56, 2, 1, 8, 1, 2, 88, 57, 1, 0, 1, 2, 94, 58, 2, 1, 8, + 1, 13, 96, 7, 5, 0, 1, 14, 98, 5, 5, 0, 1, 0, 99, 54, 11, 0, + 1, 1, 100, 11, 13, 1, 8, 1, 0, 35, 2, 60, 0, 1, 4, 101, 61, 5, + 1, 0, 1, 4, 102, 62, 27, 1, 0, 1, 0, 103, 64, 65, 0, 1, 3, 104, + 66, 29, 2, 2, 0, 1, 3, 105, 67, 68, 2, 3, 0, 1, 2, 106, 13, 1, + 1, 8, 1, 0, 107, 50, 70, 0, 1, 3, 108, 71, 72, 2, 3, 0, 1, 0, + 10, 20, 29, 0, 1, 2, 109, 35, 74, 0, 1, 2, 110, 35, 75, 0, 1, 2, + 111, 35, 76, 0, 1, 10, 112, 49, 38, 1, 8, 1, 10, 113, 49, 38, 1, 8, + 1, 2, 114, 13, 29, 1, 8, 1, 2, 115, 77, 2, 1, 8, 1, 0, 116, 79, + 80, 0, 1, 0, 117, 39, 2, 0, 1, 4, 79, 2, 83, 1, 4, 1, 1, 118, + 85, 11, 0, 1, 0, 119, 54, 87, 0, 1, 0, 120, 13, 32, 1, 8, 1, 0, + 121, 2, 5, 0, 1, 0, 122, 13, 7, 1, 8, 1, 0, 123, 20, 89, 0, 1, + 0, 33, 20, 5, 0, 1, 0, 124, 2, 5, 0, 1, 10, 51, 49, 5, 1, 8, + 1, 3, 102, 66, 72, 2, 2, 0, 1, 3, 125, 90, 91, 2, 3, 2, 1, 3, + 126, 90, 2, 2, 3, 2, 1, 5, 9, 6, 12, 7, 12, 8, 12, 9, 12, 10, + 16, 13, 23, 5, 23, 16, 11, 17, 26, 16, 29, 19, 32, 22, 23, 23, 23, 26, + 41, 27, 43, 28, 20, 10, 46, 31, 9, 33, 12, 36, 9, 37, 32, 39, 9, 41, + 12, 45, 9, 47, 20, 48, 20, 50, 41, 51, 41, 52, 23, 54, 41, 59, 17, 60, + 17, 61, 12, 5, 17, 62, 12, 65, 20, 36, 17, 74, 9, 68, 9, 75, 41, 76, + 41, 77, 41, 3, 6, 12, 11, 1, 1, 8, 2, 8, 14, 1, 8, 14, 0, 1, + 6, 8, 14, 1, 11, 1, 1, 8, 3, 1, 3, 3, 11, 1, 1, 8, 2, 11, + 1, 1, 8, 3, 3, 2, 3, 3, 2, 7, 8, 14, 3, 1, 8, 2, 1, 6, + 11, 1, 1, 9, 0, 1, 5, 1, 8, 10, 1, 11, 1, 1, 9, 0, 2, 11, + 1, 1, 9, 0, 8, 14, 3, 6, 12, 11, 1, 1, 9, 0, 3, 1, 8, 13, + 1, 9, 0, 21, 11, 1, 1, 8, 3, 3, 3, 3, 8, 14, 6, 8, 2, 6, + 8, 2, 15, 15, 15, 7, 8, 4, 11, 1, 1, 8, 10, 11, 1, 1, 8, 10, + 4, 11, 1, 1, 8, 3, 11, 1, 1, 8, 3, 8, 14, 15, 15, 15, 8, 14, + 4, 6, 12, 11, 1, 1, 8, 3, 11, 1, 1, 8, 3, 1, 1, 11, 1, 1, + 8, 2, 1, 10, 2, 1, 8, 15, 1, 8, 3, 2, 7, 8, 15, 8, 15, 2, + 7, 8, 15, 10, 2, 1, 2, 1, 6, 9, 0, 2, 7, 10, 9, 0, 10, 9, + 0, 1, 1, 2, 6, 12, 10, 2, 1, 8, 16, 1, 4, 1, 11, 17, 1, 9, + 0, 7, 6, 8, 16, 11, 17, 1, 4, 8, 15, 8, 15, 2, 8, 15, 8, 15, + 1, 6, 8, 16, 1, 12, 2, 6, 8, 16, 11, 1, 1, 9, 0, 1, 11, 1, + 1, 8, 10, 1, 6, 12, 1, 8, 6, 2, 5, 4, 1, 11, 5, 2, 9, 0, + 9, 1, 2, 8, 3, 8, 2, 1, 11, 1, 1, 9, 1, 2, 7, 11, 12, 1, + 9, 0, 9, 0, 1, 8, 0, 39, 7, 8, 11, 11, 1, 1, 8, 3, 11, 1, + 1, 8, 3, 1, 11, 1, 1, 8, 3, 11, 1, 1, 8, 3, 8, 15, 8, 15, + 11, 1, 1, 8, 3, 11, 1, 1, 8, 3, 1, 10, 2, 5, 5, 10, 2, 8, + 16, 6, 8, 16, 6, 8, 16, 8, 15, 8, 15, 2, 8, 15, 11, 17, 1, 4, + 12, 6, 12, 6, 12, 8, 16, 11, 1, 1, 8, 10, 8, 16, 11, 1, 1, 8, + 10, 8, 16, 11, 1, 1, 8, 10, 8, 16, 11, 1, 1, 8, 10, 8, 6, 3, + 8, 2, 8, 4, 11, 1, 1, 8, 2, 4, 6, 12, 11, 1, 1, 8, 2, 5, + 3, 2, 5, 11, 1, 1, 9, 0, 2, 5, 11, 1, 1, 8, 2, 4, 6, 8, + 9, 11, 1, 1, 9, 0, 11, 1, 1, 9, 0, 3, 4, 3, 5, 11, 1, 1, + 8, 10, 11, 1, 1, 8, 10, 4, 6, 12, 8, 14, 8, 14, 1, 3, 11, 1, + 1, 8, 3, 11, 1, 1, 8, 3, 1, 1, 11, 17, 1, 4, 3, 6, 8, 8, + 11, 1, 1, 9, 0, 3, 2, 6, 8, 8, 3, 3, 6, 8, 9, 11, 1, 1, + 9, 0, 8, 14, 21, 11, 1, 1, 8, 2, 11, 1, 1, 8, 10, 3, 3, 3, + 6, 8, 2, 11, 1, 1, 8, 10, 11, 1, 1, 8, 10, 3, 4, 6, 8, 8, + 4, 3, 3, 8, 14, 3, 3, 3, 3, 3, 3, 1, 10, 11, 1, 1, 8, 2, + 1, 6, 11, 12, 1, 9, 0, 2, 6, 11, 12, 1, 9, 0, 3, 6, 6, 11, + 12, 1, 11, 1, 1, 8, 2, 10, 11, 1, 1, 8, 2, 3, 3, 3, 10, 11, + 1, 1, 8, 2, 3, 6, 12, 6, 12, 11, 1, 1, 8, 2, 2, 8, 14, 8, + 14, 2, 6, 11, 5, 2, 9, 0, 9, 1, 9, 0, 2, 7, 11, 5, 2, 9, + 0, 9, 1, 9, 0, 1, 9, 1, 12, 5, 6, 8, 2, 7, 8, 4, 4, 4, + 4, 3, 11, 1, 1, 8, 10, 8, 14, 8, 14, 8, 14, 8, 14, 2, 4, 4, + 3, 6, 11, 5, 2, 9, 0, 9, 1, 9, 0, 6, 9, 1, 1, 6, 9, 1, + 5, 6, 8, 4, 4, 6, 4, 6, 11, 5, 2, 5, 4, 4, 1, 8, 7, 1, + 8, 8, 1, 8, 9, 3, 6, 8, 9, 11, 1, 1, 9, 0, 1, 3, 11, 1, + 1, 8, 10, 1, 6, 8, 9, 3, 15, 15, 15, 1, 15, 18, 6, 8, 2, 15, + 15, 11, 1, 1, 8, 3, 15, 15, 3, 3, 3, 15, 6, 8, 2, 15, 15, 15, + 15, 15, 3, 3, 7, 3, 3, 15, 15, 15, 15, 15, 1, 11, 12, 1, 9, 0, + 1, 8, 11, 2, 6, 5, 10, 2, 8, 5, 11, 1, 1, 8, 3, 11, 1, 1, + 8, 3, 1, 10, 2, 5, 5, 10, 2, 2, 1, 5, 1, 6, 8, 2, 1, 10, + 11, 1, 1, 8, 3, 3, 7, 11, 5, 2, 9, 0, 9, 1, 9, 0, 9, 1, + 1, 7, 9, 1, 17, 7, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 11, 5, 2, 5, 4, 7, 4, 14, 108, 105, 113, 117, 105, + 100, 105, 116, 121, 95, 112, 111, 111, 108, 10, 67, 114, 101, 97, 116, 101, 80, 111, + 111, 108, 4, 112, 111, 111, 108, 6, 79, 98, 106, 101, 99, 116, 6, 111, 98, 106, + 101, 99, 116, 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, 108, 7, + 116, 111, 107, 101, 110, 95, 49, 8, 77, 101, 116, 97, 100, 97, 116, 97, 14, 102, + 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 7, 116, 111, 107, 101, + 110, 95, 50, 9, 105, 115, 95, 115, 116, 97, 98, 108, 101, 14, 70, 101, 101, 115, + 65, 99, 99, 111, 117, 110, 116, 105, 110, 103, 12, 116, 111, 116, 97, 108, 95, 102, + 101, 101, 115, 95, 49, 12, 116, 111, 116, 97, 108, 95, 102, 101, 101, 115, 95, 50, + 26, 116, 111, 116, 97, 108, 95, 102, 101, 101, 115, 95, 97, 116, 95, 108, 97, 115, + 116, 95, 99, 108, 97, 105, 109, 95, 49, 10, 83, 109, 97, 114, 116, 84, 97, 98, + 108, 101, 11, 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, 101, 26, 116, 111, 116, + 97, 108, 95, 102, 101, 101, 115, 95, 97, 116, 95, 108, 97, 115, 116, 95, 99, 108, + 97, 105, 109, 95, 50, 11, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 49, 11, + 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 50, 11, 76, 80, 84, 111, 107, 101, + 110, 82, 101, 102, 115, 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, 117, 114, + 110, 82, 101, 102, 8, 109, 105, 110, 116, 95, 114, 101, 102, 7, 77, 105, 110, 116, + 82, 101, 102, 12, 116, 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, 11, 84, + 114, 97, 110, 115, 102, 101, 114, 82, 101, 102, 13, 116, 111, 107, 101, 110, 95, 115, + 116, 111, 114, 101, 95, 49, 13, 70, 117, 110, 103, 105, 98, 108, 101, 83, 116, 111, + 114, 101, 13, 116, 111, 107, 101, 110, 95, 115, 116, 111, 114, 101, 95, 50, 12, 102, + 101, 101, 115, 95, 115, 116, 111, 114, 101, 95, 49, 12, 102, 101, 101, 115, 95, 115, + 116, 111, 114, 101, 95, 50, 13, 108, 112, 95, 116, 111, 107, 101, 110, 95, 114, 101, + 102, 115, 12, 115, 119, 97, 112, 95, 102, 101, 101, 95, 98, 112, 115, 20, 76, 105, + 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, 108, 67, 111, 110, 102, 105, 103, 115, + 9, 97, 108, 108, 95, 112, 111, 111, 108, 115, 11, 83, 109, 97, 114, 116, 86, 101, + 99, 116, 111, 114, 12, 115, 109, 97, 114, 116, 95, 118, 101, 99, 116, 111, 114, 9, + 105, 115, 95, 112, 97, 117, 115, 101, 100, 14, 115, 116, 97, 98, 108, 101, 95, 102, + 101, 101, 95, 98, 112, 115, 16, 118, 111, 108, 97, 116, 105, 108, 101, 95, 102, 101, + 101, 95, 98, 112, 115, 4, 83, 119, 97, 112, 10, 102, 114, 111, 109, 95, 116, 111, + 107, 101, 110, 9, 97, 109, 111, 117, 110, 116, 95, 105, 110, 4, 115, 119, 97, 112, + 13, 70, 117, 110, 103, 105, 98, 108, 101, 65, 115, 115, 101, 116, 19, 109, 101, 116, + 97, 100, 97, 116, 97, 95, 102, 114, 111, 109, 95, 97, 115, 115, 101, 116, 6, 97, + 109, 111, 117, 110, 116, 14, 103, 101, 116, 95, 97, 109, 111, 117, 110, 116, 95, 111, + 117, 116, 7, 101, 120, 116, 114, 97, 99, 116, 14, 111, 98, 106, 101, 99, 116, 95, + 97, 100, 100, 114, 101, 115, 115, 7, 98, 97, 108, 97, 110, 99, 101, 14, 115, 116, + 111, 114, 101, 95, 109, 101, 116, 97, 100, 97, 116, 97, 7, 100, 101, 112, 111, 115, + 105, 116, 8, 119, 105, 116, 104, 100, 114, 97, 119, 5, 101, 118, 101, 110, 116, 4, + 101, 109, 105, 116, 6, 99, 114, 101, 97, 116, 101, 6, 115, 116, 114, 105, 110, 103, + 4, 117, 116, 102, 56, 6, 83, 116, 114, 105, 110, 103, 6, 115, 121, 109, 98, 111, + 108, 6, 97, 112, 112, 101, 110, 100, 11, 97, 112, 112, 101, 110, 100, 95, 117, 116, + 102, 56, 3, 98, 99, 115, 8, 116, 111, 95, 98, 121, 116, 101, 115, 6, 118, 101, + 99, 116, 111, 114, 19, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, 100, 95, + 111, 98, 106, 101, 99, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, + 82, 101, 102, 6, 111, 112, 116, 105, 111, 110, 4, 110, 111, 110, 101, 6, 79, 112, + 116, 105, 111, 110, 22, 112, 114, 105, 109, 97, 114, 121, 95, 102, 117, 110, 103, 105, + 98, 108, 101, 95, 115, 116, 111, 114, 101, 43, 99, 114, 101, 97, 116, 101, 95, 112, + 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 110, 97, 98, 108, + 101, 100, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 15, + 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 27, 111, 98, + 106, 101, 99, 116, 95, 102, 114, 111, 109, 95, 99, 111, 110, 115, 116, 114, 117, 99, + 116, 111, 114, 95, 114, 101, 102, 12, 99, 114, 101, 97, 116, 101, 95, 115, 116, 111, + 114, 101, 25, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 95, 102, + 114, 111, 109, 95, 111, 98, 106, 101, 99, 116, 20, 99, 114, 101, 97, 116, 101, 95, + 108, 112, 95, 116, 111, 107, 101, 110, 95, 114, 101, 102, 115, 3, 110, 101, 119, 7, + 99, 111, 110, 118, 101, 114, 116, 9, 112, 117, 115, 104, 95, 98, 97, 99, 107, 8, + 116, 114, 97, 110, 115, 102, 101, 114, 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, + 100, 114, 101, 115, 115, 95, 111, 102, 21, 101, 110, 115, 117, 114, 101, 95, 108, 112, + 95, 116, 111, 107, 101, 110, 95, 115, 116, 111, 114, 101, 21, 117, 112, 100, 97, 116, + 101, 95, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, 101, 115, 17, 116, + 114, 97, 110, 115, 102, 101, 114, 95, 119, 105, 116, 104, 95, 114, 101, 102, 4, 109, + 105, 110, 116, 6, 115, 117, 112, 112, 108, 121, 12, 100, 101, 115, 116, 114, 111, 121, + 95, 115, 111, 109, 101, 7, 109, 97, 116, 104, 49, 50, 56, 4, 115, 113, 114, 116, + 7, 109, 105, 110, 116, 95, 116, 111, 16, 100, 101, 112, 111, 115, 105, 116, 95, 119, + 105, 116, 104, 95, 114, 101, 102, 6, 109, 97, 116, 104, 54, 52, 3, 109, 105, 110, + 5, 101, 114, 114, 111, 114, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, + 117, 109, 101, 110, 116, 22, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, + 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 17, 97, 100, 100, 114, 101, 115, 115, + 95, 116, 111, 95, 111, 98, 106, 101, 99, 116, 6, 108, 101, 110, 103, 116, 104, 6, + 98, 111, 114, 114, 111, 119, 10, 99, 108, 97, 105, 109, 95, 102, 101, 101, 115, 8, + 99, 111, 110, 116, 97, 105, 110, 115, 6, 114, 101, 109, 111, 118, 101, 4, 122, 101, + 114, 111, 14, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, 101, 115, 19, + 98, 111, 114, 114, 111, 119, 95, 119, 105, 116, 104, 95, 100, 101, 102, 97, 117, 108, + 116, 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 98, 117, 114, 110, 95, 114, 101, + 102, 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 109, 105, 110, 116, 95, 114, 101, + 102, 21, 103, 101, 110, 101, 114, 97, 116, 101, 95, 116, 114, 97, 110, 115, 102, 101, + 114, 95, 114, 101, 102, 27, 101, 110, 115, 117, 114, 101, 95, 112, 114, 105, 109, 97, + 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 120, 105, 115, 116, 115, 13, 112, 114, + 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 9, 105, 115, 95, 102, 114, 111, + 122, 101, 110, 15, 115, 101, 116, 95, 102, 114, 111, 122, 101, 110, 95, 102, 108, 97, + 103, 5, 103, 101, 116, 95, 121, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, + 101, 21, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 95, 97, 100, + 100, 114, 101, 115, 115, 27, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, + 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 95, 115, 97, 102, 101, 15, 108, 112, + 95, 116, 111, 107, 101, 110, 95, 115, 117, 112, 112, 108, 121, 13, 109, 105, 110, 95, + 108, 105, 113, 117, 105, 100, 105, 116, 121, 13, 112, 111, 111, 108, 95, 114, 101, 115, + 101, 114, 118, 101, 115, 22, 115, 117, 112, 112, 111, 114, 116, 101, 100, 95, 105, 110, + 110, 101, 114, 95, 97, 115, 115, 101, 116, 115, 21, 116, 111, 116, 97, 108, 95, 110, + 117, 109, 98, 101, 114, 95, 111, 102, 95, 112, 111, 111, 108, 115, 23, 98, 111, 114, + 114, 111, 119, 95, 109, 117, 116, 95, 119, 105, 116, 104, 95, 100, 101, 102, 97, 117, + 108, 116, 6, 117, 112, 115, 101, 114, 116, 22, 108, 105, 113, 117, 105, 100, 105, 116, + 121, 95, 112, 111, 111, 108, 95, 119, 114, 97, 112, 112, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 8, 4, 0, 0, 0, - 0, 0, 0, 0, 3, 8, 2, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, - 0, 0, 0, 0, 0, 0, 3, 8, 8, 0, 0, 0, 0, 0, 0, 0, 3, 8, - 6, 0, 0, 0, 0, 0, 0, 0, 3, 8, 5, 0, 0, 0, 0, 0, 0, 0, - 3, 8, 7, 0, 0, 0, 0, 0, 0, 0, 3, 8, 1, 0, 0, 0, 0, 0, - 0, 0, 3, 8, 16, 39, 0, 0, 0, 0, 0, 0, 2, 1, 8, 3, 8, 25, - 0, 0, 0, 0, 0, 0, 0, 3, 8, 232, 3, 0, 0, 0, 0, 0, 0, 5, - 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 10, 2, 4, - 3, 76, 80, 45, 10, 2, 2, 1, 45, 10, 2, 1, 0, 10, 2, 3, 2, 76, - 80, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, - 118, 49, 128, 9, 8, 1, 0, 0, 0, 0, 0, 0, 0, 12, 69, 90, 69, 82, - 79, 95, 65, 77, 79, 85, 78, 84, 52, 65, 109, 111, 117, 110, 116, 32, 111, 102, - 32, 116, 111, 107, 101, 110, 115, 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 109, - 117, 115, 116, 32, 98, 101, 32, 103, 114, 101, 97, 116, 101, 114, 32, 116, 104, 97, - 110, 32, 122, 101, 114, 111, 46, 2, 0, 0, 0, 0, 0, 0, 0, 30, 69, 73, - 78, 83, 85, 70, 70, 73, 67, 73, 69, 78, 84, 95, 76, 73, 81, 85, 73, 68, - 73, 84, 89, 95, 77, 73, 78, 84, 69, 68, 99, 84, 104, 101, 32, 97, 109, 111, - 117, 110, 116, 32, 111, 102, 32, 108, 105, 113, 117, 105, 100, 105, 116, 121, 32, 112, - 114, 111, 118, 105, 100, 101, 100, 32, 105, 115, 32, 115, 111, 32, 115, 109, 97, 108, - 108, 32, 116, 104, 97, 116, 32, 99, 111, 114, 114, 101, 115, 112, 111, 110, 100, 105, - 110, 103, 32, 76, 80, 32, 116, 111, 107, 101, 110, 32, 97, 109, 111, 117, 110, 116, - 32, 105, 115, 32, 114, 111, 117, 110, 100, 101, 100, 32, 116, 111, 32, 122, 101, 114, - 111, 46, 3, 0, 0, 0, 0, 0, 0, 0, 32, 69, 73, 78, 83, 85, 70, 70, - 73, 67, 73, 69, 78, 84, 95, 76, 73, 81, 85, 73, 68, 73, 84, 89, 95, 82, - 69, 68, 69, 69, 77, 69, 68, 98, 65, 109, 111, 117, 110, 116, 32, 111, 102, 32, - 76, 80, 32, 116, 111, 107, 101, 110, 115, 32, 114, 101, 100, 101, 101, 109, 101, 100, - 32, 105, 115, 32, 116, 111, 111, 32, 115, 109, 97, 108, 108, 44, 32, 115, 111, 32, - 97, 109, 111, 117, 110, 116, 115, 32, 111, 102, 32, 116, 111, 107, 101, 110, 115, 32, - 114, 101, 99, 101, 105, 118, 101, 100, 32, 98, 97, 99, 107, 32, 97, 114, 101, 32, - 114, 111, 117, 110, 100, 101, 100, 32, 116, 111, 32, 122, 101, 114, 111, 46, 4, 0, - 0, 0, 0, 0, 0, 0, 22, 69, 73, 78, 67, 79, 82, 82, 69, 67, 84, 95, - 83, 87, 65, 80, 95, 65, 77, 79, 85, 78, 84, 94, 84, 104, 101, 32, 115, 112, - 101, 99, 105, 102, 105, 101, 100, 32, 97, 109, 111, 117, 110, 116, 32, 111, 102, 32, - 111, 117, 116, 112, 117, 116, 32, 116, 111, 107, 101, 110, 115, 32, 105, 115, 32, 105, - 110, 99, 111, 114, 114, 101, 99, 116, 32, 97, 110, 100, 32, 100, 111, 101, 115, 32, - 110, 111, 116, 32, 109, 97, 105, 110, 116, 97, 105, 110, 32, 116, 104, 101, 32, 112, - 111, 111, 108, 39, 115, 32, 105, 110, 118, 97, 114, 105, 97, 110, 116, 46, 5, 0, - 0, 0, 0, 0, 0, 0, 16, 69, 78, 79, 84, 95, 83, 84, 79, 82, 69, 95, - 79, 87, 78, 69, 82, 50, 84, 104, 101, 32, 99, 97, 108, 108, 101, 114, 32, 105, - 115, 32, 110, 111, 116, 32, 116, 104, 101, 32, 111, 119, 110, 101, 114, 32, 111, 102, - 32, 116, 104, 101, 32, 76, 80, 32, 116, 111, 107, 101, 110, 32, 115, 116, 111, 114, - 101, 46, 6, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, 65, 85, - 84, 72, 79, 82, 73, 90, 69, 68, 50, 67, 108, 97, 108, 101, 114, 32, 105, 115, - 32, 110, 111, 116, 32, 97, 117, 116, 104, 111, 114, 105, 122, 101, 100, 32, 116, 111, - 32, 112, 101, 114, 102, 111, 114, 109, 32, 116, 104, 101, 32, 111, 112, 101, 114, 97, - 116, 105, 111, 110, 46, 7, 0, 0, 0, 0, 0, 0, 0, 17, 69, 83, 87, 65, - 80, 83, 95, 65, 82, 69, 95, 80, 65, 85, 83, 69, 68, 31, 65, 108, 108, 32, - 115, 119, 97, 112, 115, 32, 97, 114, 101, 32, 99, 117, 114, 114, 101, 110, 116, 108, - 121, 32, 112, 97, 117, 115, 101, 100, 46, 8, 0, 0, 0, 0, 0, 0, 0, 41, - 69, 75, 95, 66, 69, 70, 79, 82, 69, 95, 83, 87, 65, 80, 95, 71, 82, 69, - 65, 84, 69, 82, 95, 84, 72, 65, 78, 95, 69, 75, 95, 65, 70, 84, 69, 82, - 95, 83, 87, 65, 80, 46, 83, 119, 97, 112, 32, 108, 101, 97, 118, 101, 115, 32, - 112, 111, 111, 108, 32, 105, 110, 32, 97, 32, 119, 111, 114, 115, 101, 32, 115, 116, - 97, 116, 101, 32, 116, 104, 97, 110, 32, 98, 101, 102, 111, 114, 101, 46, 4, 4, - 83, 119, 97, 112, 1, 4, 0, 10, 67, 114, 101, 97, 116, 101, 80, 111, 111, 108, - 1, 4, 0, 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, 108, 1, - 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, 98, - 106, 101, 99, 116, 71, 114, 111, 117, 112, 14, 70, 101, 101, 115, 65, 99, 99, 111, - 117, 110, 116, 105, 110, 103, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, - 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 13, 9, - 97, 108, 108, 95, 112, 111, 111, 108, 115, 1, 1, 0, 9, 105, 115, 95, 115, 116, - 97, 98, 108, 101, 1, 1, 0, 12, 115, 119, 97, 112, 95, 102, 101, 101, 95, 98, - 112, 115, 1, 1, 0, 13, 109, 105, 110, 95, 108, 105, 113, 117, 105, 100, 105, 116, - 121, 1, 1, 0, 13, 112, 111, 111, 108, 95, 114, 101, 115, 101, 114, 118, 101, 115, - 1, 1, 0, 14, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, 101, 115, - 1, 1, 0, 14, 103, 101, 116, 95, 97, 109, 111, 117, 110, 116, 95, 111, 117, 116, - 1, 1, 0, 14, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, - 1, 1, 0, 15, 108, 112, 95, 116, 111, 107, 101, 110, 95, 115, 117, 112, 112, 108, - 121, 1, 1, 0, 21, 116, 111, 116, 97, 108, 95, 110, 117, 109, 98, 101, 114, 95, - 111, 102, 95, 112, 111, 111, 108, 115, 1, 1, 0, 22, 108, 105, 113, 117, 105, 100, - 105, 116, 121, 95, 112, 111, 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 1, 1, - 0, 22, 115, 117, 112, 112, 111, 114, 116, 101, 100, 95, 105, 110, 110, 101, 114, 95, - 97, 115, 115, 101, 116, 115, 1, 1, 0, 27, 108, 105, 113, 117, 105, 100, 105, 116, - 121, 95, 112, 111, 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 95, 115, 97, 102, - 101, 1, 1, 0, 0, 2, 4, 49, 11, 6, 1, 8, 3, 50, 11, 6, 1, 8, - 8, 51, 11, 6, 1, 8, 8, 36, 1, 1, 2, 6, 52, 4, 53, 4, 54, 11, - 11, 2, 5, 4, 56, 11, 11, 2, 5, 4, 57, 11, 11, 2, 5, 4, 58, 11, - 11, 2, 5, 4, 2, 2, 3, 59, 8, 12, 61, 8, 13, 63, 8, 14, 3, 2, - 7, 65, 11, 6, 1, 8, 10, 66, 11, 6, 1, 8, 10, 67, 11, 6, 1, 8, - 10, 68, 11, 6, 1, 8, 10, 69, 8, 2, 45, 3, 36, 1, 4, 2, 4, 23, - 11, 15, 1, 11, 6, 1, 8, 3, 71, 1, 72, 3, 73, 3, 5, 2, 3, 49, - 5, 74, 11, 6, 1, 8, 8, 75, 3, 0, 1, 0, 1, 4, 29, 31, 7, 12, - 43, 4, 16, 0, 12, 0, 64, 7, 0, 0, 0, 0, 0, 0, 0, 0, 12, 3, - 10, 0, 56, 0, 12, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 10, - 1, 10, 2, 35, 4, 27, 5, 16, 13, 3, 10, 0, 10, 1, 56, 1, 20, 68, - 7, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 1, 5, 11, 11, - 0, 1, 11, 3, 2, 1, 3, 0, 2, 1, 3, 33, 93, 11, 1, 17, 25, 12, - 12, 10, 12, 10, 2, 17, 22, 14, 2, 56, 2, 43, 3, 12, 13, 14, 2, 56, - 2, 42, 1, 12, 11, 10, 11, 16, 1, 10, 12, 56, 3, 4, 25, 10, 11, 15, - 1, 10, 12, 56, 4, 12, 3, 5, 27, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 12, 3, 11, 3, 12, 7, 10, 11, 16, 2, - 10, 12, 56, 3, 4, 40, 11, 11, 15, 2, 11, 12, 56, 4, 12, 4, 5, 44, - 11, 11, 1, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 4, 11, 4, 12, 8, 10, 7, 50, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 59, 10, 0, 10, 13, 16, 3, - 20, 11, 7, 52, 56, 5, 12, 5, 5, 65, 10, 13, 16, 3, 20, 56, 6, 56, - 7, 12, 5, 11, 5, 12, 9, 10, 8, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 80, 11, 0, 11, 13, 16, 4, 20, - 11, 8, 52, 56, 5, 12, 6, 5, 88, 11, 0, 1, 11, 13, 16, 4, 20, 56, - 6, 56, 7, 12, 6, 11, 6, 12, 10, 11, 9, 11, 10, 2, 2, 1, 0, 1, - 1, 44, 31, 14, 1, 56, 2, 43, 1, 12, 9, 10, 9, 16, 1, 12, 7, 10, - 0, 12, 6, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 5, 11, 7, 11, 6, 14, 5, 56, 8, 20, 12, 8, 11, 9, 16, - 2, 12, 4, 11, 0, 12, 3, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 2, 11, 8, 11, 4, 11, 3, 14, 2, 56, 8, - 20, 2, 3, 1, 0, 1, 4, 47, 180, 1, 7, 12, 42, 4, 12, 21, 11, 0, - 10, 1, 10, 2, 10, 3, 12, 22, 12, 39, 12, 36, 12, 29, 10, 36, 10, 39, - 12, 40, 12, 37, 7, 13, 17, 33, 12, 43, 13, 43, 11, 37, 56, 9, 17, 35, - 13, 43, 7, 14, 17, 36, 13, 43, 11, 40, 56, 9, 17, 35, 11, 43, 12, 42, - 11, 36, 11, 39, 11, 22, 12, 23, 12, 41, 12, 38, 7, 15, 12, 31, 13, 31, - 12, 13, 14, 38, 56, 10, 12, 4, 11, 13, 14, 4, 56, 11, 56, 12, 13, 31, - 12, 15, 14, 41, 56, 10, 12, 14, 11, 15, 14, 14, 56, 11, 56, 12, 13, 31, - 14, 23, 56, 13, 56, 12, 11, 31, 12, 30, 11, 29, 11, 30, 17, 39, 12, 16, - 14, 16, 12, 25, 10, 25, 56, 14, 11, 42, 7, 16, 17, 33, 7, 9, 7, 15, - 17, 33, 7, 15, 17, 33, 17, 41, 11, 25, 12, 27, 10, 27, 17, 42, 12, 17, - 14, 17, 12, 28, 10, 27, 56, 15, 12, 24, 10, 27, 10, 24, 56, 16, 1, 10, - 28, 12, 12, 10, 28, 10, 1, 12, 34, 17, 45, 12, 10, 14, 10, 11, 34, 56, - 16, 12, 11, 10, 28, 10, 2, 12, 35, 17, 45, 12, 8, 14, 8, 11, 35, 56, - 16, 12, 9, 10, 28, 10, 1, 12, 32, 17, 45, 12, 6, 14, 6, 11, 32, 56, - 16, 12, 7, 10, 28, 10, 2, 12, 33, 17, 45, 12, 20, 14, 20, 11, 33, 56, - 16, 12, 5, 11, 27, 17, 4, 12, 19, 10, 3, 4, 142, 1, 10, 21, 16, 5, - 20, 12, 18, 5, 146, 1, 10, 21, 16, 6, 20, 12, 18, 11, 12, 11, 11, 11, - 9, 11, 7, 11, 5, 11, 19, 11, 18, 10, 3, 18, 3, 45, 3, 11, 28, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 17, 56, - 17, 56, 17, 56, 17, 18, 1, 45, 1, 11, 24, 56, 18, 12, 26, 11, 21, 15, - 0, 10, 26, 56, 19, 10, 26, 11, 1, 11, 2, 11, 3, 18, 0, 56, 20, 11, - 26, 2, 4, 0, 0, 0, 0, 8, 10, 0, 17, 50, 10, 0, 17, 51, 11, 0, - 17, 52, 18, 2, 2, 5, 0, 0, 1, 3, 11, 22, 10, 0, 10, 1, 56, 21, - 1, 11, 0, 10, 1, 56, 22, 12, 2, 10, 2, 56, 23, 32, 4, 20, 14, 1, - 56, 24, 43, 3, 16, 7, 16, 8, 10, 2, 8, 56, 25, 11, 2, 2, 6, 1, - 0, 1, 3, 70, 138, 1, 14, 0, 56, 2, 43, 3, 12, 14, 10, 14, 16, 9, - 20, 56, 26, 77, 12, 17, 10, 14, 16, 10, 20, 56, 26, 77, 12, 18, 11, 1, - 10, 14, 16, 9, 20, 56, 6, 33, 4, 28, 11, 17, 11, 18, 12, 4, 12, 3, - 5, 32, 11, 18, 11, 17, 12, 4, 12, 3, 11, 3, 11, 4, 12, 20, 12, 19, - 10, 2, 10, 14, 16, 11, 20, 7, 8, 12, 10, 12, 9, 12, 7, 10, 10, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 49, 5, 54, 11, 14, 1, 6, 4, - 0, 0, 0, 0, 0, 0, 0, 17, 58, 39, 11, 7, 53, 11, 9, 53, 24, 11, - 10, 53, 26, 52, 12, 11, 11, 2, 10, 11, 23, 77, 12, 8, 10, 14, 16, 12, - 20, 4, 124, 11, 14, 12, 13, 10, 13, 16, 9, 20, 56, 26, 77, 12, 15, 10, - 13, 16, 10, 20, 56, 26, 77, 12, 16, 11, 13, 16, 12, 20, 4, 108, 10, 15, - 10, 15, 24, 10, 15, 24, 10, 16, 24, 10, 16, 10, 16, 24, 11, 16, 24, 11, - 15, 24, 22, 12, 5, 5, 112, 11, 15, 11, 16, 24, 12, 5, 11, 5, 12, 12, - 10, 20, 11, 8, 11, 19, 22, 11, 12, 11, 20, 17, 7, 23, 12, 6, 5, 134, - 1, 11, 14, 1, 10, 8, 11, 20, 24, 11, 19, 11, 8, 22, 26, 12, 6, 11, - 6, 52, 11, 11, 2, 7, 0, 0, 0, 71, 114, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 12, 5, 10, 5, 6, 255, 0, 0, 0, 0, 0, 0, 0, 35, 4, 112, - 5, 7, 10, 2, 12, 13, 10, 0, 10, 2, 12, 10, 12, 7, 10, 7, 10, 10, - 10, 10, 24, 10, 10, 24, 24, 10, 7, 10, 7, 24, 11, 7, 24, 11, 10, 24, - 22, 12, 6, 10, 6, 10, 1, 35, 4, 60, 10, 0, 10, 2, 12, 11, 12, 8, - 10, 1, 11, 6, 23, 74, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 171, 205, 10, 2, 4, 3, 76, 80, 45, 10, 2, 2, 1, 45, 10, 2, + 3, 2, 76, 80, 10, 2, 1, 0, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, + 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, + 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, + 97, 95, 118, 49, 128, 9, 8, 1, 0, 0, 0, 0, 0, 0, 0, 12, 69, 90, + 69, 82, 79, 95, 65, 77, 79, 85, 78, 84, 52, 65, 109, 111, 117, 110, 116, 32, + 111, 102, 32, 116, 111, 107, 101, 110, 115, 32, 112, 114, 111, 118, 105, 100, 101, 100, + 32, 109, 117, 115, 116, 32, 98, 101, 32, 103, 114, 101, 97, 116, 101, 114, 32, 116, + 104, 97, 110, 32, 122, 101, 114, 111, 46, 2, 0, 0, 0, 0, 0, 0, 0, 30, + 69, 73, 78, 83, 85, 70, 70, 73, 67, 73, 69, 78, 84, 95, 76, 73, 81, 85, + 73, 68, 73, 84, 89, 95, 77, 73, 78, 84, 69, 68, 99, 84, 104, 101, 32, 97, + 109, 111, 117, 110, 116, 32, 111, 102, 32, 108, 105, 113, 117, 105, 100, 105, 116, 121, + 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 105, 115, 32, 115, 111, 32, 115, 109, + 97, 108, 108, 32, 116, 104, 97, 116, 32, 99, 111, 114, 114, 101, 115, 112, 111, 110, + 100, 105, 110, 103, 32, 76, 80, 32, 116, 111, 107, 101, 110, 32, 97, 109, 111, 117, + 110, 116, 32, 105, 115, 32, 114, 111, 117, 110, 100, 101, 100, 32, 116, 111, 32, 122, + 101, 114, 111, 46, 3, 0, 0, 0, 0, 0, 0, 0, 32, 69, 73, 78, 83, 85, + 70, 70, 73, 67, 73, 69, 78, 84, 95, 76, 73, 81, 85, 73, 68, 73, 84, 89, + 95, 82, 69, 68, 69, 69, 77, 69, 68, 98, 65, 109, 111, 117, 110, 116, 32, 111, + 102, 32, 76, 80, 32, 116, 111, 107, 101, 110, 115, 32, 114, 101, 100, 101, 101, 109, + 101, 100, 32, 105, 115, 32, 116, 111, 111, 32, 115, 109, 97, 108, 108, 44, 32, 115, + 111, 32, 97, 109, 111, 117, 110, 116, 115, 32, 111, 102, 32, 116, 111, 107, 101, 110, + 115, 32, 114, 101, 99, 101, 105, 118, 101, 100, 32, 98, 97, 99, 107, 32, 97, 114, + 101, 32, 114, 111, 117, 110, 100, 101, 100, 32, 116, 111, 32, 122, 101, 114, 111, 46, + 4, 0, 0, 0, 0, 0, 0, 0, 22, 69, 73, 78, 67, 79, 82, 82, 69, 67, + 84, 95, 83, 87, 65, 80, 95, 65, 77, 79, 85, 78, 84, 94, 84, 104, 101, 32, + 115, 112, 101, 99, 105, 102, 105, 101, 100, 32, 97, 109, 111, 117, 110, 116, 32, 111, + 102, 32, 111, 117, 116, 112, 117, 116, 32, 116, 111, 107, 101, 110, 115, 32, 105, 115, + 32, 105, 110, 99, 111, 114, 114, 101, 99, 116, 32, 97, 110, 100, 32, 100, 111, 101, + 115, 32, 110, 111, 116, 32, 109, 97, 105, 110, 116, 97, 105, 110, 32, 116, 104, 101, + 32, 112, 111, 111, 108, 39, 115, 32, 105, 110, 118, 97, 114, 105, 97, 110, 116, 46, + 5, 0, 0, 0, 0, 0, 0, 0, 16, 69, 78, 79, 84, 95, 83, 84, 79, 82, + 69, 95, 79, 87, 78, 69, 82, 50, 84, 104, 101, 32, 99, 97, 108, 108, 101, 114, + 32, 105, 115, 32, 110, 111, 116, 32, 116, 104, 101, 32, 111, 119, 110, 101, 114, 32, + 111, 102, 32, 116, 104, 101, 32, 76, 80, 32, 116, 111, 107, 101, 110, 32, 115, 116, + 111, 114, 101, 46, 6, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, + 65, 85, 84, 72, 79, 82, 73, 90, 69, 68, 50, 67, 108, 97, 108, 101, 114, 32, + 105, 115, 32, 110, 111, 116, 32, 97, 117, 116, 104, 111, 114, 105, 122, 101, 100, 32, + 116, 111, 32, 112, 101, 114, 102, 111, 114, 109, 32, 116, 104, 101, 32, 111, 112, 101, + 114, 97, 116, 105, 111, 110, 46, 7, 0, 0, 0, 0, 0, 0, 0, 17, 69, 83, + 87, 65, 80, 83, 95, 65, 82, 69, 95, 80, 65, 85, 83, 69, 68, 31, 65, 108, + 108, 32, 115, 119, 97, 112, 115, 32, 97, 114, 101, 32, 99, 117, 114, 114, 101, 110, + 116, 108, 121, 32, 112, 97, 117, 115, 101, 100, 46, 8, 0, 0, 0, 0, 0, 0, + 0, 41, 69, 75, 95, 66, 69, 70, 79, 82, 69, 95, 83, 87, 65, 80, 95, 71, + 82, 69, 65, 84, 69, 82, 95, 84, 72, 65, 78, 95, 69, 75, 95, 65, 70, 84, + 69, 82, 95, 83, 87, 65, 80, 46, 83, 119, 97, 112, 32, 108, 101, 97, 118, 101, + 115, 32, 112, 111, 111, 108, 32, 105, 110, 32, 97, 32, 119, 111, 114, 115, 101, 32, + 115, 116, 97, 116, 101, 32, 116, 104, 97, 110, 32, 98, 101, 102, 111, 114, 101, 46, + 4, 4, 83, 119, 97, 112, 1, 4, 0, 10, 67, 114, 101, 97, 116, 101, 80, 111, + 111, 108, 1, 4, 0, 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, + 108, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, + 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 14, 70, 101, 101, 115, 65, 99, + 99, 111, 117, 110, 116, 105, 110, 103, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, + 98, 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, + 13, 9, 97, 108, 108, 95, 112, 111, 111, 108, 115, 1, 1, 0, 9, 105, 115, 95, + 115, 116, 97, 98, 108, 101, 1, 1, 0, 12, 115, 119, 97, 112, 95, 102, 101, 101, + 95, 98, 112, 115, 1, 1, 0, 13, 109, 105, 110, 95, 108, 105, 113, 117, 105, 100, + 105, 116, 121, 1, 1, 0, 13, 112, 111, 111, 108, 95, 114, 101, 115, 101, 114, 118, + 101, 115, 1, 1, 0, 14, 99, 108, 97, 105, 109, 97, 98, 108, 101, 95, 102, 101, + 101, 115, 1, 1, 0, 14, 103, 101, 116, 95, 97, 109, 111, 117, 110, 116, 95, 111, + 117, 116, 1, 1, 0, 14, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, + 111, 108, 1, 1, 0, 15, 108, 112, 95, 116, 111, 107, 101, 110, 95, 115, 117, 112, + 112, 108, 121, 1, 1, 0, 21, 116, 111, 116, 97, 108, 95, 110, 117, 109, 98, 101, + 114, 95, 111, 102, 95, 112, 111, 111, 108, 115, 1, 1, 0, 22, 108, 105, 113, 117, + 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, + 1, 1, 0, 22, 115, 117, 112, 112, 111, 114, 116, 101, 100, 95, 105, 110, 110, 101, + 114, 95, 97, 115, 115, 101, 116, 115, 1, 1, 0, 27, 108, 105, 113, 117, 105, 100, + 105, 116, 121, 95, 112, 111, 111, 108, 95, 97, 100, 100, 114, 101, 115, 115, 95, 115, + 97, 102, 101, 1, 1, 0, 0, 2, 4, 2, 11, 1, 1, 8, 2, 6, 11, 1, + 1, 8, 3, 9, 11, 1, 1, 8, 3, 10, 1, 4, 2, 6, 12, 4, 13, 4, + 14, 11, 5, 2, 5, 4, 17, 11, 5, 2, 5, 4, 18, 11, 5, 2, 5, 4, + 19, 11, 5, 2, 5, 4, 6, 2, 3, 21, 8, 7, 23, 8, 8, 25, 8, 9, + 2, 2, 7, 27, 11, 1, 1, 8, 10, 29, 11, 1, 1, 8, 10, 30, 11, 1, + 1, 8, 10, 31, 11, 1, 1, 8, 10, 32, 8, 6, 33, 3, 10, 1, 11, 2, + 4, 35, 11, 12, 1, 11, 1, 1, 8, 2, 38, 1, 39, 3, 40, 3, 13, 2, + 3, 2, 5, 42, 11, 1, 1, 8, 3, 43, 3, 0, 3, 0, 3, 1, 3, 4, + 18, 190, 1, 7, 0, 43, 4, 16, 0, 20, 3, 186, 1, 14, 2, 17, 1, 12, + 3, 14, 2, 17, 2, 12, 4, 10, 1, 10, 3, 10, 4, 17, 3, 12, 5, 12, + 6, 13, 2, 10, 5, 17, 4, 12, 7, 14, 1, 56, 0, 43, 3, 12, 8, 10, + 8, 12, 9, 10, 9, 16, 1, 20, 56, 1, 77, 12, 10, 10, 9, 16, 2, 20, + 56, 1, 77, 12, 11, 11, 9, 16, 3, 20, 4, 181, 1, 10, 10, 10, 10, 24, + 10, 10, 24, 10, 11, 24, 10, 11, 10, 11, 24, 11, 11, 24, 11, 10, 24, 22, + 12, 12, 14, 1, 56, 0, 42, 1, 12, 13, 10, 8, 16, 1, 20, 12, 14, 10, + 8, 16, 2, 20, 12, 15, 11, 5, 53, 12, 16, 10, 3, 12, 17, 10, 8, 16, + 1, 20, 56, 2, 12, 18, 11, 17, 11, 18, 33, 4, 159, 1, 11, 14, 11, 2, + 56, 3, 10, 8, 16, 4, 20, 11, 7, 56, 3, 10, 13, 16, 5, 20, 11, 16, + 22, 11, 13, 15, 5, 21, 11, 0, 11, 15, 11, 6, 56, 4, 12, 19, 11, 8, + 12, 9, 10, 9, 16, 1, 20, 56, 1, 77, 12, 20, 10, 9, 16, 2, 20, 56, + 1, 77, 12, 21, 11, 9, 16, 3, 20, 4, 154, 1, 10, 20, 10, 20, 24, 10, + 20, 24, 10, 21, 24, 10, 21, 10, 21, 24, 11, 21, 24, 11, 20, 24, 22, 12, + 22, 11, 12, 11, 22, 37, 4, 152, 1, 14, 1, 56, 0, 11, 3, 11, 4, 18, + 5, 56, 5, 11, 19, 2, 6, 8, 0, 0, 0, 0, 0, 0, 0, 39, 11, 20, + 11, 21, 24, 12, 22, 5, 140, 1, 11, 15, 11, 2, 56, 3, 10, 8, 16, 6, + 20, 11, 7, 56, 3, 10, 13, 16, 7, 20, 11, 16, 22, 11, 13, 15, 7, 21, + 11, 0, 11, 14, 11, 6, 56, 4, 12, 19, 5, 106, 11, 10, 11, 11, 24, 12, + 12, 5, 59, 11, 0, 1, 6, 7, 0, 0, 0, 0, 0, 0, 0, 39, 11, 1, + 0, 1, 4, 47, 198, 1, 7, 0, 42, 4, 12, 4, 10, 1, 12, 5, 10, 2, + 12, 6, 10, 3, 12, 7, 10, 5, 12, 8, 10, 6, 12, 9, 7, 1, 17, 12, + 12, 10, 13, 10, 11, 8, 56, 6, 17, 14, 13, 10, 7, 2, 17, 15, 13, 10, + 11, 9, 56, 6, 17, 14, 11, 10, 12, 11, 11, 5, 12, 12, 11, 6, 12, 13, + 11, 7, 12, 14, 64, 26, 0, 0, 0, 0, 0, 0, 0, 0, 12, 15, 13, 15, + 14, 12, 56, 7, 12, 16, 14, 16, 56, 8, 56, 9, 13, 15, 14, 13, 56, 7, + 12, 17, 14, 17, 56, 8, 56, 9, 13, 15, 14, 14, 56, 10, 56, 9, 11, 15, + 12, 18, 11, 0, 11, 18, 17, 18, 12, 19, 14, 19, 12, 20, 10, 20, 12, 21, + 56, 11, 7, 3, 17, 12, 49, 8, 7, 4, 17, 12, 7, 4, 17, 12, 12, 22, + 12, 23, 12, 24, 12, 25, 12, 26, 11, 21, 11, 26, 11, 11, 11, 25, 11, 24, + 11, 23, 11, 22, 17, 20, 10, 20, 17, 21, 12, 27, 14, 27, 12, 0, 10, 20, + 56, 12, 12, 5, 10, 20, 10, 5, 56, 13, 1, 10, 0, 12, 28, 10, 0, 12, + 29, 10, 1, 12, 6, 11, 29, 17, 24, 12, 30, 14, 30, 11, 6, 56, 13, 12, + 31, 10, 0, 12, 29, 10, 2, 12, 6, 11, 29, 17, 24, 12, 32, 14, 32, 11, + 6, 56, 13, 12, 33, 10, 0, 12, 29, 10, 1, 12, 6, 11, 29, 17, 24, 12, + 34, 14, 34, 11, 6, 56, 13, 12, 35, 10, 0, 12, 29, 10, 2, 12, 6, 11, + 29, 17, 24, 12, 36, 14, 36, 11, 6, 56, 13, 12, 37, 11, 20, 17, 25, 12, + 38, 10, 3, 4, 193, 1, 10, 4, 16, 8, 20, 12, 39, 11, 31, 11, 33, 11, + 35, 11, 37, 11, 38, 11, 39, 10, 3, 18, 3, 12, 40, 11, 28, 11, 40, 45, + 3, 11, 0, 12, 29, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 56, 14, 56, 14, 56, 14, 56, 14, 18, 1, 12, 41, 11, 29, 11, + 41, 45, 1, 11, 5, 56, 15, 12, 42, 11, 4, 15, 9, 10, 42, 56, 16, 10, + 42, 11, 1, 11, 2, 11, 3, 18, 0, 56, 17, 11, 42, 2, 10, 4, 16, 10, + 20, 12, 39, 5, 153, 1, 29, 1, 4, 2, 1, 3, 52, 35, 10, 3, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 36, 4, 31, 11, 0, 17, 30, 12, 5, 10, 5, + 10, 1, 56, 18, 12, 6, 10, 2, 10, 1, 56, 18, 12, 7, 11, 5, 10, 1, + 17, 32, 11, 2, 10, 1, 17, 32, 14, 1, 56, 0, 43, 3, 16, 11, 16, 12, + 11, 6, 11, 7, 11, 3, 56, 19, 2, 11, 0, 1, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 39, 34, 1, 0, 2, 1, 3, 59, 175, 1, 14, 1, 17, 1, 14, + 2, 17, 1, 11, 3, 17, 35, 12, 4, 10, 0, 17, 30, 10, 4, 56, 18, 12, + 5, 14, 1, 17, 2, 12, 6, 14, 2, 17, 2, 12, 7, 10, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 36, 4, 172, 1, 10, 7, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 12, 3, 11, 3, 4, 168, 1, 14, 4, 56, 0, 43, 3, 12, + 9, 10, 9, 16, 1, 20, 12, 10, 10, 9, 16, 2, 20, 12, 11, 10, 10, 56, + 1, 12, 8, 10, 11, 56, 1, 12, 12, 10, 4, 56, 20, 56, 21, 12, 13, 10, + 9, 16, 11, 16, 13, 12, 14, 10, 13, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 105, 11, 6, 53, 11, 7, 53, 24, + 17, 38, 52, 10, 14, 10, 4, 6, 232, 3, 0, 0, 0, 0, 0, 0, 56, 22, + 6, 232, 3, 0, 0, 0, 0, 0, 0, 23, 12, 17, 10, 17, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 36, 4, 97, 11, 10, 11, 1, 56, 3, 11, 11, 11, 2, + 56, 3, 11, 0, 17, 30, 11, 4, 17, 32, 11, 14, 11, 17, 17, 40, 12, 18, + 11, 9, 16, 11, 16, 12, 11, 5, 11, 18, 56, 23, 2, 11, 0, 1, 11, 9, + 1, 11, 14, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 39, 11, 6, 12, 16, + 10, 13, 52, 12, 19, 10, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, + 159, 1, 11, 16, 53, 11, 19, 53, 24, 11, 8, 53, 26, 52, 12, 20, 11, 7, + 12, 21, 11, 13, 52, 12, 22, 11, 12, 12, 23, 10, 23, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 4, 150, 1, 11, 21, 53, 11, 22, 53, 24, 11, 23, 53, + 26, 52, 12, 24, 11, 20, 11, 24, 17, 42, 12, 17, 5, 72, 11, 0, 1, 11, + 9, 1, 11, 14, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, 43, 39, 11, + 0, 1, 11, 9, 1, 11, 14, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, + 43, 39, 11, 0, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 39, 9, 12, 3, + 5, 26, 35, 1, 0, 0, 2, 6, 11, 0, 11, 1, 11, 2, 17, 44, 56, 24, + 2, 46, 1, 0, 1, 4, 63, 30, 7, 0, 43, 4, 16, 9, 12, 0, 64, 20, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 10, 0, 56, 25, 12, 2, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 3, 10, 3, 10, 2, 35, 4, 26, 13, 1, + 10, 0, 10, 3, 56, 26, 20, 68, 20, 11, 3, 6, 1, 0, 0, 0, 0, 0, + 0, 0, 22, 12, 3, 5, 11, 11, 0, 1, 11, 1, 2, 49, 3, 0, 2, 1, + 3, 69, 97, 11, 1, 17, 30, 12, 3, 10, 3, 10, 2, 17, 32, 14, 2, 56, + 0, 43, 3, 12, 4, 14, 2, 56, 0, 42, 1, 12, 5, 10, 5, 16, 14, 10, + 3, 56, 27, 4, 94, 10, 5, 15, 14, 10, 3, 56, 28, 12, 6, 10, 5, 16, + 15, 10, 3, 56, 27, 4, 89, 11, 5, 15, 15, 11, 3, 56, 28, 12, 7, 10, + 6, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 4, 82, 10, 4, 16, 4, 20, 11, 6, 52, 12, 9, 12, 10, 10, 0, 11, + 10, 11, 9, 56, 4, 12, 11, 10, 7, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 73, 11, 4, 16, 6, 20, 11, 7, + 52, 12, 9, 12, 10, 11, 0, 11, 10, 11, 9, 56, 4, 12, 12, 11, 11, 12, + 13, 11, 12, 12, 14, 11, 13, 11, 14, 2, 11, 0, 1, 11, 4, 16, 6, 20, + 56, 2, 56, 29, 12, 12, 5, 66, 10, 4, 16, 4, 20, 56, 2, 56, 29, 12, + 11, 5, 50, 11, 5, 1, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 12, 7, 5, 34, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 5, 24, 53, 1, 0, 1, 1, 73, + 25, 14, 1, 56, 0, 43, 1, 12, 2, 10, 2, 16, 14, 50, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 3, 14, 3, 12, 4, + 10, 0, 11, 4, 56, 30, 20, 11, 2, 16, 15, 50, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 14, 6, 12, 4, 11, 0, + 11, 4, 56, 30, 20, 2, 55, 1, 0, 1, 3, 2, 6, 14, 0, 56, 0, 43, + 3, 16, 3, 20, 2, 25, 0, 0, 0, 2, 8, 10, 0, 17, 56, 10, 0, 17, + 57, 11, 0, 17, 58, 18, 2, 2, 31, 0, 0, 1, 3, 78, 22, 10, 0, 10, + 1, 56, 31, 1, 11, 0, 10, 1, 56, 32, 12, 2, 10, 2, 56, 33, 4, 12, + 5, 20, 14, 1, 56, 34, 43, 3, 16, 11, 16, 12, 10, 2, 8, 56, 35, 11, + 2, 2, 3, 1, 0, 1, 3, 81, 130, 1, 14, 0, 56, 0, 43, 3, 12, 3, + 10, 3, 16, 1, 20, 56, 1, 77, 12, 4, 10, 3, 16, 2, 20, 56, 1, 77, + 12, 5, 10, 3, 16, 1, 20, 56, 2, 12, 6, 11, 1, 11, 6, 33, 4, 125, + 11, 4, 12, 7, 11, 5, 12, 8, 10, 2, 12, 9, 10, 3, 16, 16, 20, 12, + 10, 11, 9, 53, 11, 10, 53, 24, 50, 16, 39, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 52, 12, 11, 11, 2, 10, 11, 23, 77, 12, + 12, 10, 3, 16, 3, 20, 4, 109, 11, 3, 12, 13, 10, 13, 16, 1, 20, 56, + 1, 77, 12, 14, 10, 13, 16, 2, 20, 56, 1, 77, 12, 15, 11, 13, 16, 3, + 20, 4, 104, 10, 14, 10, 14, 24, 10, 14, 24, 10, 15, 24, 10, 15, 10, 15, + 24, 11, 15, 24, 11, 14, 24, 22, 12, 16, 10, 8, 12, 17, 11, 12, 11, 7, + 22, 11, 16, 11, 8, 17, 63, 12, 18, 11, 17, 11, 18, 23, 12, 17, 11, 17, + 52, 11, 11, 2, 11, 14, 11, 15, 24, 12, 16, 5, 87, 11, 3, 1, 10, 12, + 11, 8, 24, 11, 7, 11, 12, 22, 26, 12, 17, 5, 100, 11, 3, 1, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 17, 43, 39, 11, 5, 12, 7, 11, 4, 12, 8, + 5, 29, 63, 0, 0, 0, 82, 116, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 3, 10, 3, 6, 255, 0, 0, 0, 0, 0, 0, 0, 35, 4, 114, 10, 2, 12, + 5, 10, 0, 12, 6, 10, 2, 12, 7, 10, 7, 10, 7, 24, 10, 7, 24, 12, + 8, 10, 6, 11, 8, 24, 10, 6, 10, 6, 24, 11, 6, 24, 11, 7, 24, 22, + 12, 6, 10, 6, 10, 1, 35, 4, 87, 10, 1, 11, 6, 23, 10, 0, 12, 8, + 10, 2, 12, 9, 74, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 8, 24, 10, 9, 11, 9, 24, 24, 10, 8, 10, 8, 24, 11, 8, 24, + 22, 26, 12, 7, 11, 2, 11, 7, 22, 12, 2, 10, 2, 10, 5, 36, 4, 78, + 10, 2, 11, 5, 23, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 10, 8, 24, 10, 11, 11, 11, 24, 24, 10, 8, 10, 8, 24, 11, 8, - 24, 22, 26, 12, 3, 11, 2, 11, 3, 22, 12, 2, 5, 86, 10, 0, 10, 2, - 12, 12, 12, 9, 11, 6, 10, 1, 23, 74, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 37, 3, 71, 5, 73, 11, 2, 2, 11, 3, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 5, 2, 11, 5, 10, 2, 23, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 10, 9, 24, 10, 12, 11, 12, 24, 24, 10, 9, 10, - 9, 24, 11, 9, 24, 22, 26, 12, 4, 11, 2, 11, 4, 23, 12, 2, 10, 2, - 10, 13, 36, 4, 99, 10, 2, 11, 13, 23, 74, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 3, 85, 5, 73, 11, 2, 2, + 11, 6, 10, 1, 23, 10, 0, 12, 8, 10, 2, 12, 9, 74, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 37, 4, 98, 11, 2, 2, 5, 107, 11, 13, 10, - 2, 23, 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, - 4, 107, 11, 2, 2, 11, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, - 5, 5, 2, 11, 2, 2, 8, 0, 0, 0, 0, 8, 11, 0, 56, 27, 9, 6, - 10, 0, 0, 0, 0, 0, 0, 0, 6, 20, 0, 0, 0, 0, 0, 0, 0, 18, - 4, 45, 4, 2, 9, 1, 0, 1, 3, 0, 6, 14, 0, 56, 2, 43, 3, 16, - 12, 20, 2, 10, 1, 0, 0, 0, 6, 11, 0, 11, 1, 11, 2, 17, 11, 56, - 28, 2, 11, 1, 0, 0, 73, 38, 7, 12, 12, 7, 14, 7, 12, 8, 11, 0, - 11, 1, 11, 2, 12, 9, 12, 12, 12, 11, 7, 15, 12, 10, 13, 10, 12, 4, - 14, 11, 56, 10, 12, 3, 11, 4, 14, 3, 56, 11, 56, 12, 13, 10, 12, 6, - 14, 12, 56, 10, 12, 5, 11, 6, 14, 5, 56, 11, 56, 12, 13, 10, 14, 9, - 56, 13, 56, 12, 11, 8, 11, 10, 17, 61, 2, 12, 1, 0, 0, 19, 9, 11, - 0, 11, 1, 11, 2, 17, 11, 12, 3, 10, 3, 41, 3, 11, 3, 2, 13, 1, - 0, 0, 0, 4, 11, 0, 56, 29, 56, 30, 2, 14, 1, 0, 0, 0, 2, 7, - 11, 2, 15, 1, 0, 2, 1, 3, 76, 189, 1, 14, 1, 17, 64, 12, 25, 14, - 2, 17, 64, 12, 27, 11, 25, 11, 27, 11, 3, 17, 10, 12, 19, 10, 0, 17, - 25, 10, 19, 56, 31, 12, 15, 14, 1, 17, 65, 12, 8, 14, 2, 17, 65, 12, - 9, 10, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 31, 10, 9, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 36, 12, 4, 5, 33, 9, 12, 4, 11, 4, - 4, 36, 5, 40, 11, 0, 1, 7, 7, 39, 14, 19, 56, 2, 43, 3, 12, 20, - 10, 20, 16, 9, 20, 12, 23, 10, 20, 16, 10, 20, 12, 24, 10, 23, 56, 26, - 12, 21, 10, 24, 56, 26, 12, 22, 10, 19, 56, 32, 56, 30, 12, 16, 10, 20, - 16, 7, 16, 13, 12, 18, 10, 16, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 33, 4, 87, 11, 8, 53, 11, 9, 53, 24, 17, - 66, 52, 12, 29, 10, 18, 10, 19, 7, 11, 56, 33, 11, 29, 7, 11, 23, 12, - 5, 5, 153, 1, 11, 8, 10, 16, 52, 11, 21, 12, 12, 12, 10, 12, 6, 10, - 12, 6, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 99, 5, 108, 11, 20, 1, - 11, 18, 1, 11, 0, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, 58, 39, - 11, 6, 53, 11, 10, 53, 24, 11, 12, 53, 26, 52, 12, 26, 11, 9, 11, 16, - 52, 11, 22, 12, 13, 12, 11, 12, 7, 10, 13, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 34, 4, 130, 1, 5, 139, 1, 11, 20, 1, 11, 18, 1, 11, 0, 1, - 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, 58, 39, 11, 7, 53, 11, 11, 53, - 24, 11, 13, 53, 26, 52, 12, 28, 11, 26, 11, 28, 17, 68, 12, 5, 11, 5, - 12, 14, 10, 14, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 160, 1, 5, - 168, 1, 11, 20, 1, 11, 18, 1, 11, 0, 1, 7, 1, 39, 11, 23, 11, 1, - 56, 34, 11, 24, 11, 2, 56, 34, 11, 0, 17, 25, 11, 19, 17, 22, 11, 18, - 11, 14, 17, 70, 12, 17, 11, 20, 16, 7, 16, 8, 11, 15, 11, 17, 56, 35, - 2, 16, 1, 0, 1, 3, 82, 13, 14, 0, 56, 24, 43, 3, 12, 1, 10, 1, - 16, 9, 20, 56, 26, 11, 1, 16, 10, 20, 56, 26, 2, 17, 1, 0, 1, 3, - 82, 14, 14, 0, 56, 2, 43, 3, 12, 1, 10, 1, 16, 9, 20, 56, 6, 11, - 1, 16, 10, 20, 56, 6, 64, 42, 2, 0, 0, 0, 0, 0, 0, 0, 2, 18, - 3, 0, 3, 1, 3, 4, 83, 195, 1, 7, 12, 43, 4, 16, 14, 20, 32, 4, - 7, 5, 11, 11, 0, 1, 7, 6, 39, 14, 2, 17, 64, 12, 12, 14, 2, 17, - 65, 12, 6, 10, 1, 10, 12, 10, 6, 17, 6, 12, 10, 12, 7, 13, 2, 10, - 10, 17, 72, 12, 8, 14, 1, 56, 2, 43, 3, 12, 18, 10, 18, 12, 16, 10, - 16, 16, 9, 20, 56, 26, 77, 12, 19, 10, 16, 16, 10, 20, 56, 26, 77, 12, - 21, 11, 16, 16, 12, 20, 4, 66, 10, 19, 10, 19, 24, 10, 19, 24, 10, 21, - 24, 10, 21, 10, 21, 24, 11, 21, 24, 11, 19, 24, 22, 12, 3, 5, 70, 11, - 19, 11, 21, 24, 12, 3, 11, 3, 12, 14, 14, 1, 56, 2, 42, 1, 12, 9, - 10, 18, 16, 9, 20, 12, 23, 10, 18, 16, 10, 20, 12, 24, 11, 10, 53, 12, - 11, 10, 12, 10, 18, 16, 9, 20, 56, 6, 33, 4, 116, 11, 23, 11, 2, 56, - 34, 10, 18, 16, 3, 20, 11, 8, 56, 34, 10, 9, 16, 15, 20, 11, 11, 22, - 11, 9, 15, 15, 21, 11, 0, 11, 24, 11, 7, 56, 5, 12, 4, 5, 137, 1, - 11, 24, 11, 2, 56, 34, 10, 18, 16, 4, 20, 11, 8, 56, 34, 10, 9, 16, - 16, 20, 11, 11, 22, 11, 9, 15, 16, 21, 11, 0, 11, 23, 11, 7, 56, 5, - 12, 4, 11, 4, 12, 15, 11, 18, 12, 17, 10, 17, 16, 9, 20, 56, 26, 77, - 12, 20, 10, 17, 16, 10, 20, 56, 26, 77, 12, 22, 11, 17, 16, 12, 20, 4, - 174, 1, 10, 20, 10, 20, 24, 10, 20, 24, 10, 22, 24, 10, 22, 10, 22, 24, - 11, 22, 24, 11, 20, 24, 22, 12, 5, 5, 178, 1, 11, 20, 11, 22, 24, 12, - 5, 11, 5, 12, 13, 11, 14, 11, 13, 37, 4, 185, 1, 5, 187, 1, 7, 3, - 39, 14, 1, 56, 2, 11, 12, 11, 6, 18, 5, 56, 36, 11, 15, 2, 19, 1, - 0, 1, 3, 0, 6, 14, 0, 56, 2, 43, 3, 16, 11, 20, 2, 20, 1, 0, - 1, 4, 0, 5, 7, 12, 43, 4, 16, 0, 56, 0, 2, 21, 1, 4, 2, 1, - 3, 86, 36, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 5, 5, - 9, 11, 0, 1, 7, 7, 39, 11, 0, 17, 25, 12, 4, 10, 4, 10, 1, 56, - 31, 12, 5, 10, 2, 10, 1, 56, 31, 12, 6, 11, 4, 10, 1, 17, 22, 11, - 2, 10, 1, 17, 22, 14, 1, 56, 2, 43, 3, 16, 7, 16, 8, 11, 5, 11, - 6, 11, 3, 56, 37, 2, 22, 1, 4, 1, 1, 88, 139, 1, 14, 1, 56, 2, - 42, 1, 12, 14, 10, 14, 16, 15, 20, 12, 10, 10, 14, 16, 16, 20, 12, 11, - 10, 0, 10, 1, 56, 38, 53, 12, 17, 11, 1, 56, 39, 12, 18, 10, 17, 50, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, - 128, 1, 10, 14, 16, 17, 10, 0, 56, 40, 20, 12, 15, 10, 14, 16, 18, 10, - 0, 56, 40, 20, 12, 16, 10, 10, 11, 15, 23, 12, 12, 10, 11, 11, 16, 23, - 12, 13, 11, 12, 10, 17, 10, 18, 12, 6, 12, 4, 12, 2, 10, 6, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 55, - 5, 60, 11, 14, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, 58, 39, 11, - 2, 77, 11, 4, 77, 24, 11, 6, 77, 26, 53, 12, 8, 11, 13, 11, 17, 11, - 18, 12, 7, 12, 5, 12, 3, 10, 7, 50, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 81, 5, 86, 11, 14, 1, 6, 4, - 0, 0, 0, 0, 0, 0, 0, 17, 58, 39, 11, 3, 77, 11, 5, 77, 24, 11, - 7, 77, 26, 53, 12, 9, 10, 8, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 4, 112, 10, 14, 15, 1, 10, 0, 50, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 41, 12, - 19, 10, 19, 20, 11, 8, 22, 11, 19, 21, 10, 9, 50, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 128, 1, 10, 14, 15, - 2, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 56, 41, 12, 20, 10, 20, 20, 11, 9, 22, 11, 20, 21, 10, 14, 15, - 17, 10, 0, 11, 10, 56, 42, 11, 14, 15, 18, 11, 0, 11, 11, 56, 42, 2, - 4, 0, 1, 4, 1, 5, 3, 2, 3, 3, 4, 2, 4, 3, 3, 4, 2, 2, - 3, 0, 3, 1, 3, 5, 3, 6, 2, 1, 4, 1, 1, 0, 1, 1, 1, 2, - 1, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 8, 24, 10, 9, 11, 9, 24, + 24, 10, 8, 10, 8, 24, 11, 8, 24, 22, 26, 12, 6, 11, 2, 11, 6, 23, + 12, 2, 5, 60, 11, 2, 2, 64, 0, 0, 0, 84, 10, 56, 36, 9, 6, 10, + 0, 0, 0, 0, 0, 0, 0, 6, 20, 0, 0, 0, 0, 0, 0, 0, 18, 4, + 12, 1, 11, 0, 11, 1, 45, 4, 2, 44, 1, 0, 0, 86, 32, 7, 0, 12, + 3, 14, 3, 11, 0, 12, 4, 11, 1, 12, 5, 11, 2, 12, 6, 64, 26, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 7, 13, 7, 14, 4, 56, 7, 12, 8, 14, + 8, 56, 8, 56, 9, 13, 7, 14, 5, 56, 7, 12, 9, 14, 9, 56, 8, 56, + 9, 13, 7, 14, 6, 56, 10, 56, 9, 11, 7, 17, 66, 2, 67, 1, 0, 0, + 11, 9, 11, 0, 11, 1, 11, 2, 17, 44, 12, 3, 10, 3, 41, 3, 11, 3, + 2, 68, 1, 0, 0, 2, 4, 11, 0, 56, 37, 56, 21, 2, 69, 1, 0, 0, + 2, 2, 6, 232, 3, 0, 0, 0, 0, 0, 0, 2, 70, 1, 0, 1, 3, 88, + 13, 14, 0, 56, 34, 43, 3, 12, 1, 10, 1, 16, 1, 20, 56, 1, 11, 1, + 16, 2, 20, 56, 1, 2, 71, 1, 0, 1, 3, 88, 14, 14, 0, 56, 0, 43, + 3, 12, 1, 10, 1, 16, 1, 20, 56, 2, 11, 1, 16, 2, 20, 56, 2, 64, + 4, 2, 0, 0, 0, 0, 0, 0, 0, 2, 72, 1, 0, 1, 3, 2, 6, 14, + 0, 56, 0, 43, 3, 16, 16, 20, 2, 73, 1, 0, 1, 4, 2, 5, 7, 0, + 43, 4, 16, 9, 56, 25, 2, 32, 1, 4, 1, 1, 92, 138, 1, 14, 1, 56, + 0, 42, 1, 12, 2, 10, 2, 16, 5, 20, 12, 3, 10, 2, 16, 7, 20, 12, + 4, 10, 0, 10, 1, 56, 38, 53, 12, 5, 11, 1, 56, 39, 12, 6, 10, 5, + 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 3, 25, 5, 117, 10, 2, 16, 17, 10, 0, 56, 40, 20, 10, 2, 16, 18, 10, + 0, 56, 40, 20, 12, 8, 12, 7, 10, 3, 11, 7, 23, 12, 7, 10, 4, 11, + 8, 23, 12, 8, 10, 5, 12, 9, 10, 6, 12, 10, 10, 10, 50, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 133, 1, 11, + 7, 77, 11, 9, 77, 24, 11, 10, 77, 26, 53, 12, 11, 11, 8, 12, 12, 11, + 5, 12, 13, 11, 6, 12, 14, 10, 14, 50, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 4, 128, 1, 11, 12, 77, 11, 13, 77, + 24, 11, 14, 77, 26, 53, 12, 15, 10, 11, 50, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 3, 88, 5, 100, 10, 2, 15, 14, + 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 56, 41, 12, 18, 10, 18, 20, 11, 11, 22, 11, 18, 21, 10, 15, 50, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 3, 105, + 5, 117, 10, 2, 15, 15, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 56, 41, 12, 18, 10, 18, 20, 11, 15, 22, 11, + 18, 21, 10, 2, 15, 17, 10, 0, 11, 3, 56, 42, 11, 2, 15, 18, 11, 0, + 11, 4, 56, 42, 2, 11, 2, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, + 43, 39, 11, 2, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 17, 43, 39, 4, + 1, 3, 0, 3, 1, 3, 6, 3, 2, 1, 0, 3, 3, 1, 1, 4, 2, 4, + 0, 4, 3, 3, 4, 2, 2, 2, 1, 1, 4, 1, 5, 3, 5, 1, 2, 1, + 3, 0, 127, 0, ] }); #[rustfmt::skip] pub static MODULE_COMPLEX_LIQUIDITY_POOL_WRAPPER: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 16, 2, 16, 40, 3, 56, 109, - 4, 165, 1, 8, 5, 173, 1, 243, 1, 7, 160, 3, 250, 3, 8, 154, 7, 64, - 6, 218, 7, 76, 16, 166, 8, 77, 10, 243, 8, 27, 12, 142, 9, 177, 3, 13, - 191, 12, 10, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 0, - 7, 0, 8, 8, 0, 1, 9, 6, 0, 2, 12, 7, 1, 0, 1, 7, 13, 8, - 0, 1, 22, 8, 0, 1, 24, 0, 0, 2, 26, 2, 0, 3, 28, 7, 1, 0, - 0, 6, 30, 7, 0, 0, 10, 0, 1, 0, 0, 11, 2, 3, 0, 0, 14, 4, - 5, 0, 0, 15, 4, 1, 0, 0, 16, 6, 1, 0, 0, 17, 7, 1, 0, 1, - 25, 8, 9, 0, 7, 25, 10, 1, 0, 2, 27, 2, 12, 0, 3, 29, 1, 14, - 1, 0, 6, 31, 15, 16, 0, 4, 32, 17, 1, 0, 1, 33, 18, 3, 0, 1, - 34, 20, 21, 0, 7, 35, 22, 23, 0, 5, 36, 25, 26, 0, 4, 37, 29, 30, - 1, 8, 4, 38, 31, 9, 1, 8, 7, 16, 32, 9, 0, 4, 39, 33, 1, 0, - 7, 40, 35, 36, 1, 8, 9, 13, 16, 28, 17, 28, 20, 34, 6, 6, 12, 6, - 8, 1, 6, 8, 1, 3, 3, 1, 0, 2, 6, 12, 10, 2, 1, 8, 1, 2, - 6, 12, 1, 3, 11, 2, 1, 8, 3, 8, 1, 8, 1, 4, 6, 12, 6, 12, - 3, 1, 3, 11, 2, 1, 8, 3, 3, 3, 2, 6, 8, 1, 3, 1, 8, 5, - 4, 6, 12, 8, 5, 8, 5, 1, 2, 8, 6, 6, 8, 6, 1, 8, 6, 1, - 4, 1, 11, 7, 1, 9, 0, 1, 10, 2, 1, 8, 8, 7, 6, 8, 6, 11, - 7, 1, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 1, 6, 8, 6, 2, 8, - 1, 8, 1, 1, 6, 8, 1, 1, 11, 2, 1, 8, 4, 4, 6, 12, 11, 2, - 1, 8, 4, 11, 2, 1, 8, 4, 1, 1, 11, 2, 1, 8, 3, 5, 11, 2, - 1, 8, 3, 11, 2, 1, 8, 4, 8, 1, 11, 2, 1, 8, 4, 8, 1, 1, - 6, 12, 1, 5, 8, 11, 2, 1, 8, 4, 6, 8, 1, 8, 5, 6, 8, 0, - 6, 8, 1, 11, 2, 1, 8, 4, 8, 5, 8, 5, 1, 8, 4, 2, 5, 11, - 2, 1, 9, 0, 1, 3, 3, 6, 12, 11, 2, 1, 9, 0, 3, 3, 6, 12, - 11, 2, 1, 8, 3, 8, 5, 2, 5, 8, 5, 1, 8, 3, 1, 11, 2, 1, - 9, 0, 2, 3, 3, 22, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, - 111, 108, 95, 119, 114, 97, 112, 112, 101, 114, 14, 102, 117, 110, 103, 105, 98, 108, - 101, 95, 97, 115, 115, 101, 116, 6, 111, 98, 106, 101, 99, 116, 6, 111, 112, 116, - 105, 111, 110, 22, 112, 114, 105, 109, 97, 114, 121, 95, 102, 117, 110, 103, 105, 98, - 108, 101, 95, 115, 116, 111, 114, 101, 6, 115, 105, 103, 110, 101, 114, 6, 115, 116, - 114, 105, 110, 103, 14, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, - 108, 9, 65, 100, 100, 114, 101, 115, 115, 101, 115, 7, 77, 105, 110, 116, 82, 101, - 102, 13, 97, 100, 100, 95, 108, 105, 113, 117, 105, 100, 105, 116, 121, 21, 99, 114, - 101, 97, 116, 101, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, - 116, 6, 79, 98, 106, 101, 99, 116, 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, - 80, 111, 111, 108, 11, 99, 114, 101, 97, 116, 101, 95, 112, 111, 111, 108, 22, 105, - 110, 105, 116, 105, 97, 108, 105, 122, 101, 95, 108, 105, 113, 117, 105, 100, 95, 112, - 97, 105, 114, 4, 115, 119, 97, 112, 15, 118, 101, 114, 105, 102, 121, 95, 114, 101, - 115, 101, 114, 118, 101, 115, 4, 112, 111, 111, 108, 12, 116, 111, 107, 101, 110, 95, - 49, 95, 109, 105, 110, 116, 12, 116, 111, 107, 101, 110, 95, 50, 95, 109, 105, 110, - 116, 7, 116, 111, 107, 101, 110, 95, 49, 8, 77, 101, 116, 97, 100, 97, 116, 97, - 7, 116, 111, 107, 101, 110, 95, 50, 13, 70, 117, 110, 103, 105, 98, 108, 101, 65, - 115, 115, 101, 116, 4, 109, 105, 110, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, - 116, 111, 114, 82, 101, 102, 19, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, - 100, 95, 111, 98, 106, 101, 99, 116, 6, 79, 112, 116, 105, 111, 110, 4, 110, 111, - 110, 101, 6, 83, 116, 114, 105, 110, 103, 4, 117, 116, 102, 56, 43, 99, 114, 101, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 16, 2, 16, 40, 3, 56, 130, + 1, 4, 186, 1, 8, 5, 194, 1, 162, 2, 7, 228, 3, 250, 3, 8, 222, 7, + 64, 6, 158, 8, 56, 16, 214, 8, 108, 10, 194, 9, 27, 12, 221, 9, 245, 3, + 13, 210, 13, 10, 0, 0, 1, 4, 0, 6, 1, 9, 1, 15, 1, 17, 1, 27, + 1, 30, 0, 1, 8, 0, 1, 3, 7, 1, 0, 1, 2, 5, 8, 0, 3, 8, + 6, 0, 3, 12, 11, 0, 3, 20, 0, 0, 1, 26, 2, 0, 6, 29, 7, 1, + 0, 0, 7, 32, 7, 0, 0, 14, 0, 1, 0, 1, 4, 16, 2, 3, 0, 1, + 5, 18, 5, 6, 1, 8, 1, 5, 19, 7, 8, 1, 8, 1, 2, 14, 9, 8, + 0, 1, 5, 21, 10, 1, 0, 1, 3, 22, 11, 8, 0, 1, 0, 23, 13, 1, + 0, 1, 2, 22, 14, 1, 0, 1, 0, 24, 16, 17, 0, 1, 1, 25, 16, 18, + 0, 1, 6, 28, 1, 20, 1, 0, 1, 7, 31, 21, 22, 0, 1, 5, 33, 23, + 1, 0, 1, 3, 34, 24, 17, 0, 1, 0, 35, 26, 27, 0, 1, 3, 36, 28, + 29, 0, 1, 2, 37, 30, 31, 0, 1, 0, 38, 26, 1, 0, 1, 0, 39, 33, + 1, 0, 1, 2, 40, 36, 37, 1, 8, 1, 2, 4, 3, 4, 11, 19, 20, 35, + 4, 6, 12, 6, 12, 3, 1, 0, 1, 6, 12, 1, 5, 1, 8, 4, 2, 5, + 11, 1, 1, 9, 0, 1, 3, 3, 6, 12, 11, 1, 1, 9, 0, 3, 1, 8, + 5, 3, 6, 12, 11, 1, 1, 8, 2, 8, 5, 2, 5, 8, 5, 2, 6, 8, + 3, 3, 6, 6, 8, 0, 11, 1, 1, 8, 4, 6, 8, 3, 8, 5, 11, 1, + 1, 8, 2, 8, 5, 6, 6, 12, 6, 8, 3, 6, 8, 3, 3, 3, 1, 4, + 6, 12, 8, 5, 8, 5, 1, 2, 8, 5, 8, 5, 2, 6, 12, 10, 2, 1, + 8, 3, 1, 8, 6, 1, 4, 1, 11, 7, 1, 9, 0, 1, 10, 2, 1, 8, + 8, 7, 6, 8, 6, 11, 7, 1, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, + 1, 6, 8, 6, 9, 8, 6, 6, 8, 6, 6, 8, 6, 8, 8, 8, 8, 2, + 8, 8, 8, 8, 11, 7, 1, 4, 2, 6, 12, 1, 3, 11, 1, 1, 8, 2, + 8, 3, 8, 3, 1, 6, 8, 3, 1, 11, 1, 1, 8, 4, 4, 6, 12, 11, + 1, 1, 8, 4, 11, 1, 1, 8, 4, 1, 1, 11, 1, 1, 8, 2, 8, 10, + 2, 8, 3, 8, 3, 11, 1, 1, 8, 4, 11, 1, 1, 8, 4, 8, 3, 8, + 3, 11, 1, 1, 8, 2, 3, 11, 1, 1, 8, 2, 3, 3, 10, 8, 3, 8, + 3, 11, 1, 1, 8, 2, 3, 3, 6, 8, 3, 6, 8, 3, 11, 1, 1, 8, + 4, 11, 1, 1, 8, 4, 8, 0, 1, 8, 2, 1, 11, 1, 1, 9, 0, 2, + 3, 3, 22, 108, 105, 113, 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, 95, + 119, 114, 97, 112, 112, 101, 114, 9, 65, 100, 100, 114, 101, 115, 115, 101, 115, 4, + 112, 111, 111, 108, 6, 79, 98, 106, 101, 99, 116, 6, 111, 98, 106, 101, 99, 116, + 13, 76, 105, 113, 117, 105, 100, 105, 116, 121, 80, 111, 111, 108, 14, 108, 105, 113, + 117, 105, 100, 105, 116, 121, 95, 112, 111, 111, 108, 12, 116, 111, 107, 101, 110, 95, + 49, 95, 109, 105, 110, 116, 7, 77, 105, 110, 116, 82, 101, 102, 14, 102, 117, 110, + 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 12, 116, 111, 107, 101, 110, 95, + 50, 95, 109, 105, 110, 116, 7, 116, 111, 107, 101, 110, 95, 49, 8, 77, 101, 116, + 97, 100, 97, 116, 97, 7, 116, 111, 107, 101, 110, 95, 50, 4, 115, 119, 97, 112, + 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, + 22, 112, 114, 105, 109, 97, 114, 121, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, + 115, 116, 111, 114, 101, 7, 98, 97, 108, 97, 110, 99, 101, 8, 119, 105, 116, 104, + 100, 114, 97, 119, 13, 70, 117, 110, 103, 105, 98, 108, 101, 65, 115, 115, 101, 116, + 7, 100, 101, 112, 111, 115, 105, 116, 4, 109, 105, 110, 116, 13, 97, 100, 100, 95, + 108, 105, 113, 117, 105, 100, 105, 116, 121, 21, 99, 114, 101, 97, 116, 101, 95, 102, + 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 19, 99, 114, 101, 97, + 116, 101, 95, 110, 97, 109, 101, 100, 95, 111, 98, 106, 101, 99, 116, 14, 67, 111, + 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, 102, 6, 111, 112, 116, 105, 111, + 110, 4, 110, 111, 110, 101, 6, 79, 112, 116, 105, 111, 110, 6, 115, 116, 114, 105, + 110, 103, 4, 117, 116, 102, 56, 6, 83, 116, 114, 105, 110, 103, 43, 99, 114, 101, 97, 116, 101, 95, 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 110, 97, 98, 108, 101, 100, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 109, 105, 110, 116, - 95, 114, 101, 102, 17, 109, 105, 110, 116, 95, 114, 101, 102, 95, 109, 101, 116, 97, - 100, 97, 116, 97, 6, 99, 114, 101, 97, 116, 101, 10, 97, 100, 100, 114, 101, 115, - 115, 95, 111, 102, 7, 98, 97, 108, 97, 110, 99, 101, 8, 119, 105, 116, 104, 100, - 114, 97, 119, 7, 100, 101, 112, 111, 115, 105, 116, 13, 112, 111, 111, 108, 95, 114, - 101, 115, 101, 114, 118, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 95, 114, 101, 102, 11, 99, 114, 101, 97, 116, 101, 95, 112, 111, 111, 108, 17, 109, + 105, 110, 116, 95, 114, 101, 102, 95, 109, 101, 116, 97, 100, 97, 116, 97, 6, 99, + 114, 101, 97, 116, 101, 22, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 95, 108, + 105, 113, 117, 105, 100, 95, 112, 97, 105, 114, 15, 118, 101, 114, 105, 102, 121, 95, + 114, 101, 115, 101, 114, 118, 101, 115, 13, 112, 111, 111, 108, 95, 114, 101, 115, 101, + 114, 118, 101, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, - 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0, 0, 0, 0, 0, - 0, 10, 2, 1, 0, 10, 2, 6, 5, 116, 101, 115, 116, 49, 10, 2, 6, 5, - 116, 101, 115, 116, 50, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 171, 205, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, - 97, 95, 118, 49, 57, 2, 1, 0, 0, 0, 0, 0, 0, 0, 20, 69, 65, 68, - 68, 82, 69, 83, 83, 69, 83, 95, 78, 79, 84, 95, 70, 79, 85, 78, 68, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 14, 69, 78, 79, 84, 95, 80, 85, 66, 76, - 73, 83, 72, 69, 82, 0, 0, 0, 0, 2, 5, 18, 11, 2, 1, 8, 3, 19, - 8, 1, 20, 8, 1, 21, 11, 2, 1, 8, 4, 23, 11, 2, 1, 8, 4, 0, - 1, 0, 0, 1, 10, 11, 0, 11, 1, 11, 3, 17, 6, 11, 2, 11, 4, 17, - 6, 11, 5, 17, 7, 2, 1, 1, 0, 0, 11, 21, 11, 0, 10, 1, 17, 8, - 12, 2, 14, 2, 12, 3, 10, 3, 56, 0, 10, 1, 17, 10, 11, 1, 17, 10, - 49, 8, 7, 2, 17, 10, 7, 2, 17, 10, 17, 11, 11, 3, 17, 12, 2, 2, - 1, 0, 0, 19, 18, 10, 0, 7, 3, 17, 1, 12, 2, 10, 0, 7, 4, 17, - 1, 12, 3, 11, 0, 14, 2, 17, 13, 14, 3, 17, 13, 11, 1, 17, 14, 11, - 2, 11, 3, 2, 3, 1, 4, 0, 24, 45, 10, 0, 17, 15, 7, 5, 33, 4, - 6, 5, 10, 11, 0, 1, 7, 1, 39, 10, 0, 10, 1, 17, 2, 12, 6, 12, - 4, 12, 2, 10, 0, 14, 4, 14, 6, 6, 0, 225, 245, 5, 0, 0, 0, 0, - 6, 0, 194, 235, 11, 0, 0, 0, 0, 10, 1, 17, 0, 11, 1, 32, 4, 30, - 10, 2, 6, 0, 225, 245, 5, 0, 0, 0, 0, 6, 0, 194, 235, 11, 0, 0, - 0, 0, 17, 5, 14, 4, 17, 13, 12, 3, 14, 6, 17, 13, 12, 5, 11, 0, - 11, 2, 11, 4, 11, 6, 11, 3, 11, 5, 18, 0, 45, 0, 2, 4, 1, 4, - 1, 0, 27, 79, 10, 1, 17, 15, 7, 5, 33, 4, 6, 5, 12, 11, 0, 1, - 11, 1, 1, 7, 1, 39, 7, 5, 41, 0, 4, 16, 5, 22, 11, 0, 1, 11, - 1, 1, 7, 0, 39, 7, 5, 43, 0, 12, 7, 11, 3, 4, 35, 10, 7, 16, - 0, 20, 10, 7, 16, 1, 12, 5, 12, 4, 5, 42, 10, 7, 16, 2, 20, 10, - 7, 16, 3, 12, 5, 12, 4, 11, 4, 11, 5, 12, 8, 12, 9, 10, 0, 17, - 15, 10, 9, 56, 1, 10, 2, 38, 4, 61, 11, 8, 1, 10, 0, 11, 9, 11, - 2, 56, 2, 12, 6, 5, 65, 11, 8, 11, 2, 17, 6, 12, 6, 11, 6, 12, - 11, 11, 1, 11, 7, 16, 4, 20, 11, 11, 17, 18, 12, 10, 11, 0, 17, 15, - 11, 10, 17, 19, 2, 5, 0, 0, 0, 30, 17, 11, 0, 56, 3, 12, 3, 11, - 1, 33, 4, 7, 5, 9, 6, 0, 0, 0, 0, 0, 0, 0, 0, 39, 11, 3, - 11, 2, 33, 4, 14, 5, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 39, 2, - 0, 3, 0, 1, 0, 4, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 10, 2, 1, 0, 10, 2, + 6, 5, 116, 101, 115, 116, 49, 10, 2, 6, 5, 116, 101, 115, 116, 50, 20, 99, + 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, + 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, + 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 57, 2, 1, 0, 0, 0, + 0, 0, 0, 0, 20, 69, 65, 68, 68, 82, 69, 83, 83, 69, 83, 95, 78, 79, + 84, 95, 70, 79, 85, 78, 68, 0, 2, 0, 0, 0, 0, 0, 0, 0, 14, 69, + 78, 79, 84, 95, 80, 85, 66, 76, 73, 83, 72, 69, 82, 0, 0, 0, 0, 2, + 5, 2, 11, 1, 1, 8, 2, 7, 8, 3, 10, 8, 3, 11, 11, 1, 1, 8, + 4, 13, 11, 1, 1, 8, 4, 0, 1, 4, 1, 0, 12, 73, 10, 1, 17, 1, + 7, 0, 33, 4, 67, 7, 0, 41, 0, 4, 61, 7, 0, 43, 0, 12, 4, 11, + 3, 4, 53, 10, 4, 16, 0, 20, 12, 5, 10, 4, 16, 1, 12, 6, 10, 0, + 17, 1, 10, 5, 56, 0, 10, 2, 38, 4, 48, 11, 6, 1, 10, 0, 11, 5, + 11, 2, 56, 1, 12, 7, 11, 4, 16, 2, 20, 12, 8, 11, 1, 11, 8, 11, + 7, 17, 4, 12, 9, 11, 0, 17, 1, 11, 9, 17, 5, 2, 11, 6, 11, 2, + 17, 6, 12, 7, 5, 34, 10, 4, 16, 3, 20, 12, 5, 10, 4, 16, 4, 12, + 6, 5, 20, 11, 0, 1, 11, 1, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, + 39, 11, 0, 1, 11, 1, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 39, 7, + 1, 0, 0, 15, 14, 11, 1, 11, 3, 17, 6, 11, 2, 11, 4, 17, 6, 12, + 6, 12, 7, 11, 0, 11, 7, 11, 6, 11, 5, 17, 8, 2, 9, 1, 0, 0, + 25, 35, 11, 0, 10, 1, 17, 10, 12, 2, 14, 2, 12, 3, 10, 3, 12, 4, + 56, 2, 10, 1, 17, 12, 11, 1, 17, 12, 49, 8, 7, 1, 17, 12, 7, 1, + 17, 12, 12, 5, 12, 6, 12, 7, 12, 8, 12, 9, 12, 10, 11, 4, 11, 10, + 11, 9, 11, 8, 11, 7, 11, 6, 11, 5, 17, 13, 11, 3, 17, 14, 2, 15, + 1, 0, 0, 32, 26, 10, 0, 7, 2, 17, 9, 12, 3, 10, 0, 7, 3, 17, + 9, 12, 4, 14, 3, 17, 16, 14, 4, 17, 16, 12, 5, 12, 6, 11, 0, 11, + 6, 11, 5, 11, 1, 17, 17, 11, 3, 12, 7, 11, 4, 12, 8, 11, 7, 11, + 8, 2, 18, 1, 4, 0, 34, 50, 10, 0, 17, 1, 7, 0, 33, 4, 46, 10, + 0, 10, 1, 17, 15, 12, 2, 12, 3, 12, 4, 14, 3, 14, 2, 12, 7, 12, + 8, 10, 0, 11, 8, 11, 7, 6, 0, 225, 245, 5, 0, 0, 0, 0, 6, 0, + 194, 235, 11, 0, 0, 0, 0, 10, 1, 17, 7, 11, 1, 4, 25, 5, 29, 10, + 4, 6, 0, 225, 245, 5, 0, 0, 0, 0, 6, 0, 194, 235, 11, 0, 0, 0, + 0, 17, 19, 14, 3, 17, 16, 14, 2, 17, 16, 12, 9, 12, 10, 11, 4, 11, + 3, 11, 2, 11, 10, 11, 9, 18, 0, 12, 11, 11, 0, 11, 11, 45, 0, 2, + 11, 0, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 39, 19, 0, 0, 0, 6, + 15, 11, 0, 56, 3, 12, 3, 11, 1, 33, 4, 13, 11, 3, 11, 2, 33, 4, + 11, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 39, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 39, 0, 3, 0, 1, 0, 0, 0, 4, 0, 2, 0, ] }); #[rustfmt::skip] pub static MODULE_COMPLEX_SMART_TABLE_PICTURE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 10, 2, 10, 20, 3, 30, 55, - 4, 85, 8, 5, 93, 74, 7, 167, 1, 226, 1, 8, 137, 3, 64, 6, 201, 3, - 10, 16, 211, 3, 159, 1, 10, 242, 4, 15, 12, 129, 5, 254, 1, 13, 255, 6, - 4, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 0, 5, 8, 0, 0, 6, 8, - 0, 3, 12, 4, 2, 0, 0, 0, 0, 1, 13, 2, 0, 0, 7, 0, 1, 0, - 0, 8, 0, 1, 0, 0, 9, 2, 1, 0, 2, 14, 0, 4, 0, 3, 15, 1, - 6, 2, 7, 4, 1, 16, 4, 7, 0, 1, 17, 8, 9, 0, 1, 18, 8, 4, - 0, 4, 19, 13, 14, 1, 0, 3, 20, 15, 1, 2, 3, 2, 4, 5, 8, 11, - 8, 12, 9, 5, 1, 6, 12, 0, 4, 5, 3, 10, 3, 10, 2, 5, 5, 8, - 3, 12, 8, 1, 10, 5, 1, 5, 2, 14, 2, 1, 11, 2, 2, 9, 0, 9, - 1, 1, 8, 3, 1, 6, 8, 3, 1, 12, 5, 2, 3, 14, 3, 7, 8, 1, - 1, 3, 1, 2, 1, 6, 10, 9, 0, 1, 1, 3, 7, 11, 2, 2, 9, 0, - 9, 1, 9, 0, 9, 1, 19, 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, 101, - 95, 112, 105, 99, 116, 117, 114, 101, 6, 111, 98, 106, 101, 99, 116, 6, 115, 105, - 103, 110, 101, 114, 11, 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, 101, 6, 118, - 101, 99, 116, 111, 114, 11, 65, 108, 108, 80, 97, 108, 101, 116, 116, 101, 115, 7, - 80, 97, 108, 101, 116, 116, 101, 6, 99, 114, 101, 97, 116, 101, 11, 105, 110, 105, - 116, 95, 109, 111, 100, 117, 108, 101, 6, 117, 112, 100, 97, 116, 101, 3, 97, 108, - 108, 6, 112, 105, 120, 101, 108, 115, 10, 83, 109, 97, 114, 116, 84, 97, 98, 108, - 101, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, 102, 10, 97, - 100, 100, 114, 101, 115, 115, 95, 111, 102, 3, 110, 101, 119, 13, 99, 114, 101, 97, - 116, 101, 95, 111, 98, 106, 101, 99, 116, 15, 103, 101, 110, 101, 114, 97, 116, 101, - 95, 115, 105, 103, 110, 101, 114, 28, 97, 100, 100, 114, 101, 115, 115, 95, 102, 114, - 111, 109, 95, 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 95, 114, 101, 102, - 8, 105, 115, 95, 101, 109, 112, 116, 121, 6, 117, 112, 115, 101, 114, 116, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 11, 1, 0, 10, 2, 10, 20, 3, 30, 65, + 4, 95, 8, 5, 103, 79, 7, 182, 1, 226, 1, 8, 152, 3, 64, 16, 216, 3, + 190, 1, 10, 150, 5, 15, 12, 165, 5, 144, 2, 13, 181, 7, 4, 0, 0, 1, + 6, 1, 8, 1, 12, 1, 15, 0, 1, 8, 0, 0, 3, 8, 0, 1, 5, 4, + 2, 0, 0, 0, 0, 4, 17, 2, 0, 0, 7, 0, 1, 0, 1, 2, 9, 5, + 6, 1, 0, 1, 1, 10, 8, 1, 2, 3, 2, 1, 0, 11, 10, 1, 0, 1, + 3, 13, 10, 2, 0, 1, 1, 14, 1, 11, 2, 7, 4, 1, 4, 16, 2, 12, + 0, 1, 4, 18, 13, 14, 0, 1, 4, 19, 13, 2, 0, 1, 0, 20, 10, 1, + 0, 1, 1, 3, 1, 4, 2, 7, 5, 7, 4, 5, 3, 10, 3, 10, 2, 0, + 1, 5, 1, 3, 1, 2, 1, 6, 10, 9, 0, 1, 1, 2, 14, 2, 3, 7, + 11, 2, 2, 9, 0, 9, 1, 9, 0, 9, 1, 5, 7, 8, 1, 3, 14, 2, + 3, 1, 6, 12, 1, 11, 2, 2, 9, 0, 9, 1, 1, 8, 3, 1, 6, 8, + 3, 1, 12, 6, 5, 8, 1, 8, 3, 12, 10, 5, 8, 0, 1, 8, 0, 19, + 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, 101, 95, 112, 105, 99, 116, 117, 114, + 101, 11, 65, 108, 108, 80, 97, 108, 101, 116, 116, 101, 115, 3, 97, 108, 108, 7, + 80, 97, 108, 101, 116, 116, 101, 6, 112, 105, 120, 101, 108, 115, 10, 83, 109, 97, + 114, 116, 84, 97, 98, 108, 101, 11, 115, 109, 97, 114, 116, 95, 116, 97, 98, 108, + 101, 6, 117, 112, 100, 97, 116, 101, 6, 118, 101, 99, 116, 111, 114, 8, 105, 115, + 95, 101, 109, 112, 116, 121, 6, 117, 112, 115, 101, 114, 116, 6, 99, 114, 101, 97, + 116, 101, 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, + 111, 102, 3, 110, 101, 119, 6, 111, 98, 106, 101, 99, 116, 13, 99, 114, 101, 97, + 116, 101, 95, 111, 98, 106, 101, 99, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, + 116, 111, 114, 82, 101, 102, 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, + 103, 110, 101, 114, 28, 97, 100, 100, 114, 101, 115, 115, 95, 102, 114, 111, 109, 95, + 99, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 95, 114, 101, 102, 11, 105, 110, + 105, 116, 95, 109, 111, 100, 117, 108, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 3, 8, 1, 0, 0, 0, 0, 0, 0, 0, - 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, - 49, 138, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 21, 69, 95, 73, 78, 68, - 69, 88, 95, 79, 85, 84, 95, 79, 70, 95, 66, 79, 85, 78, 68, 83, 68, 84, - 104, 101, 32, 99, 97, 108, 108, 101, 114, 32, 116, 114, 105, 101, 100, 32, 116, 111, - 32, 109, 117, 116, 97, 116, 101, 32, 97, 110, 32, 105, 116, 101, 109, 32, 111, 117, - 116, 115, 105, 100, 101, 32, 116, 104, 101, 32, 98, 111, 117, 110, 100, 115, 32, 111, - 102, 32, 116, 104, 101, 32, 118, 101, 99, 116, 111, 114, 46, 1, 7, 80, 97, 108, - 101, 116, 116, 101, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, - 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 0, 0, 2, 1, - 10, 10, 5, 1, 2, 1, 11, 11, 2, 2, 14, 2, 0, 1, 4, 1, 0, 3, - 39, 10, 0, 17, 3, 12, 1, 56, 0, 18, 1, 12, 4, 10, 1, 17, 5, 12, - 2, 14, 2, 17, 6, 12, 3, 14, 3, 11, 4, 45, 1, 10, 1, 41, 0, 32, - 4, 30, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 12, 5, 13, 5, 14, 2, - 17, 7, 68, 4, 11, 0, 11, 5, 18, 0, 45, 0, 5, 38, 11, 0, 1, 11, - 1, 42, 0, 15, 0, 14, 2, 17, 7, 68, 4, 2, 1, 0, 0, 0, 1, 5, - 11, 0, 64, 4, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 45, 0, 2, 2, - 1, 4, 2, 0, 1, 10, 67, 11, 0, 43, 0, 16, 0, 11, 1, 66, 4, 20, - 42, 1, 12, 8, 14, 2, 65, 11, 14, 3, 65, 12, 33, 4, 15, 5, 19, 11, - 8, 1, 7, 0, 39, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 5, 14, 2, - 65, 11, 12, 7, 10, 5, 10, 7, 35, 4, 64, 5, 29, 14, 2, 56, 1, 32, - 4, 34, 5, 38, 11, 8, 1, 7, 0, 39, 13, 2, 69, 11, 76, 12, 6, 14, - 3, 56, 2, 32, 4, 47, 5, 51, 11, 8, 1, 7, 0, 39, 13, 3, 69, 12, - 12, 4, 10, 8, 15, 1, 11, 6, 11, 4, 56, 3, 11, 5, 6, 1, 0, 0, - 0, 0, 0, 0, 0, 22, 12, 5, 5, 24, 11, 8, 1, 2, 0, 0, 1, 0, - 0, + 1, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, + 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, + 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 138, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 21, 69, 95, 73, 78, 68, 69, 88, 95, 79, + 85, 84, 95, 79, 70, 95, 66, 79, 85, 78, 68, 83, 68, 84, 104, 101, 32, 99, + 97, 108, 108, 101, 114, 32, 116, 114, 105, 101, 100, 32, 116, 111, 32, 109, 117, 116, + 97, 116, 101, 32, 97, 110, 32, 105, 116, 101, 109, 32, 111, 117, 116, 115, 105, 100, + 101, 32, 116, 104, 101, 32, 98, 111, 117, 110, 100, 115, 32, 111, 102, 32, 116, 104, + 101, 32, 118, 101, 99, 116, 111, 114, 46, 1, 7, 80, 97, 108, 101, 116, 116, 101, + 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, + 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 0, 0, 2, 1, 2, 10, 5, 1, + 2, 1, 4, 11, 2, 2, 14, 2, 0, 1, 4, 2, 0, 1, 9, 61, 11, 0, + 43, 0, 16, 0, 11, 1, 66, 2, 20, 42, 1, 12, 4, 14, 2, 65, 3, 14, + 3, 65, 4, 33, 4, 57, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 14, + 2, 65, 3, 12, 5, 10, 1, 10, 5, 35, 4, 54, 14, 2, 56, 0, 3, 50, + 13, 2, 69, 3, 76, 12, 6, 14, 3, 56, 1, 3, 46, 13, 3, 69, 4, 12, + 7, 10, 4, 15, 1, 11, 6, 11, 7, 56, 2, 11, 1, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 12, 1, 5, 19, 11, 4, 1, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 39, 11, 4, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 39, 11, + 4, 1, 2, 11, 4, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 39, 3, 1, + 4, 1, 0, 15, 40, 10, 0, 17, 4, 12, 1, 56, 3, 18, 1, 12, 2, 10, + 1, 17, 6, 12, 3, 14, 3, 17, 7, 12, 4, 14, 4, 11, 2, 45, 1, 10, + 1, 41, 0, 3, 31, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 12, 5, 13, + 5, 14, 3, 17, 8, 68, 2, 11, 5, 18, 0, 12, 6, 11, 0, 11, 6, 45, + 0, 2, 11, 0, 1, 11, 1, 42, 0, 15, 0, 14, 3, 17, 8, 68, 2, 5, + 30, 9, 0, 0, 0, 16, 7, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 18, + 0, 12, 1, 11, 0, 11, 1, 45, 0, 2, 0, 0, 1, 0, 0, ] }); #[rustfmt::skip] pub static MODULE_COMPLEX_VECTOR_PICTURE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 11, 1, 0, 8, 2, 8, 16, 3, 24, 45, - 5, 69, 62, 7, 131, 1, 209, 1, 8, 212, 2, 64, 6, 148, 3, 20, 16, 168, - 3, 201, 1, 10, 241, 4, 22, 12, 135, 5, 225, 2, 13, 232, 7, 10, 0, 0, - 1, 1, 1, 2, 1, 3, 0, 4, 8, 0, 0, 5, 7, 0, 0, 6, 8, 0, - 2, 17, 2, 0, 0, 7, 0, 1, 0, 0, 8, 2, 1, 0, 0, 9, 3, 1, - 0, 0, 10, 4, 1, 0, 1, 16, 8, 8, 0, 3, 18, 3, 6, 0, 2, 19, - 6, 10, 0, 2, 20, 11, 12, 0, 2, 21, 11, 6, 0, 3, 5, 3, 3, 0, - 2, 6, 12, 3, 1, 6, 12, 6, 5, 3, 3, 2, 2, 2, 5, 3, 1, 1, - 6, 8, 1, 7, 8, 2, 1, 5, 1, 8, 1, 1, 3, 7, 5, 8, 3, 3, - 12, 8, 2, 10, 8, 1, 10, 5, 1, 8, 3, 1, 6, 8, 3, 1, 12, 1, - 7, 8, 2, 14, 118, 101, 99, 116, 111, 114, 95, 112, 105, 99, 116, 117, 114, 101, - 5, 101, 114, 114, 111, 114, 6, 111, 98, 106, 101, 99, 116, 6, 115, 105, 103, 110, - 101, 114, 11, 65, 108, 108, 80, 97, 108, 101, 116, 116, 101, 115, 5, 67, 111, 108, - 111, 114, 7, 80, 97, 108, 101, 116, 116, 101, 5, 99, 104, 101, 99, 107, 6, 99, - 114, 101, 97, 116, 101, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 6, - 117, 112, 100, 97, 116, 101, 3, 97, 108, 108, 1, 114, 1, 103, 1, 98, 3, 118, - 101, 99, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, - 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, 102, 10, 97, - 100, 100, 114, 101, 115, 115, 95, 111, 102, 13, 99, 114, 101, 97, 116, 101, 95, 111, - 98, 106, 101, 99, 116, 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, - 110, 101, 114, 28, 97, 100, 100, 114, 101, 115, 115, 95, 102, 114, 111, 109, 95, 99, - 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 95, 114, 101, 102, 0, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 10, 1, 0, 8, 2, 8, 16, 3, 24, 54, + 5, 78, 71, 7, 149, 1, 209, 1, 8, 230, 2, 64, 16, 166, 3, 232, 1, 10, + 142, 5, 22, 12, 164, 5, 132, 3, 13, 168, 8, 10, 0, 0, 1, 10, 1, 13, + 1, 15, 0, 1, 8, 0, 0, 3, 8, 0, 0, 5, 7, 0, 3, 17, 2, 0, + 0, 9, 0, 1, 0, 1, 1, 11, 4, 4, 0, 1, 0, 12, 6, 1, 0, 1, + 2, 14, 7, 2, 0, 1, 3, 16, 2, 8, 0, 1, 3, 18, 9, 10, 0, 1, + 3, 19, 9, 2, 0, 1, 0, 20, 7, 1, 0, 1, 0, 21, 13, 1, 0, 1, + 6, 5, 3, 3, 2, 2, 2, 0, 1, 5, 1, 8, 2, 1, 3, 2, 7, 8, + 1, 3, 2, 6, 12, 3, 1, 6, 12, 1, 8, 3, 1, 6, 8, 3, 1, 12, + 10, 5, 8, 2, 10, 8, 2, 3, 3, 8, 1, 8, 3, 12, 10, 5, 8, 0, + 1, 8, 0, 3, 5, 3, 3, 5, 7, 8, 1, 3, 6, 8, 2, 1, 1, 14, + 118, 101, 99, 116, 111, 114, 95, 112, 105, 99, 116, 117, 114, 101, 11, 65, 108, 108, + 80, 97, 108, 101, 116, 116, 101, 115, 3, 97, 108, 108, 7, 80, 97, 108, 101, 116, + 116, 101, 3, 118, 101, 99, 5, 67, 111, 108, 111, 114, 1, 114, 1, 103, 1, 98, + 6, 117, 112, 100, 97, 116, 101, 5, 101, 114, 114, 111, 114, 16, 105, 110, 118, 97, + 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 6, 99, 114, 101, 97, 116, + 101, 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, + 102, 6, 111, 98, 106, 101, 99, 116, 13, 99, 114, 101, 97, 116, 101, 95, 111, 98, + 106, 101, 99, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, + 102, 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 28, + 97, 100, 100, 114, 101, 115, 115, 95, 102, 114, 111, 109, 95, 99, 111, 110, 115, 116, + 114, 117, 99, 116, 111, 114, 95, 114, 101, 102, 11, 105, 110, 105, 116, 95, 109, 111, + 100, 117, 108, 101, 5, 99, 104, 101, 99, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 3, 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, - 3, 0, 0, 0, 0, 0, 0, 0, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, - 116, 97, 100, 97, 116, 97, 95, 118, 49, 180, 1, 2, 1, 0, 0, 0, 0, 0, - 0, 0, 21, 69, 95, 73, 78, 68, 69, 88, 95, 79, 85, 84, 95, 79, 70, 95, - 66, 79, 85, 78, 68, 83, 68, 84, 104, 101, 32, 99, 97, 108, 108, 101, 114, 32, - 116, 114, 105, 101, 100, 32, 116, 111, 32, 109, 117, 116, 97, 116, 101, 32, 97, 110, - 32, 105, 116, 101, 109, 32, 111, 117, 116, 115, 105, 100, 101, 32, 116, 104, 101, 32, - 98, 111, 117, 110, 100, 115, 32, 111, 102, 32, 116, 104, 101, 32, 118, 101, 99, 116, - 111, 114, 46, 3, 0, 0, 0, 0, 0, 0, 0, 11, 69, 95, 77, 65, 88, 95, - 67, 79, 76, 79, 82, 21, 67, 111, 108, 111, 114, 32, 99, 104, 101, 99, 107, 101, - 100, 32, 105, 115, 32, 109, 97, 120, 46, 1, 7, 80, 97, 108, 101, 116, 116, 101, - 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, - 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 0, 0, 2, 1, 11, 10, 5, 1, - 2, 3, 12, 2, 13, 2, 14, 2, 2, 2, 1, 15, 10, 8, 1, 0, 1, 4, - 2, 0, 2, 5, 63, 11, 0, 43, 0, 16, 0, 11, 1, 66, 6, 20, 42, 2, - 12, 7, 10, 2, 10, 7, 16, 1, 65, 7, 35, 4, 15, 5, 20, 11, 7, 1, - 7, 0, 17, 4, 39, 11, 7, 15, 1, 11, 2, 12, 3, 46, 11, 3, 66, 7, - 12, 6, 10, 6, 16, 2, 20, 49, 255, 34, 4, 37, 8, 12, 4, 5, 43, 10, - 6, 16, 3, 20, 49, 255, 34, 12, 4, 11, 4, 4, 50, 11, 6, 1, 8, 12, - 5, 5, 56, 11, 6, 16, 4, 20, 49, 255, 34, 12, 5, 11, 5, 4, 59, 5, - 62, 7, 1, 17, 4, 39, 2, 1, 1, 4, 1, 0, 9, 59, 10, 0, 17, 5, - 12, 2, 64, 7, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 4, 10, 4, 10, 1, 35, 4, 23, 5, 12, 13, 7, - 49, 124, 49, 213, 49, 37, 18, 1, 68, 7, 11, 4, 6, 1, 0, 0, 0, 0, - 0, 0, 0, 22, 12, 4, 5, 7, 11, 7, 18, 2, 12, 6, 10, 2, 17, 6, - 12, 3, 14, 3, 17, 7, 12, 5, 14, 5, 11, 6, 45, 2, 10, 2, 41, 0, - 32, 4, 50, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 8, 13, 8, 14, - 3, 17, 8, 68, 6, 11, 0, 11, 8, 18, 0, 45, 0, 5, 58, 11, 0, 1, - 11, 2, 42, 0, 15, 0, 14, 3, 17, 8, 68, 6, 2, 2, 0, 0, 0, 1, - 5, 11, 0, 64, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 45, 0, 2, - 3, 1, 4, 2, 0, 2, 13, 30, 11, 0, 43, 0, 16, 0, 11, 1, 66, 6, - 20, 42, 2, 12, 6, 10, 2, 10, 6, 16, 1, 65, 7, 35, 4, 15, 5, 20, - 11, 6, 1, 7, 0, 17, 4, 39, 11, 3, 11, 4, 11, 5, 18, 1, 11, 6, - 15, 1, 11, 2, 67, 7, 21, 2, 0, 0, 2, 0, 1, 0, 1, 1, 1, 2, - 0, + 0, 1, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, + 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, + 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 180, 1, + 2, 1, 0, 0, 0, 0, 0, 0, 0, 21, 69, 95, 73, 78, 68, 69, 88, 95, + 79, 85, 84, 95, 79, 70, 95, 66, 79, 85, 78, 68, 83, 68, 84, 104, 101, 32, + 99, 97, 108, 108, 101, 114, 32, 116, 114, 105, 101, 100, 32, 116, 111, 32, 109, 117, + 116, 97, 116, 101, 32, 97, 110, 32, 105, 116, 101, 109, 32, 111, 117, 116, 115, 105, + 100, 101, 32, 116, 104, 101, 32, 98, 111, 117, 110, 100, 115, 32, 111, 102, 32, 116, + 104, 101, 32, 118, 101, 99, 116, 111, 114, 46, 3, 0, 0, 0, 0, 0, 0, 0, + 11, 69, 95, 77, 65, 88, 95, 67, 79, 76, 79, 82, 21, 67, 111, 108, 111, 114, + 32, 99, 104, 101, 99, 107, 101, 100, 32, 105, 115, 32, 109, 97, 120, 46, 1, 7, + 80, 97, 108, 101, 116, 116, 101, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, + 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 0, + 0, 2, 1, 2, 10, 5, 1, 2, 1, 4, 10, 8, 2, 2, 2, 3, 6, 2, + 7, 2, 8, 2, 0, 1, 4, 2, 0, 1, 5, 33, 11, 0, 43, 0, 16, 0, + 11, 1, 66, 2, 20, 42, 1, 12, 6, 10, 2, 12, 1, 10, 6, 16, 1, 65, + 3, 12, 7, 11, 1, 11, 7, 35, 4, 28, 11, 3, 11, 4, 11, 5, 18, 2, + 11, 6, 15, 1, 11, 2, 67, 3, 21, 2, 11, 6, 1, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 17, 1, 39, 2, 1, 4, 1, 0, 11, 61, 10, 0, 17, 3, + 12, 2, 49, 124, 49, 213, 49, 37, 18, 2, 12, 3, 64, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 12, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 5, 10, + 5, 10, 1, 35, 4, 24, 13, 4, 10, 3, 68, 3, 11, 5, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 5, 5, 12, 11, 4, 18, 1, 12, 7, 10, 2, + 17, 4, 12, 8, 14, 8, 17, 5, 12, 9, 14, 9, 11, 7, 45, 1, 10, 2, + 41, 0, 3, 52, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 12, 10, 13, 10, + 14, 8, 17, 6, 68, 2, 11, 10, 18, 0, 12, 11, 11, 0, 11, 11, 45, 0, + 2, 11, 0, 1, 11, 2, 42, 0, 15, 0, 14, 8, 17, 6, 68, 2, 5, 51, + 7, 0, 0, 0, 12, 7, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 12, 1, 11, 0, 11, 1, 45, 0, 2, 8, 1, 4, 2, 0, 1, 14, 62, 11, + 0, 43, 0, 16, 0, 11, 1, 66, 2, 20, 42, 1, 12, 3, 10, 2, 12, 1, + 10, 3, 16, 1, 65, 3, 12, 4, 11, 1, 11, 4, 35, 4, 57, 11, 3, 16, + 1, 11, 2, 66, 3, 12, 5, 10, 5, 16, 2, 20, 49, 255, 34, 4, 50, 8, + 12, 6, 11, 6, 4, 43, 11, 5, 1, 8, 12, 7, 11, 7, 4, 40, 2, 6, + 3, 0, 0, 0, 0, 0, 0, 0, 17, 1, 39, 11, 5, 16, 3, 20, 49, 255, + 34, 12, 7, 5, 37, 10, 5, 16, 4, 20, 49, 255, 34, 12, 6, 5, 31, 11, + 3, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 1, 39, 0, 0, 1, 0, + 2, 0, 2, 2, 2, 1, 0, ] }); @@ -750,192 +765,203 @@ pub static PACKAGE_SIMPLE_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_SIMPLE_SIMPLE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 16, 2, 16, 46, 3, 62, 162, - 1, 4, 224, 1, 10, 5, 234, 1, 255, 1, 7, 233, 3, 192, 4, 8, 169, 8, - 64, 6, 233, 8, 115, 16, 220, 9, 62, 10, 154, 10, 51, 12, 205, 10, 251, 14, - 13, 200, 25, 16, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, - 1, 7, 0, 8, 8, 0, 0, 9, 8, 0, 0, 10, 7, 0, 0, 11, 8, 0, - 0, 12, 8, 0, 0, 13, 6, 0, 0, 14, 8, 0, 6, 27, 7, 0, 4, 42, - 4, 1, 6, 1, 7, 47, 4, 2, 3, 1, 0, 1, 0, 15, 0, 1, 0, 0, - 16, 2, 1, 0, 0, 17, 3, 4, 0, 0, 18, 5, 1, 0, 0, 19, 6, 1, - 0, 0, 20, 5, 1, 0, 0, 21, 6, 1, 0, 0, 22, 5, 1, 0, 0, 23, - 5, 1, 0, 0, 24, 6, 1, 0, 0, 25, 7, 1, 0, 0, 26, 6, 1, 0, - 0, 28, 8, 1, 0, 0, 29, 7, 1, 0, 0, 30, 9, 1, 0, 0, 31, 9, - 1, 0, 0, 32, 5, 1, 0, 0, 33, 10, 1, 0, 0, 34, 11, 1, 0, 0, - 35, 5, 1, 0, 0, 36, 6, 1, 0, 0, 37, 12, 1, 0, 0, 38, 5, 1, - 0, 5, 48, 5, 16, 0, 6, 49, 19, 20, 0, 1, 50, 5, 23, 1, 6, 4, - 51, 24, 1, 1, 6, 3, 52, 13, 13, 0, 2, 53, 29, 19, 1, 0, 7, 54, - 1, 33, 2, 3, 4, 7, 55, 34, 35, 2, 3, 2, 25, 22, 26, 22, 28, 28, - 29, 32, 30, 32, 2, 7, 10, 2, 6, 10, 2, 0, 2, 6, 12, 10, 2, 4, - 6, 8, 4, 6, 8, 4, 6, 8, 1, 6, 8, 1, 1, 6, 3, 1, 6, 12, - 2, 6, 12, 3, 3, 6, 12, 3, 3, 4, 6, 12, 3, 8, 7, 10, 2, 2, - 6, 12, 5, 2, 6, 12, 6, 12, 5, 6, 12, 6, 12, 6, 12, 6, 12, 6, - 12, 2, 6, 12, 8, 7, 1, 3, 1, 2, 2, 7, 8, 0, 8, 0, 1, 5, - 3, 6, 3, 6, 3, 6, 3, 3, 3, 8, 4, 7, 8, 4, 1, 10, 2, 1, - 8, 7, 2, 7, 8, 3, 5, 1, 8, 5, 1, 11, 8, 1, 9, 0, 2, 7, - 11, 8, 1, 9, 0, 9, 0, 3, 10, 3, 10, 3, 3, 7, 1, 1, 1, 3, - 3, 3, 3, 4, 3, 3, 10, 2, 10, 3, 1, 10, 3, 1, 6, 9, 0, 3, - 8, 2, 7, 8, 4, 8, 4, 3, 5, 7, 11, 9, 2, 3, 3, 7, 3, 2, - 3, 3, 1, 11, 9, 2, 9, 0, 9, 1, 3, 7, 11, 9, 2, 9, 0, 9, - 1, 9, 0, 9, 1, 1, 7, 9, 1, 8, 1, 10, 2, 7, 8, 4, 10, 2, - 3, 3, 8, 4, 7, 8, 4, 9, 3, 7, 8, 4, 3, 3, 3, 8, 4, 7, - 8, 4, 6, 8, 4, 6, 8, 4, 2, 7, 8, 4, 8, 4, 2, 8, 4, 7, - 8, 4, 2, 5, 7, 8, 1, 6, 115, 105, 109, 112, 108, 101, 7, 97, 99, 99, - 111, 117, 110, 116, 3, 98, 99, 115, 5, 101, 114, 114, 111, 114, 5, 101, 118, 101, - 110, 116, 6, 115, 105, 103, 110, 101, 114, 6, 115, 116, 114, 105, 110, 103, 5, 116, - 97, 98, 108, 101, 12, 66, 121, 116, 101, 82, 101, 115, 111, 117, 114, 99, 101, 7, - 67, 111, 117, 110, 116, 101, 114, 4, 68, 97, 116, 97, 10, 69, 118, 101, 110, 116, - 83, 116, 111, 114, 101, 8, 82, 101, 115, 111, 117, 114, 99, 101, 11, 83, 105, 109, - 112, 108, 101, 69, 118, 101, 110, 116, 10, 84, 97, 98, 108, 101, 83, 116, 111, 114, - 101, 11, 97, 112, 112, 101, 110, 100, 95, 100, 97, 116, 97, 20, 98, 121, 116, 101, - 115, 95, 109, 97, 107, 101, 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 14, 99, - 111, 112, 121, 95, 112, 97, 115, 116, 97, 95, 114, 101, 102, 6, 100, 111, 117, 98, - 108, 101, 11, 101, 109, 105, 116, 95, 101, 118, 101, 110, 116, 115, 11, 103, 101, 116, - 95, 99, 111, 117, 110, 116, 101, 114, 21, 103, 101, 116, 95, 102, 114, 111, 109, 95, - 114, 97, 110, 100, 111, 109, 95, 99, 111, 110, 115, 116, 4, 104, 97, 108, 102, 11, - 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 15, 108, 111, 111, 112, 95, 97, - 114, 105, 116, 104, 109, 101, 116, 105, 99, 8, 108, 111, 111, 112, 95, 98, 99, 115, - 8, 108, 111, 111, 112, 95, 110, 111, 112, 6, 83, 116, 114, 105, 110, 103, 14, 109, - 97, 107, 101, 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 20, 109, 97, 107, 101, - 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 95, 116, 97, 98, 108, 101, 8, 109, - 97, 120, 105, 109, 105, 122, 101, 8, 109, 105, 110, 105, 109, 105, 122, 101, 3, 110, - 111, 112, 13, 110, 111, 112, 95, 50, 95, 115, 105, 103, 110, 101, 114, 115, 13, 110, - 111, 112, 95, 53, 95, 115, 105, 103, 110, 101, 114, 115, 10, 114, 101, 115, 101, 116, - 95, 100, 97, 116, 97, 6, 115, 101, 116, 95, 105, 100, 8, 115, 101, 116, 95, 110, - 97, 109, 101, 11, 115, 116, 101, 112, 95, 115, 105, 103, 110, 101, 114, 4, 100, 97, - 116, 97, 5, 99, 111, 117, 110, 116, 13, 115, 105, 109, 112, 108, 101, 95, 101, 118, - 101, 110, 116, 115, 11, 69, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 2, 105, - 100, 4, 110, 97, 109, 101, 8, 101, 118, 101, 110, 116, 95, 105, 100, 13, 116, 97, - 98, 108, 101, 95, 101, 110, 116, 114, 105, 101, 115, 5, 84, 97, 98, 108, 101, 10, - 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 4, 117, 116, 102, 56, 16, 110, 101, - 119, 95, 101, 118, 101, 110, 116, 95, 104, 97, 110, 100, 108, 101, 10, 101, 109, 105, - 116, 95, 101, 118, 101, 110, 116, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, - 103, 117, 109, 101, 110, 116, 8, 116, 111, 95, 98, 121, 116, 101, 115, 3, 110, 101, - 119, 23, 98, 111, 114, 114, 111, 119, 95, 109, 117, 116, 95, 119, 105, 116, 104, 95, - 100, 101, 102, 97, 117, 108, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 16, 2, 16, 46, 3, 62, 193, + 1, 4, 255, 1, 10, 5, 137, 2, 169, 2, 7, 178, 4, 192, 4, 8, 242, 8, + 64, 6, 178, 9, 105, 16, 155, 10, 93, 10, 248, 10, 51, 12, 171, 11, 215, 15, + 13, 130, 27, 16, 0, 0, 1, 9, 1, 15, 1, 20, 1, 22, 1, 29, 1, 33, + 1, 40, 0, 1, 8, 0, 0, 3, 8, 0, 0, 5, 7, 0, 0, 6, 8, 0, + 1, 8, 4, 1, 6, 1, 0, 10, 6, 0, 0, 11, 8, 0, 2, 14, 7, 0, + 0, 17, 8, 0, 3, 19, 4, 2, 3, 1, 0, 1, 0, 21, 0, 1, 0, 1, + 4, 23, 0, 2, 0, 1, 2, 24, 3, 4, 0, 1, 0, 25, 7, 1, 0, 1, + 0, 26, 9, 1, 0, 1, 0, 27, 11, 12, 0, 1, 0, 28, 14, 1, 0, 1, + 5, 30, 0, 16, 1, 6, 1, 1, 31, 17, 1, 1, 6, 1, 0, 32, 0, 1, + 0, 1, 6, 34, 19, 19, 0, 1, 0, 35, 14, 1, 0, 1, 0, 36, 0, 1, + 0, 1, 0, 37, 0, 1, 0, 1, 0, 38, 14, 1, 0, 1, 0, 39, 23, 1, + 0, 1, 7, 41, 25, 3, 1, 0, 1, 0, 42, 14, 1, 0, 1, 0, 43, 27, + 1, 0, 1, 0, 44, 23, 1, 0, 1, 3, 45, 1, 30, 2, 3, 4, 1, 3, + 46, 31, 32, 2, 3, 2, 1, 0, 47, 34, 1, 0, 1, 0, 48, 34, 1, 0, + 1, 0, 49, 0, 1, 0, 1, 0, 50, 37, 1, 0, 1, 0, 51, 38, 1, 0, + 1, 0, 52, 0, 1, 0, 1, 0, 53, 14, 1, 0, 1, 0, 54, 41, 1, 0, + 1, 0, 55, 0, 1, 0, 1, 7, 15, 8, 15, 16, 24, 20, 29, 21, 29, 1, + 6, 12, 0, 1, 5, 1, 10, 2, 1, 8, 7, 1, 2, 4, 8, 2, 8, 6, + 7, 8, 6, 3, 2, 7, 10, 2, 6, 10, 2, 4, 3, 3, 7, 10, 2, 2, + 2, 6, 12, 10, 2, 2, 7, 10, 2, 8, 0, 4, 6, 8, 6, 6, 8, 6, + 6, 8, 1, 6, 8, 1, 1, 6, 3, 4, 6, 3, 6, 3, 6, 3, 6, 3, + 2, 6, 12, 3, 1, 8, 5, 1, 11, 4, 1, 9, 0, 2, 7, 11, 4, 1, + 9, 0, 9, 0, 5, 5, 6, 12, 8, 3, 7, 8, 3, 3, 1, 3, 4, 10, + 3, 3, 3, 10, 3, 1, 8, 1, 8, 3, 3, 3, 3, 3, 1, 1, 1, 3, + 6, 12, 3, 3, 1, 10, 3, 1, 6, 9, 0, 4, 10, 3, 3, 3, 10, 2, + 4, 6, 12, 3, 8, 7, 10, 2, 6, 7, 8, 6, 7, 3, 7, 8, 7, 7, + 10, 2, 8, 2, 8, 6, 2, 3, 3, 1, 11, 9, 2, 9, 0, 9, 1, 3, + 7, 11, 9, 2, 9, 0, 9, 1, 9, 0, 9, 1, 1, 7, 9, 1, 7, 5, + 6, 12, 8, 8, 7, 11, 9, 2, 3, 3, 3, 3, 7, 3, 2, 6, 12, 5, + 5, 8, 2, 8, 6, 10, 2, 7, 8, 6, 1, 8, 8, 2, 8, 6, 6, 8, + 6, 6, 8, 6, 3, 3, 3, 7, 8, 6, 2, 6, 12, 6, 12, 5, 6, 12, + 6, 12, 6, 12, 6, 12, 6, 12, 3, 7, 8, 6, 8, 2, 8, 6, 5, 8, + 2, 3, 8, 7, 8, 6, 7, 3, 2, 6, 12, 8, 7, 3, 8, 2, 8, 6, + 7, 8, 7, 2, 5, 7, 8, 1, 6, 115, 105, 109, 112, 108, 101, 12, 66, 121, + 116, 101, 82, 101, 115, 111, 117, 114, 99, 101, 4, 100, 97, 116, 97, 7, 67, 111, + 117, 110, 116, 101, 114, 5, 99, 111, 117, 110, 116, 4, 68, 97, 116, 97, 10, 69, + 118, 101, 110, 116, 83, 116, 111, 114, 101, 13, 115, 105, 109, 112, 108, 101, 95, 101, + 118, 101, 110, 116, 115, 11, 69, 118, 101, 110, 116, 72, 97, 110, 100, 108, 101, 5, + 101, 118, 101, 110, 116, 11, 83, 105, 109, 112, 108, 101, 69, 118, 101, 110, 116, 8, + 82, 101, 115, 111, 117, 114, 99, 101, 2, 105, 100, 4, 110, 97, 109, 101, 6, 83, + 116, 114, 105, 110, 103, 6, 115, 116, 114, 105, 110, 103, 8, 101, 118, 101, 110, 116, + 95, 105, 100, 10, 84, 97, 98, 108, 101, 83, 116, 111, 114, 101, 13, 116, 97, 98, + 108, 101, 95, 101, 110, 116, 114, 105, 101, 115, 5, 84, 97, 98, 108, 101, 5, 116, + 97, 98, 108, 101, 6, 100, 111, 117, 98, 108, 101, 6, 115, 105, 103, 110, 101, 114, + 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 4, 117, 116, 102, 56, 11, 97, + 112, 112, 101, 110, 100, 95, 100, 97, 116, 97, 20, 98, 121, 116, 101, 115, 95, 109, + 97, 107, 101, 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 14, 99, 111, 112, 121, + 95, 112, 97, 115, 116, 97, 95, 114, 101, 102, 11, 101, 109, 105, 116, 95, 101, 118, + 101, 110, 116, 115, 7, 97, 99, 99, 111, 117, 110, 116, 16, 110, 101, 119, 95, 101, + 118, 101, 110, 116, 95, 104, 97, 110, 100, 108, 101, 10, 101, 109, 105, 116, 95, 101, + 118, 101, 110, 116, 11, 103, 101, 116, 95, 99, 111, 117, 110, 116, 101, 114, 5, 101, + 114, 114, 111, 114, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, + 101, 110, 116, 21, 103, 101, 116, 95, 102, 114, 111, 109, 95, 114, 97, 110, 100, 111, + 109, 95, 99, 111, 110, 115, 116, 4, 104, 97, 108, 102, 11, 105, 110, 105, 116, 95, + 109, 111, 100, 117, 108, 101, 15, 108, 111, 111, 112, 95, 97, 114, 105, 116, 104, 109, + 101, 116, 105, 99, 8, 108, 111, 111, 112, 95, 98, 99, 115, 3, 98, 99, 115, 8, + 116, 111, 95, 98, 121, 116, 101, 115, 8, 108, 111, 111, 112, 95, 110, 111, 112, 14, + 109, 97, 107, 101, 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 20, 109, 97, 107, + 101, 95, 111, 114, 95, 99, 104, 97, 110, 103, 101, 95, 116, 97, 98, 108, 101, 3, + 110, 101, 119, 23, 98, 111, 114, 114, 111, 119, 95, 109, 117, 116, 95, 119, 105, 116, + 104, 95, 100, 101, 102, 97, 117, 108, 116, 8, 109, 97, 120, 105, 109, 105, 122, 101, + 8, 109, 105, 110, 105, 109, 105, 122, 101, 3, 110, 111, 112, 13, 110, 111, 112, 95, + 50, 95, 115, 105, 103, 110, 101, 114, 115, 13, 110, 111, 112, 95, 53, 95, 115, 105, + 103, 110, 101, 114, 115, 10, 114, 101, 115, 101, 116, 95, 100, 97, 116, 97, 6, 115, + 101, 116, 95, 105, 100, 8, 115, 101, 116, 95, 110, 97, 109, 101, 11, 115, 116, 101, + 112, 95, 115, 105, 103, 110, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, - 8, 1, 0, 0, 0, 0, 0, 0, 0, 10, 2, 9, 8, 1, 35, 69, 103, 137, - 171, 205, 239, 10, 2, 6, 5, 104, 101, 108, 108, 111, 10, 3, 81, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, - 100, 97, 116, 97, 95, 118, 49, 42, 1, 1, 0, 0, 0, 0, 0, 0, 0, 29, - 69, 67, 79, 85, 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, - 78, 79, 84, 95, 80, 82, 69, 83, 69, 78, 84, 0, 0, 0, 0, 2, 1, 39, - 10, 2, 1, 2, 1, 40, 3, 2, 2, 1, 39, 10, 2, 3, 2, 1, 41, 11, - 8, 1, 8, 5, 4, 2, 3, 43, 3, 44, 8, 7, 39, 8, 2, 5, 2, 1, - 45, 3, 6, 2, 1, 46, 11, 9, 2, 3, 3, 0, 0, 0, 0, 13, 26, 10, - 1, 65, 14, 12, 2, 10, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, - 21, 5, 8, 10, 0, 10, 1, 10, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, - 23, 66, 14, 20, 68, 14, 11, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, - 12, 2, 5, 3, 11, 1, 1, 11, 0, 1, 2, 1, 1, 4, 1, 0, 15, 20, - 10, 0, 17, 23, 41, 0, 4, 13, 11, 0, 17, 23, 42, 0, 12, 2, 11, 1, - 11, 2, 15, 0, 21, 5, 19, 11, 1, 18, 0, 12, 3, 11, 0, 11, 3, 45, - 0, 2, 2, 0, 0, 0, 17, 103, 10, 0, 16, 1, 12, 5, 10, 1, 16, 1, - 12, 6, 11, 5, 20, 10, 6, 20, 35, 4, 18, 11, 6, 12, 5, 10, 2, 16, - 2, 12, 6, 5, 26, 11, 6, 1, 10, 1, 16, 1, 12, 5, 10, 3, 16, 2, - 12, 6, 10, 6, 20, 10, 1, 16, 1, 20, 35, 4, 47, 11, 5, 1, 11, 1, - 1, 11, 0, 1, 11, 2, 1, 11, 6, 12, 5, 11, 3, 16, 2, 12, 6, 5, - 69, 11, 3, 1, 10, 5, 11, 0, 16, 1, 34, 4, 65, 11, 6, 1, 11, 5, - 1, 11, 2, 16, 2, 12, 5, 11, 1, 16, 1, 12, 6, 5, 69, 11, 1, 1, - 11, 2, 1, 10, 5, 20, 10, 6, 20, 35, 4, 82, 11, 6, 1, 10, 5, 12, - 6, 10, 5, 1, 5, 88, 11, 5, 1, 10, 6, 12, 5, 10, 6, 1, 10, 5, - 10, 6, 33, 4, 97, 11, 6, 1, 11, 5, 12, 4, 5, 101, 11, 5, 1, 11, - 6, 12, 4, 11, 4, 2, 3, 1, 4, 1, 4, 18, 44, 10, 0, 17, 23, 41, - 4, 32, 4, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, 24, 7, - 1, 18, 2, 18, 4, 12, 2, 11, 0, 11, 2, 45, 4, 5, 43, 11, 0, 17, - 23, 42, 4, 12, 3, 10, 3, 16, 3, 16, 4, 65, 14, 6, 2, 0, 0, 0, - 0, 0, 0, 0, 24, 12, 1, 10, 3, 16, 3, 16, 4, 65, 14, 10, 1, 35, - 4, 41, 5, 35, 10, 3, 15, 3, 15, 4, 49, 255, 68, 14, 5, 27, 11, 3, - 1, 2, 4, 0, 0, 1, 3, 21, 36, 10, 0, 17, 23, 12, 3, 10, 3, 41, - 3, 32, 4, 13, 10, 0, 11, 0, 56, 0, 18, 3, 45, 3, 5, 15, 11, 0, - 1, 11, 3, 42, 3, 12, 2, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 4, 33, 5, 23, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, - 1, 10, 2, 15, 5, 10, 1, 18, 5, 56, 1, 5, 18, 11, 2, 1, 2, 5, - 1, 4, 1, 1, 16, 16, 11, 0, 17, 23, 12, 1, 10, 1, 41, 1, 4, 7, - 5, 10, 7, 0, 17, 27, 39, 11, 1, 43, 1, 16, 2, 20, 1, 2, 6, 1, - 4, 0, 25, 25, 7, 3, 12, 2, 14, 2, 65, 13, 12, 4, 10, 4, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 34, 4, 24, 10, 1, 10, 4, 38, 4, 17, 11, - 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 7, 3, 12, 3, 14, - 3, 11, 1, 66, 13, 20, 1, 2, 7, 1, 4, 1, 4, 18, 44, 10, 0, 17, - 23, 41, 4, 32, 4, 16, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, - 24, 7, 1, 18, 2, 18, 4, 12, 2, 11, 0, 11, 2, 45, 4, 5, 43, 11, - 0, 17, 23, 42, 4, 12, 3, 10, 3, 16, 3, 16, 4, 65, 14, 6, 2, 0, - 0, 0, 0, 0, 0, 0, 26, 12, 1, 10, 3, 16, 3, 16, 4, 65, 14, 10, - 1, 36, 4, 41, 5, 35, 10, 3, 15, 3, 15, 4, 69, 14, 1, 5, 27, 11, - 3, 1, 2, 8, 0, 0, 0, 1, 5, 11, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 18, 1, 45, 1, 2, 9, 1, 4, 0, 26, 74, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 12, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 8, 10, - 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 73, 5, 9, 11, 1, 6, - 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 11, 6, 6, 1, 0, 0, 0, - 0, 0, 0, 0, 22, 12, 5, 11, 8, 6, 1, 0, 0, 0, 0, 0, 0, 0, - 22, 12, 7, 10, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 5, 23, - 12, 8, 10, 7, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 10, 7, 23, 12, - 5, 10, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 6, 10, 5, 10, - 6, 36, 4, 46, 10, 6, 10, 7, 36, 12, 2, 5, 48, 9, 12, 2, 11, 2, - 4, 55, 11, 7, 10, 8, 36, 12, 3, 5, 57, 9, 12, 3, 11, 3, 4, 64, - 10, 8, 11, 5, 36, 12, 4, 5, 66, 9, 12, 4, 11, 4, 4, 72, 11, 1, - 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 1, 5, 4, 2, 10, 1, 4, - 0, 27, 41, 64, 13, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 12, 3, 10, 3, 10, 2, 35, 4, 17, 5, 9, 13, - 6, 10, 3, 68, 13, 11, 3, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, - 3, 5, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 10, 1, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 36, 4, 40, 5, 24, 14, 6, 56, 2, 12, 5, - 11, 4, 14, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 66, 14, 20, 52, 22, - 12, 4, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 5, 19, - 2, 11, 1, 4, 0, 1, 11, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 36, 4, 10, 5, 5, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, - 1, 5, 0, 2, 12, 1, 4, 1, 4, 30, 34, 10, 0, 17, 23, 41, 4, 4, - 22, 11, 0, 17, 23, 42, 4, 12, 5, 11, 1, 10, 5, 15, 1, 21, 11, 2, - 10, 5, 15, 6, 21, 11, 3, 11, 5, 15, 3, 15, 4, 21, 5, 33, 11, 3, - 18, 2, 12, 4, 11, 1, 11, 2, 11, 4, 18, 4, 12, 6, 11, 0, 11, 6, - 45, 4, 2, 13, 0, 0, 1, 6, 31, 44, 10, 0, 17, 23, 12, 3, 10, 3, - 41, 6, 32, 4, 12, 11, 0, 56, 3, 18, 6, 45, 6, 5, 14, 11, 0, 1, - 11, 3, 42, 6, 15, 7, 12, 4, 10, 2, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 4, 41, 5, 23, 11, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, - 12, 2, 10, 4, 10, 1, 10, 2, 22, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 56, 4, 12, 5, 10, 5, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, - 5, 21, 5, 18, 11, 4, 1, 2, 14, 1, 4, 1, 4, 36, 93, 10, 1, 41, - 4, 4, 6, 11, 0, 1, 2, 10, 0, 17, 23, 41, 4, 32, 4, 21, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, 24, 7, 1, 18, 2, 18, 4, 12, - 8, 10, 0, 11, 8, 45, 4, 10, 0, 17, 23, 43, 4, 16, 3, 16, 4, 65, - 14, 12, 6, 10, 1, 43, 4, 16, 3, 16, 4, 65, 14, 12, 7, 11, 6, 11, - 7, 36, 4, 49, 11, 0, 17, 23, 43, 4, 16, 3, 16, 4, 20, 11, 1, 42, - 4, 12, 4, 12, 3, 5, 59, 11, 1, 43, 4, 16, 3, 16, 4, 20, 11, 0, - 17, 23, 42, 4, 12, 4, 12, 3, 11, 3, 11, 4, 12, 9, 12, 5, 14, 5, - 65, 14, 10, 9, 16, 3, 16, 4, 65, 14, 36, 4, 75, 5, 72, 8, 12, 2, - 5, 82, 10, 9, 16, 3, 16, 4, 65, 14, 6, 16, 39, 0, 0, 0, 0, 0, - 0, 35, 12, 2, 11, 2, 4, 90, 10, 9, 15, 3, 15, 4, 14, 5, 17, 0, - 5, 63, 11, 9, 1, 2, 15, 1, 4, 1, 4, 37, 81, 10, 1, 41, 4, 4, - 6, 11, 0, 1, 2, 10, 0, 17, 23, 41, 4, 32, 4, 21, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 2, 17, 24, 7, 1, 18, 2, 18, 4, 12, 7, 10, - 0, 11, 7, 45, 4, 10, 0, 17, 23, 43, 4, 12, 9, 10, 1, 43, 4, 12, - 10, 11, 9, 16, 3, 16, 4, 65, 14, 11, 10, 16, 3, 16, 4, 65, 14, 12, - 5, 12, 4, 10, 4, 10, 5, 36, 4, 51, 11, 5, 6, 2, 0, 0, 0, 0, - 0, 0, 0, 26, 11, 0, 17, 23, 42, 4, 12, 3, 12, 2, 5, 60, 11, 0, - 1, 11, 4, 6, 2, 0, 0, 0, 0, 0, 0, 0, 26, 11, 1, 42, 4, 12, - 3, 12, 2, 11, 2, 11, 3, 12, 8, 12, 6, 10, 8, 16, 3, 16, 4, 65, - 14, 10, 6, 36, 4, 78, 5, 72, 10, 8, 15, 3, 15, 4, 69, 14, 1, 5, - 64, 11, 8, 1, 2, 16, 1, 4, 0, 1, 1, 2, 17, 1, 4, 0, 1, 1, - 2, 18, 1, 4, 0, 1, 1, 2, 19, 1, 4, 1, 4, 38, 34, 10, 0, 17, - 23, 41, 4, 4, 23, 11, 0, 17, 23, 42, 4, 12, 1, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 10, 1, 15, 1, 21, 7, 2, 17, 24, 10, 1, 15, 6, 21, - 7, 1, 11, 1, 15, 3, 15, 4, 21, 5, 33, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 2, 17, 24, 7, 1, 18, 2, 18, 4, 12, 2, 11, 0, 11, 2, - 45, 4, 2, 20, 1, 4, 1, 4, 39, 25, 10, 0, 17, 23, 41, 4, 32, 4, - 16, 11, 1, 7, 2, 17, 24, 7, 1, 18, 2, 18, 4, 12, 2, 11, 0, 11, - 2, 45, 4, 5, 24, 11, 0, 17, 23, 42, 4, 12, 3, 11, 1, 11, 3, 15, - 1, 21, 2, 21, 1, 4, 1, 4, 39, 24, 10, 0, 17, 23, 41, 4, 32, 4, - 15, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 1, 7, 1, 18, 2, 18, 4, - 12, 2, 11, 0, 11, 2, 45, 4, 5, 23, 11, 0, 17, 23, 42, 4, 12, 3, - 11, 1, 11, 3, 15, 6, 21, 2, 22, 1, 4, 1, 1, 40, 22, 11, 0, 17, - 23, 12, 1, 10, 1, 41, 1, 4, 7, 5, 10, 7, 0, 17, 27, 39, 11, 1, - 42, 1, 12, 2, 10, 2, 16, 2, 20, 7, 0, 22, 11, 2, 15, 2, 21, 2, - 0, 0, 4, 0, 1, 0, 4, 2, 2, 0, 3, 0, 4, 1, 6, 0, 0, + 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 10, 2, 9, 8, 1, 35, 69, 103, 137, 171, 205, 239, 10, 2, 6, 5, 104, 101, + 108, 108, 111, 10, 3, 81, 10, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 20, 99, 111, + 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, + 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, + 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 42, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 29, 69, 67, 79, 85, 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, + 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, 83, 69, 78, 84, 0, 0, 0, + 0, 2, 1, 2, 10, 2, 1, 2, 1, 4, 3, 2, 2, 1, 2, 10, 2, 3, + 2, 1, 7, 11, 4, 1, 8, 5, 6, 2, 3, 12, 3, 13, 8, 7, 2, 8, + 2, 5, 2, 1, 16, 3, 8, 2, 1, 18, 11, 9, 2, 3, 3, 0, 1, 4, + 1, 4, 6, 44, 10, 0, 17, 1, 41, 4, 3, 17, 7, 0, 18, 2, 12, 1, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 17, 2, 11, 1, 18, 4, 12, + 2, 11, 0, 11, 2, 45, 4, 2, 11, 0, 17, 1, 42, 4, 12, 3, 10, 3, + 16, 0, 16, 1, 65, 5, 6, 2, 0, 0, 0, 0, 0, 0, 0, 24, 12, 4, + 10, 3, 16, 0, 16, 1, 65, 5, 10, 4, 35, 4, 41, 10, 3, 15, 0, 15, + 1, 49, 255, 68, 5, 5, 28, 11, 3, 1, 5, 16, 3, 0, 0, 0, 8, 31, + 10, 1, 65, 5, 12, 2, 10, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 4, 26, 10, 0, 12, 4, 10, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 12, 5, 11, 4, 11, 5, 68, 5, 11, + 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 2, 5, 3, 11, 0, 1, + 11, 1, 1, 2, 4, 1, 4, 1, 0, 10, 20, 10, 0, 17, 1, 41, 0, 4, + 13, 11, 0, 17, 1, 42, 0, 15, 2, 12, 2, 11, 1, 11, 2, 21, 2, 11, + 1, 18, 0, 12, 3, 11, 0, 11, 3, 45, 0, 5, 12, 5, 0, 0, 0, 13, + 101, 10, 0, 16, 3, 12, 4, 10, 1, 16, 3, 12, 5, 11, 4, 20, 10, 5, + 20, 35, 4, 92, 11, 5, 12, 4, 10, 2, 16, 4, 12, 5, 10, 5, 20, 10, + 1, 16, 3, 20, 35, 4, 67, 11, 0, 1, 11, 1, 1, 11, 2, 1, 11, 4, + 1, 11, 5, 12, 4, 11, 3, 16, 4, 12, 5, 10, 4, 20, 10, 5, 20, 35, + 4, 62, 11, 5, 1, 10, 4, 12, 5, 10, 4, 10, 5, 33, 4, 57, 11, 5, + 1, 11, 4, 12, 7, 11, 7, 2, 11, 4, 1, 11, 5, 12, 7, 5, 55, 11, + 4, 1, 10, 5, 12, 4, 5, 47, 11, 3, 1, 11, 0, 16, 3, 12, 7, 10, + 4, 11, 7, 34, 4, 87, 11, 4, 1, 11, 5, 1, 11, 2, 16, 4, 12, 4, + 11, 1, 16, 3, 12, 5, 5, 37, 11, 1, 1, 11, 2, 1, 5, 37, 11, 5, + 1, 10, 1, 16, 3, 12, 4, 10, 3, 16, 4, 12, 5, 5, 17, 6, 0, 0, + 1, 3, 18, 38, 10, 0, 17, 1, 12, 2, 10, 2, 41, 3, 3, 35, 10, 0, + 12, 3, 11, 0, 56, 0, 18, 3, 12, 4, 11, 3, 11, 4, 45, 3, 11, 2, + 42, 3, 12, 5, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 32, + 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 10, 5, 15, 5, + 10, 1, 18, 5, 56, 1, 5, 18, 11, 5, 1, 2, 11, 0, 1, 5, 15, 9, + 1, 4, 1, 1, 2, 15, 11, 0, 17, 1, 12, 1, 10, 1, 41, 1, 4, 12, + 11, 1, 43, 1, 16, 4, 20, 1, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, + 17, 10, 39, 11, 1, 4, 0, 20, 29, 7, 2, 12, 2, 11, 0, 1, 14, 2, + 65, 19, 12, 3, 10, 3, 6, 0, 0, 0, 0, 0, 0, 0, 0, 34, 3, 12, + 5, 28, 10, 1, 10, 3, 38, 3, 17, 5, 21, 11, 3, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 23, 12, 1, 7, 2, 12, 5, 14, 5, 11, 1, 66, 19, 20, + 1, 2, 12, 1, 4, 1, 4, 6, 44, 10, 0, 17, 1, 41, 4, 3, 17, 7, + 0, 18, 2, 12, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 17, 2, + 11, 1, 18, 4, 12, 2, 11, 0, 11, 2, 45, 4, 2, 11, 0, 17, 1, 42, + 4, 12, 3, 10, 3, 16, 0, 16, 1, 65, 5, 6, 2, 0, 0, 0, 0, 0, + 0, 0, 26, 12, 4, 10, 3, 16, 0, 16, 1, 65, 5, 10, 4, 36, 4, 41, + 10, 3, 15, 0, 15, 1, 69, 5, 1, 5, 28, 11, 3, 1, 5, 16, 13, 0, + 0, 0, 21, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 1, 12, 1, 11, + 0, 11, 1, 45, 1, 2, 14, 1, 4, 0, 22, 76, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 2, 11, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 3, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 75, 11, 1, 6, + 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 11, 2, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 22, 12, 4, 11, 3, 6, 1, 0, 0, 0, 0, 0, 0, 0, + 22, 12, 5, 10, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 4, 23, + 12, 3, 10, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 10, 5, 23, 12, + 4, 10, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 2, 10, 4, 10, + 2, 36, 4, 72, 10, 2, 10, 5, 36, 12, 7, 11, 7, 4, 69, 11, 5, 10, + 3, 36, 12, 8, 11, 8, 4, 66, 10, 3, 11, 4, 36, 12, 9, 11, 9, 3, + 61, 5, 6, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 1, 5, + 6, 9, 12, 9, 5, 58, 9, 12, 8, 5, 52, 9, 12, 7, 5, 46, 2, 15, + 1, 4, 0, 26, 45, 64, 19, 0, 0, 0, 0, 0, 0, 0, 0, 12, 3, 11, + 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 10, 4, 10, 2, 35, + 4, 18, 13, 3, 10, 4, 68, 19, 11, 4, 6, 1, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 2, 10, + 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 44, 14, 3, 56, 2, 12, + 6, 11, 2, 12, 4, 14, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 66, 5, + 20, 52, 12, 5, 11, 4, 11, 5, 22, 12, 2, 11, 1, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 23, 12, 1, 5, 20, 2, 17, 1, 4, 0, 19, 10, 10, 1, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 9, 11, 1, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 23, 12, 1, 5, 0, 2, 18, 1, 4, 1, 4, 28, 40, + 10, 0, 17, 1, 41, 4, 4, 28, 11, 0, 17, 1, 42, 4, 12, 4, 10, 4, + 15, 3, 12, 5, 11, 1, 11, 5, 21, 10, 4, 15, 6, 12, 6, 11, 2, 11, + 6, 21, 11, 4, 15, 0, 15, 1, 12, 7, 11, 3, 11, 7, 21, 2, 11, 3, + 18, 2, 12, 8, 11, 1, 11, 2, 11, 8, 18, 4, 12, 9, 11, 0, 11, 9, + 45, 4, 5, 27, 19, 0, 0, 1, 6, 33, 48, 10, 0, 17, 1, 12, 3, 10, + 3, 41, 6, 3, 45, 11, 0, 12, 4, 56, 3, 18, 6, 12, 5, 11, 4, 11, + 5, 45, 6, 11, 3, 42, 6, 15, 7, 12, 6, 10, 2, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 36, 4, 42, 11, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, + 23, 12, 2, 10, 1, 10, 2, 22, 12, 7, 10, 6, 11, 7, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 56, 4, 12, 9, 10, 9, 20, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 22, 11, 9, 21, 5, 18, 11, 6, 1, 2, 11, 0, 1, 5, 14, + 22, 1, 4, 1, 4, 35, 86, 10, 1, 41, 4, 4, 6, 11, 0, 1, 2, 10, + 0, 17, 1, 41, 4, 4, 11, 5, 23, 7, 0, 18, 2, 12, 2, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 1, 17, 2, 11, 2, 18, 4, 12, 3, 10, 0, + 11, 3, 45, 4, 10, 0, 17, 1, 43, 4, 16, 0, 16, 1, 65, 5, 10, 1, + 43, 4, 16, 0, 16, 1, 65, 5, 36, 4, 75, 11, 0, 17, 1, 43, 4, 16, + 0, 16, 1, 20, 12, 4, 11, 1, 42, 4, 12, 5, 14, 4, 65, 5, 10, 5, + 16, 0, 16, 1, 65, 5, 36, 4, 67, 8, 12, 6, 11, 6, 4, 64, 10, 5, + 15, 0, 15, 1, 14, 4, 17, 3, 5, 46, 11, 5, 1, 2, 10, 5, 16, 0, + 16, 1, 65, 5, 6, 16, 39, 0, 0, 0, 0, 0, 0, 35, 12, 6, 5, 56, + 11, 1, 43, 4, 16, 0, 16, 1, 20, 12, 4, 11, 0, 17, 1, 42, 4, 12, + 5, 5, 46, 23, 1, 4, 1, 4, 36, 76, 10, 1, 41, 4, 4, 6, 11, 0, + 1, 2, 10, 0, 17, 1, 41, 4, 4, 11, 5, 23, 7, 0, 18, 2, 12, 2, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 1, 17, 2, 11, 2, 18, 4, 12, + 3, 10, 0, 11, 3, 45, 4, 10, 0, 17, 1, 43, 4, 10, 1, 43, 4, 12, + 4, 16, 0, 16, 1, 65, 5, 12, 6, 11, 4, 16, 0, 16, 1, 65, 5, 12, + 7, 10, 6, 10, 7, 36, 4, 66, 11, 7, 6, 2, 0, 0, 0, 0, 0, 0, + 0, 26, 12, 8, 11, 0, 17, 1, 42, 4, 12, 9, 10, 9, 16, 0, 16, 1, + 65, 5, 10, 8, 36, 4, 63, 10, 9, 15, 0, 15, 1, 69, 5, 1, 5, 50, + 11, 9, 1, 2, 11, 0, 1, 11, 6, 6, 2, 0, 0, 0, 0, 0, 0, 0, + 26, 12, 8, 11, 1, 42, 4, 12, 9, 5, 50, 24, 1, 4, 0, 1, 3, 11, + 0, 1, 2, 25, 1, 4, 0, 1, 5, 11, 0, 1, 11, 1, 1, 2, 26, 1, + 4, 0, 1, 11, 11, 0, 1, 11, 1, 1, 11, 2, 1, 11, 3, 1, 11, 4, + 1, 2, 27, 1, 4, 1, 4, 39, 36, 10, 0, 17, 1, 41, 4, 4, 23, 11, + 0, 17, 1, 42, 4, 12, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 10, 1, + 15, 3, 21, 7, 1, 17, 2, 10, 1, 15, 6, 21, 7, 0, 11, 1, 15, 0, + 15, 1, 21, 2, 7, 0, 18, 2, 12, 2, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 1, 17, 2, 11, 2, 18, 4, 12, 3, 11, 0, 11, 3, 45, 4, 5, + 22, 28, 1, 4, 1, 4, 40, 30, 10, 0, 17, 1, 41, 4, 3, 21, 7, 0, + 18, 2, 12, 2, 11, 1, 12, 3, 7, 1, 17, 2, 12, 4, 11, 3, 11, 4, + 11, 2, 18, 4, 12, 5, 11, 0, 11, 5, 45, 4, 2, 11, 0, 17, 1, 42, + 4, 15, 3, 12, 6, 11, 1, 11, 6, 21, 5, 20, 29, 1, 4, 1, 4, 42, + 25, 10, 0, 17, 1, 41, 4, 3, 16, 7, 0, 18, 2, 12, 2, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 1, 11, 2, 18, 4, 12, 3, 11, 0, 11, 3, + 45, 4, 2, 11, 0, 17, 1, 42, 4, 15, 6, 12, 4, 11, 1, 11, 4, 21, + 5, 15, 30, 1, 4, 1, 1, 43, 21, 11, 0, 17, 1, 12, 1, 10, 1, 41, + 1, 4, 18, 11, 1, 42, 1, 12, 2, 10, 2, 16, 4, 20, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 22, 11, 2, 15, 4, 21, 2, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 17, 10, 39, 4, 2, 2, 0, 0, 0, 4, 0, 1, 0, 3, 0, + 4, 1, 6, 0, 0, ] }); @@ -990,538 +1016,563 @@ pub static PACKAGE_FRAMEWORK_USECASES_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_AGGREGATOR_EXAMPLE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 8, 2, 8, 18, 3, 26, 54, - 4, 80, 8, 5, 88, 39, 7, 127, 248, 1, 8, 247, 2, 64, 6, 183, 3, 84, - 16, 139, 4, 207, 1, 10, 218, 5, 21, 12, 239, 5, 207, 1, 13, 190, 7, 6, - 0, 0, 1, 1, 1, 2, 1, 3, 0, 4, 8, 0, 0, 5, 8, 0, 0, 6, - 8, 0, 1, 12, 6, 1, 0, 0, 0, 7, 0, 0, 0, 0, 8, 0, 0, 0, - 0, 9, 1, 0, 0, 0, 10, 2, 0, 0, 2, 13, 4, 4, 0, 1, 14, 5, - 6, 1, 0, 3, 15, 1, 7, 0, 1, 16, 0, 8, 1, 3, 1, 17, 9, 8, - 1, 3, 1, 18, 5, 6, 1, 0, 5, 4, 7, 4, 8, 4, 9, 4, 0, 1, - 6, 12, 2, 1, 3, 1, 7, 8, 1, 1, 3, 2, 7, 11, 3, 1, 9, 0, - 9, 0, 1, 1, 1, 5, 1, 11, 3, 1, 9, 0, 1, 9, 0, 1, 7, 8, - 0, 18, 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 101, 120, 97, 109, 112, - 108, 101, 13, 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 118, 50, 5, 101, - 114, 114, 111, 114, 6, 115, 105, 103, 110, 101, 114, 12, 66, 111, 117, 110, 100, 101, - 100, 65, 103, 103, 86, 50, 7, 67, 111, 117, 110, 116, 101, 114, 12, 67, 111, 117, - 110, 116, 101, 114, 65, 103, 103, 86, 50, 9, 105, 110, 99, 114, 101, 109, 101, 110, - 116, 16, 105, 110, 99, 114, 101, 109, 101, 110, 116, 95, 97, 103, 103, 95, 118, 50, - 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 21, 109, 111, 100, 105, 102, - 121, 95, 98, 111, 117, 110, 100, 101, 100, 95, 97, 103, 103, 95, 118, 50, 5, 99, - 111, 117, 110, 116, 10, 65, 103, 103, 114, 101, 103, 97, 116, 111, 114, 16, 105, 110, - 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 7, 116, 114, 121, - 95, 97, 100, 100, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 27, 99, 114, - 101, 97, 116, 101, 95, 117, 110, 98, 111, 117, 110, 100, 101, 100, 95, 97, 103, 103, - 114, 101, 103, 97, 116, 111, 114, 17, 99, 114, 101, 97, 116, 101, 95, 97, 103, 103, - 114, 101, 103, 97, 116, 111, 114, 7, 116, 114, 121, 95, 115, 117, 98, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 8, 2, 8, 18, 3, 26, 64, + 4, 90, 8, 5, 98, 48, 7, 146, 1, 248, 1, 8, 138, 3, 64, 6, 202, 3, + 34, 16, 236, 3, 238, 1, 10, 218, 5, 21, 12, 239, 5, 252, 1, 13, 235, 7, + 6, 0, 0, 1, 4, 1, 8, 1, 13, 0, 1, 8, 0, 1, 3, 6, 1, 0, + 0, 0, 5, 8, 0, 0, 6, 8, 0, 0, 7, 0, 0, 0, 1, 2, 9, 1, + 1, 0, 1, 0, 10, 0, 0, 0, 1, 1, 11, 3, 4, 1, 0, 1, 0, 12, + 5, 0, 0, 1, 3, 14, 5, 6, 0, 1, 1, 15, 0, 7, 1, 3, 1, 1, + 16, 8, 7, 1, 3, 1, 0, 17, 10, 0, 0, 1, 1, 18, 3, 4, 1, 0, + 1, 3, 1, 6, 1, 7, 1, 9, 1, 0, 1, 3, 1, 7, 8, 2, 2, 7, + 11, 1, 1, 9, 0, 9, 0, 1, 1, 1, 6, 12, 1, 5, 1, 11, 1, 1, + 9, 0, 1, 9, 0, 4, 8, 2, 6, 12, 8, 3, 8, 0, 2, 1, 3, 1, + 7, 8, 0, 18, 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 101, 120, 97, + 109, 112, 108, 101, 12, 66, 111, 117, 110, 100, 101, 100, 65, 103, 103, 86, 50, 5, + 99, 111, 117, 110, 116, 10, 65, 103, 103, 114, 101, 103, 97, 116, 111, 114, 13, 97, + 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 118, 50, 7, 67, 111, 117, 110, 116, + 101, 114, 12, 67, 111, 117, 110, 116, 101, 114, 65, 103, 103, 86, 50, 9, 105, 110, + 99, 114, 101, 109, 101, 110, 116, 5, 101, 114, 114, 111, 114, 16, 105, 110, 118, 97, + 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 16, 105, 110, 99, 114, 101, + 109, 101, 110, 116, 95, 97, 103, 103, 95, 118, 50, 7, 116, 114, 121, 95, 97, 100, + 100, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 6, 115, 105, 103, 110, + 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 27, 99, 114, 101, 97, + 116, 101, 95, 117, 110, 98, 111, 117, 110, 100, 101, 100, 95, 97, 103, 103, 114, 101, + 103, 97, 116, 111, 114, 17, 99, 114, 101, 97, 116, 101, 95, 97, 103, 103, 114, 101, + 103, 97, 116, 111, 114, 21, 109, 111, 100, 105, 102, 121, 95, 98, 111, 117, 110, 100, + 101, 100, 95, 97, 103, 103, 95, 118, 50, 7, 116, 114, 121, 95, 115, 117, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 3, - 8, 2, 0, 0, 0, 0, 0, 0, 0, 3, 8, 4, 0, 0, 0, 0, 0, 0, - 0, 3, 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, 5, 0, 0, 0, 0, - 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, - 205, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, - 118, 49, 186, 1, 5, 1, 0, 0, 0, 0, 0, 0, 0, 29, 69, 67, 79, 85, - 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, - 80, 82, 69, 83, 69, 78, 84, 0, 2, 0, 0, 0, 0, 0, 0, 0, 33, 69, - 67, 79, 85, 78, 84, 69, 82, 95, 65, 71, 71, 95, 82, 69, 83, 79, 85, 82, - 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, 83, 69, 78, 84, 0, 3, 0, 0, - 0, 0, 0, 0, 0, 33, 69, 66, 79, 85, 78, 68, 69, 68, 95, 65, 71, 71, - 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, 83, - 69, 78, 84, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 69, 67, 79, 85, 78, - 84, 69, 82, 95, 73, 78, 67, 82, 69, 77, 69, 78, 84, 95, 70, 65, 73, 76, - 0, 5, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, 65, 85, 84, - 72, 79, 82, 73, 90, 69, 68, 0, 0, 0, 0, 2, 1, 11, 11, 3, 1, 3, - 1, 2, 1, 11, 3, 2, 2, 1, 11, 11, 3, 1, 3, 0, 1, 4, 1, 1, - 3, 19, 7, 5, 41, 1, 4, 4, 5, 7, 7, 3, 17, 4, 39, 7, 5, 42, - 1, 12, 0, 10, 0, 16, 0, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, - 11, 0, 15, 0, 21, 2, 1, 1, 4, 1, 2, 0, 17, 7, 5, 41, 2, 4, - 4, 5, 7, 7, 1, 17, 4, 39, 7, 5, 42, 2, 15, 1, 6, 1, 0, 0, - 0, 0, 0, 0, 0, 56, 0, 4, 14, 5, 16, 7, 2, 39, 2, 2, 0, 0, - 0, 0, 24, 10, 0, 17, 6, 7, 5, 33, 4, 6, 5, 10, 11, 0, 1, 7, - 4, 39, 10, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 1, 45, 1, 10, - 0, 56, 1, 18, 2, 45, 2, 11, 0, 6, 100, 0, 0, 0, 0, 0, 0, 0, - 56, 2, 18, 0, 45, 0, 2, 3, 1, 4, 1, 0, 10, 24, 7, 5, 41, 0, - 4, 4, 5, 7, 7, 0, 17, 4, 39, 7, 5, 42, 0, 12, 2, 11, 0, 4, - 18, 11, 2, 15, 2, 11, 1, 56, 0, 1, 5, 23, 11, 2, 15, 2, 11, 1, - 56, 3, 1, 2, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 171, 205, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, + 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, + 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, + 95, 118, 49, 186, 1, 5, 1, 0, 0, 0, 0, 0, 0, 0, 29, 69, 67, 79, + 85, 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, + 95, 80, 82, 69, 83, 69, 78, 84, 0, 2, 0, 0, 0, 0, 0, 0, 0, 33, + 69, 67, 79, 85, 78, 84, 69, 82, 95, 65, 71, 71, 95, 82, 69, 83, 79, 85, + 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, 83, 69, 78, 84, 0, 3, 0, + 0, 0, 0, 0, 0, 0, 33, 69, 66, 79, 85, 78, 68, 69, 68, 95, 65, 71, + 71, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, + 83, 69, 78, 84, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 69, 67, 79, 85, + 78, 84, 69, 82, 95, 73, 78, 67, 82, 69, 77, 69, 78, 84, 95, 70, 65, 73, + 76, 0, 5, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, 65, 85, + 84, 72, 79, 82, 73, 90, 69, 68, 0, 0, 0, 0, 2, 1, 2, 11, 1, 1, + 3, 2, 2, 1, 2, 3, 3, 2, 1, 2, 11, 1, 1, 3, 0, 1, 4, 1, + 1, 2, 18, 7, 0, 41, 1, 4, 15, 7, 0, 42, 1, 12, 0, 10, 0, 16, + 0, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 0, 21, 2, + 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 1, 39, 2, 1, 4, 1, 2, 0, + 15, 7, 0, 41, 2, 4, 12, 7, 0, 42, 2, 15, 1, 6, 1, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 4, 10, 2, 6, 4, 0, 0, 0, 0, 0, 0, 0, + 39, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 1, 39, 4, 0, 0, 0, 9, + 33, 10, 0, 17, 5, 7, 0, 33, 4, 29, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 1, 12, 1, 10, 0, 11, 1, 45, 1, 10, 0, 12, 2, 56, 1, 18, + 2, 12, 3, 11, 2, 11, 3, 45, 2, 11, 0, 12, 2, 6, 100, 0, 0, 0, + 0, 0, 0, 0, 56, 2, 18, 0, 12, 4, 11, 2, 11, 4, 45, 0, 2, 11, + 0, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 39, 8, 1, 4, 1, 0, 11, + 23, 7, 0, 41, 0, 4, 20, 7, 0, 42, 0, 12, 2, 11, 0, 4, 14, 11, + 2, 15, 2, 11, 1, 56, 0, 1, 2, 11, 2, 15, 2, 11, 1, 56, 3, 1, + 5, 13, 6, 3, 0, 0, 0, 0, 0, 0, 0, 17, 1, 39, 1, 0, 2, 0, + 0, 0, 0, ] }); #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_COIN_EXAMPLE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 10, 1, 0, 6, 2, 6, 4, 3, 10, 33, - 4, 43, 6, 5, 49, 29, 7, 78, 112, 8, 190, 1, 64, 6, 254, 1, 27, 10, - 153, 2, 5, 12, 158, 2, 39, 0, 0, 1, 1, 1, 2, 0, 3, 0, 0, 0, - 4, 0, 1, 0, 0, 5, 2, 1, 0, 1, 7, 4, 1, 1, 0, 1, 8, 0, - 1, 1, 0, 2, 9, 0, 5, 0, 1, 10, 6, 1, 1, 0, 2, 3, 3, 3, - 5, 3, 1, 6, 12, 0, 3, 6, 12, 6, 12, 3, 1, 8, 0, 5, 6, 12, - 10, 2, 10, 2, 2, 1, 1, 5, 3, 6, 12, 5, 3, 12, 99, 111, 105, 110, - 95, 101, 120, 97, 109, 112, 108, 101, 12, 109, 97, 110, 97, 103, 101, 100, 95, 99, - 111, 105, 110, 6, 115, 105, 103, 110, 101, 114, 11, 69, 120, 97, 109, 112, 108, 101, - 67, 111, 105, 110, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 6, 109, - 105, 110, 116, 95, 112, 11, 100, 117, 109, 109, 121, 95, 102, 105, 101, 108, 100, 10, - 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 8, 114, 101, 103, 105, 115, 116, 101, - 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 4, 109, 105, 110, 116, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 11, 1, 0, 6, 2, 6, 4, 3, 10, 39, + 4, 49, 6, 5, 55, 36, 7, 91, 112, 8, 203, 1, 64, 6, 139, 2, 27, 16, + 166, 2, 31, 10, 197, 2, 5, 12, 202, 2, 43, 0, 0, 1, 4, 1, 8, 0, + 1, 0, 0, 0, 3, 0, 1, 0, 1, 1, 5, 3, 1, 1, 0, 1, 0, 6, + 5, 1, 0, 1, 1, 7, 0, 1, 1, 0, 1, 2, 9, 0, 6, 0, 1, 1, + 10, 7, 1, 1, 0, 1, 1, 2, 3, 2, 5, 2, 1, 6, 12, 0, 1, 8, + 0, 5, 6, 12, 10, 2, 10, 2, 2, 1, 4, 1, 2, 10, 2, 10, 2, 3, + 6, 12, 6, 12, 3, 1, 5, 3, 6, 12, 5, 3, 12, 99, 111, 105, 110, 95, + 101, 120, 97, 109, 112, 108, 101, 11, 69, 120, 97, 109, 112, 108, 101, 67, 111, 105, + 110, 11, 100, 117, 109, 109, 121, 95, 102, 105, 101, 108, 100, 11, 105, 110, 105, 116, + 95, 109, 111, 100, 117, 108, 101, 12, 109, 97, 110, 97, 103, 101, 100, 95, 99, 111, + 105, 110, 10, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 6, 109, 105, 110, 116, + 95, 112, 8, 114, 101, 103, 105, 115, 116, 101, 114, 6, 115, 105, 103, 110, 101, 114, + 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 4, 109, 105, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 2, 13, 12, 69, 120, 97, 109, 112, - 108, 101, 32, 67, 111, 105, 110, 10, 2, 8, 7, 69, 120, 97, 109, 112, 108, 101, - 0, 2, 1, 6, 1, 0, 0, 0, 0, 1, 7, 11, 0, 7, 0, 7, 1, 49, - 8, 9, 56, 0, 2, 1, 1, 4, 0, 1, 8, 10, 0, 56, 1, 11, 1, 11, - 0, 17, 4, 11, 2, 56, 2, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 10, 2, 13, 12, 69, 120, 97, 109, 112, 108, + 101, 32, 67, 111, 105, 110, 10, 2, 8, 7, 69, 120, 97, 109, 112, 108, 101, 20, + 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, + 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 0, 2, 1, 2, 1, 0, + 0, 0, 0, 4, 7, 11, 0, 7, 0, 7, 1, 49, 8, 9, 56, 0, 2, 2, + 1, 4, 0, 6, 10, 10, 0, 56, 1, 11, 0, 17, 4, 12, 3, 11, 1, 11, + 3, 11, 2, 56, 2, 2, 0, ] }); #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_FUNGIBLE_ASSET_EXAMPLE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 16, 2, 16, 48, 3, 64, 128, - 1, 4, 192, 1, 16, 5, 208, 1, 216, 1, 7, 168, 3, 210, 4, 8, 250, 7, - 64, 6, 186, 8, 83, 16, 141, 9, 161, 1, 10, 174, 10, 12, 12, 186, 10, 230, - 1, 13, 160, 12, 4, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, - 6, 1, 7, 0, 8, 8, 0, 3, 9, 7, 1, 0, 1, 2, 10, 8, 0, 2, - 17, 6, 0, 2, 19, 6, 0, 2, 21, 6, 0, 3, 24, 2, 0, 4, 26, 7, - 1, 0, 0, 7, 28, 7, 0, 2, 35, 0, 0, 2, 36, 8, 0, 0, 11, 0, - 1, 0, 0, 12, 2, 3, 0, 0, 13, 4, 3, 0, 0, 14, 5, 3, 0, 0, - 15, 6, 3, 0, 3, 22, 7, 0, 0, 3, 23, 0, 9, 1, 8, 3, 25, 11, - 12, 0, 4, 27, 3, 14, 1, 0, 7, 29, 15, 16, 0, 5, 30, 17, 3, 0, - 2, 31, 18, 19, 0, 2, 32, 18, 20, 0, 2, 33, 18, 21, 0, 3, 34, 18, - 22, 0, 6, 37, 2, 0, 0, 3, 38, 24, 25, 1, 8, 1, 39, 26, 26, 0, - 3, 40, 27, 0, 1, 8, 5, 41, 28, 29, 1, 8, 2, 13, 30, 31, 0, 2, - 42, 33, 3, 1, 8, 5, 43, 28, 29, 1, 8, 2, 15, 35, 3, 1, 8, 6, - 8, 8, 13, 16, 8, 18, 8, 19, 8, 21, 32, 22, 8, 23, 32, 1, 5, 1, - 11, 1, 1, 8, 2, 1, 6, 12, 0, 3, 6, 12, 5, 3, 3, 6, 12, 6, - 12, 3, 4, 6, 12, 5, 5, 3, 2, 6, 5, 10, 2, 1, 8, 2, 1, 11, - 1, 1, 9, 0, 6, 8, 6, 8, 5, 6, 8, 6, 12, 8, 3, 8, 4, 2, - 6, 12, 10, 2, 1, 8, 6, 1, 4, 1, 11, 7, 1, 9, 0, 1, 10, 2, - 1, 8, 8, 7, 6, 8, 6, 11, 7, 1, 4, 8, 8, 8, 8, 2, 8, 8, - 8, 8, 1, 6, 8, 6, 1, 8, 3, 1, 8, 5, 1, 8, 4, 1, 12, 6, - 11, 1, 1, 8, 2, 11, 1, 1, 8, 2, 8, 9, 6, 8, 0, 6, 12, 11, - 1, 1, 8, 10, 2, 11, 1, 1, 9, 0, 5, 1, 1, 1, 3, 1, 6, 11, - 1, 1, 9, 0, 2, 5, 11, 1, 1, 9, 0, 1, 11, 1, 1, 8, 10, 2, - 6, 8, 3, 3, 1, 8, 9, 1, 8, 10, 3, 6, 8, 4, 11, 1, 1, 9, - 0, 8, 9, 3, 11, 1, 1, 8, 2, 11, 1, 1, 8, 10, 11, 1, 1, 8, - 10, 4, 6, 12, 11, 1, 1, 9, 0, 11, 1, 1, 9, 0, 3, 22, 102, 117, - 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 95, 101, 120, 97, 109, 112, - 108, 101, 5, 101, 114, 114, 111, 114, 14, 102, 117, 110, 103, 105, 98, 108, 101, 95, - 97, 115, 115, 101, 116, 6, 111, 98, 106, 101, 99, 116, 6, 111, 112, 116, 105, 111, - 110, 22, 112, 114, 105, 109, 97, 114, 121, 95, 102, 117, 110, 103, 105, 98, 108, 101, - 95, 115, 116, 111, 114, 101, 6, 115, 105, 103, 110, 101, 114, 6, 115, 116, 114, 105, - 110, 103, 20, 77, 97, 110, 97, 103, 101, 100, 70, 117, 110, 103, 105, 98, 108, 101, - 65, 115, 115, 101, 116, 6, 79, 98, 106, 101, 99, 116, 8, 77, 101, 116, 97, 100, - 97, 116, 97, 12, 103, 101, 116, 95, 109, 101, 116, 97, 100, 97, 116, 97, 11, 105, - 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 4, 109, 105, 110, 116, 6, 109, 105, - 110, 116, 95, 112, 8, 116, 114, 97, 110, 115, 102, 101, 114, 8, 109, 105, 110, 116, - 95, 114, 101, 102, 7, 77, 105, 110, 116, 82, 101, 102, 12, 116, 114, 97, 110, 115, - 102, 101, 114, 95, 114, 101, 102, 11, 84, 114, 97, 110, 115, 102, 101, 114, 82, 101, - 102, 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, 117, 114, 110, 82, 101, 102, - 21, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 95, 97, 100, 100, - 114, 101, 115, 115, 17, 97, 100, 100, 114, 101, 115, 115, 95, 116, 111, 95, 111, 98, - 106, 101, 99, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, - 102, 19, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, 100, 95, 111, 98, 106, - 101, 99, 116, 6, 79, 112, 116, 105, 111, 110, 4, 110, 111, 110, 101, 6, 83, 116, - 114, 105, 110, 103, 4, 117, 116, 102, 56, 43, 99, 114, 101, 97, 116, 101, 95, 112, - 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 110, 97, 98, 108, - 101, 100, 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 17, - 103, 101, 110, 101, 114, 97, 116, 101, 95, 109, 105, 110, 116, 95, 114, 101, 102, 17, - 103, 101, 110, 101, 114, 97, 116, 101, 95, 98, 117, 114, 110, 95, 114, 101, 102, 21, - 103, 101, 110, 101, 114, 97, 116, 101, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, - 114, 101, 102, 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, - 114, 13, 70, 117, 110, 103, 105, 98, 108, 101, 65, 115, 115, 101, 116, 13, 70, 117, - 110, 103, 105, 98, 108, 101, 83, 116, 111, 114, 101, 10, 97, 100, 100, 114, 101, 115, - 115, 95, 111, 102, 8, 105, 115, 95, 111, 119, 110, 101, 114, 17, 112, 101, 114, 109, - 105, 115, 115, 105, 111, 110, 95, 100, 101, 110, 105, 101, 100, 14, 111, 98, 106, 101, - 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, 27, 101, 110, 115, 117, 114, 101, 95, - 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 120, 105, 115, - 116, 115, 16, 100, 101, 112, 111, 115, 105, 116, 95, 119, 105, 116, 104, 95, 114, 101, - 102, 13, 112, 114, 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 16, 2, 16, 48, 3, 64, 152, + 1, 4, 216, 1, 16, 5, 232, 1, 240, 1, 7, 216, 3, 210, 4, 8, 170, 8, + 64, 6, 234, 8, 73, 16, 179, 9, 192, 1, 10, 243, 10, 12, 12, 255, 10, 143, + 2, 13, 142, 13, 4, 0, 0, 1, 4, 1, 12, 1, 14, 1, 16, 1, 25, 1, + 30, 1, 33, 0, 1, 8, 0, 1, 3, 6, 0, 1, 6, 6, 0, 1, 8, 6, + 0, 2, 11, 7, 1, 0, 1, 1, 13, 11, 0, 1, 18, 8, 0, 1, 23, 0, + 0, 2, 29, 2, 0, 6, 32, 7, 1, 0, 0, 7, 35, 7, 0, 0, 9, 0, + 1, 0, 1, 0, 10, 2, 3, 0, 1, 3, 15, 4, 2, 0, 1, 4, 17, 6, + 7, 1, 8, 1, 4, 19, 6, 7, 1, 8, 1, 1, 9, 9, 1, 1, 8, 1, + 0, 20, 11, 1, 0, 1, 2, 21, 12, 13, 1, 8, 1, 2, 22, 14, 2, 1, + 8, 1, 1, 20, 15, 16, 0, 1, 1, 24, 17, 1, 1, 8, 1, 5, 26, 18, + 18, 0, 1, 0, 27, 4, 1, 0, 1, 2, 28, 20, 21, 0, 1, 6, 31, 1, + 23, 1, 0, 1, 7, 34, 24, 25, 0, 1, 4, 36, 26, 1, 0, 1, 1, 37, + 27, 28, 0, 1, 1, 38, 27, 29, 0, 1, 1, 39, 27, 30, 0, 1, 2, 40, + 27, 31, 0, 1, 0, 41, 33, 1, 0, 1, 2, 42, 34, 2, 0, 1, 2, 43, + 2, 35, 1, 8, 1, 3, 5, 4, 5, 5, 8, 7, 5, 8, 5, 10, 8, 14, + 22, 23, 5, 4, 6, 12, 5, 5, 3, 0, 1, 5, 1, 11, 4, 1, 8, 5, + 1, 6, 12, 1, 8, 5, 2, 5, 11, 4, 1, 9, 0, 1, 11, 4, 1, 8, + 6, 1, 8, 6, 4, 6, 12, 11, 4, 1, 9, 0, 11, 4, 1, 9, 0, 3, + 3, 11, 4, 1, 8, 5, 11, 4, 1, 8, 6, 11, 4, 1, 8, 6, 3, 6, + 12, 5, 3, 2, 11, 4, 1, 9, 0, 5, 1, 1, 1, 6, 11, 4, 1, 9, + 0, 2, 6, 8, 1, 3, 1, 8, 7, 3, 6, 8, 2, 11, 4, 1, 9, 0, + 8, 7, 1, 3, 7, 11, 4, 1, 8, 5, 11, 4, 1, 8, 5, 11, 4, 1, + 8, 5, 5, 6, 8, 0, 11, 4, 1, 8, 6, 8, 7, 2, 6, 12, 10, 2, + 1, 8, 8, 1, 4, 1, 11, 9, 1, 9, 0, 1, 10, 2, 1, 8, 10, 7, + 6, 8, 8, 11, 9, 1, 4, 8, 10, 8, 10, 2, 8, 10, 8, 10, 1, 6, + 8, 8, 1, 8, 1, 1, 8, 3, 1, 8, 2, 1, 12, 15, 10, 2, 8, 8, + 6, 8, 8, 6, 8, 8, 8, 10, 8, 10, 2, 8, 10, 8, 10, 11, 9, 1, + 4, 8, 3, 12, 8, 2, 8, 1, 8, 0, 3, 6, 12, 6, 12, 3, 2, 6, + 5, 10, 2, 1, 11, 4, 1, 9, 0, 22, 102, 117, 110, 103, 105, 98, 108, 101, + 95, 97, 115, 115, 101, 116, 95, 101, 120, 97, 109, 112, 108, 101, 20, 77, 97, 110, + 97, 103, 101, 100, 70, 117, 110, 103, 105, 98, 108, 101, 65, 115, 115, 101, 116, 8, + 109, 105, 110, 116, 95, 114, 101, 102, 7, 77, 105, 110, 116, 82, 101, 102, 14, 102, + 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 12, 116, 114, 97, 110, + 115, 102, 101, 114, 95, 114, 101, 102, 11, 84, 114, 97, 110, 115, 102, 101, 114, 82, + 101, 102, 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, 117, 114, 110, 82, 101, + 102, 8, 116, 114, 97, 110, 115, 102, 101, 114, 12, 103, 101, 116, 95, 109, 101, 116, + 97, 100, 97, 116, 97, 6, 79, 98, 106, 101, 99, 116, 6, 111, 98, 106, 101, 99, + 116, 8, 77, 101, 116, 97, 100, 97, 116, 97, 6, 115, 105, 103, 110, 101, 114, 10, + 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 22, 112, 114, 105, 109, 97, 114, 121, + 95, 102, 117, 110, 103, 105, 98, 108, 101, 95, 115, 116, 111, 114, 101, 13, 112, 114, + 105, 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 13, 70, 117, 110, 103, 105, 98, + 108, 101, 83, 116, 111, 114, 101, 27, 101, 110, 115, 117, 114, 101, 95, 112, 114, 105, + 109, 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 120, 105, 115, 116, 115, 4, + 109, 105, 110, 116, 8, 105, 115, 95, 111, 119, 110, 101, 114, 14, 111, 98, 106, 101, + 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, 13, 70, 117, 110, 103, 105, 98, 108, + 101, 65, 115, 115, 101, 116, 16, 100, 101, 112, 111, 115, 105, 116, 95, 119, 105, 116, + 104, 95, 114, 101, 102, 5, 101, 114, 114, 111, 114, 17, 112, 101, 114, 109, 105, 115, + 115, 105, 111, 110, 95, 100, 101, 110, 105, 101, 100, 11, 105, 110, 105, 116, 95, 109, + 111, 100, 117, 108, 101, 19, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, 100, + 95, 111, 98, 106, 101, 99, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, + 114, 82, 101, 102, 6, 111, 112, 116, 105, 111, 110, 4, 110, 111, 110, 101, 6, 79, + 112, 116, 105, 111, 110, 6, 115, 116, 114, 105, 110, 103, 4, 117, 116, 102, 56, 6, + 83, 116, 114, 105, 110, 103, 43, 99, 114, 101, 97, 116, 101, 95, 112, 114, 105, 109, + 97, 114, 121, 95, 115, 116, 111, 114, 101, 95, 101, 110, 97, 98, 108, 101, 100, 95, + 102, 117, 110, 103, 105, 98, 108, 101, 95, 97, 115, 115, 101, 116, 17, 103, 101, 110, + 101, 114, 97, 116, 101, 95, 109, 105, 110, 116, 95, 114, 101, 102, 17, 103, 101, 110, + 101, 114, 97, 116, 101, 95, 98, 117, 114, 110, 95, 114, 101, 102, 21, 103, 101, 110, + 101, 114, 97, 116, 101, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, + 15, 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 6, 109, + 105, 110, 116, 95, 112, 21, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, + 116, 95, 97, 100, 100, 114, 101, 115, 115, 17, 97, 100, 100, 114, 101, 115, 115, 95, + 116, 111, 95, 111, 98, 106, 101, 99, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 10, 2, 3, 2, 70, 65, 3, 8, 1, 0, 0, - 0, 0, 0, 0, 0, 10, 2, 8, 7, 70, 65, 32, 67, 111, 105, 110, 10, 2, - 31, 30, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, - 111, 109, 47, 102, 97, 118, 105, 99, 111, 110, 46, 105, 99, 111, 10, 2, 19, 18, - 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, - 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, - 49, 140, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 10, 69, 78, 79, 84, 95, - 79, 87, 78, 69, 82, 52, 79, 110, 108, 121, 32, 102, 117, 110, 103, 105, 98, 108, - 101, 32, 97, 115, 115, 101, 116, 32, 109, 101, 116, 97, 100, 97, 116, 97, 32, 111, - 119, 110, 101, 114, 32, 99, 97, 110, 32, 109, 97, 107, 101, 32, 99, 104, 97, 110, - 103, 101, 115, 46, 1, 20, 77, 97, 110, 97, 103, 101, 100, 70, 117, 110, 103, 105, - 98, 108, 101, 65, 115, 115, 101, 116, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, - 98, 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, - 1, 12, 103, 101, 116, 95, 109, 101, 116, 97, 100, 97, 116, 97, 1, 1, 0, 0, - 2, 3, 16, 8, 3, 18, 8, 4, 20, 8, 5, 0, 1, 0, 0, 3, 5, 14, - 0, 7, 0, 17, 5, 56, 0, 2, 1, 0, 0, 0, 10, 37, 11, 0, 7, 0, - 17, 7, 12, 1, 14, 1, 12, 3, 10, 3, 56, 1, 7, 2, 17, 9, 7, 0, - 17, 9, 49, 8, 7, 3, 17, 9, 7, 4, 17, 9, 17, 10, 10, 3, 17, 11, - 12, 5, 10, 3, 17, 12, 12, 2, 10, 3, 17, 13, 12, 6, 11, 3, 17, 14, - 12, 4, 14, 4, 11, 5, 11, 6, 11, 2, 18, 0, 45, 0, 2, 2, 1, 4, - 1, 0, 23, 36, 10, 0, 17, 15, 17, 0, 12, 3, 11, 0, 10, 3, 12, 4, - 12, 7, 10, 4, 11, 7, 17, 15, 56, 2, 4, 14, 5, 17, 7, 1, 17, 17, - 39, 14, 4, 56, 3, 43, 0, 12, 6, 11, 1, 11, 3, 56, 4, 12, 8, 10, - 6, 16, 0, 11, 2, 17, 20, 12, 5, 11, 6, 16, 1, 11, 8, 11, 5, 56, - 5, 2, 3, 1, 4, 1, 0, 3, 6, 11, 1, 11, 0, 17, 15, 11, 2, 17, - 2, 2, 4, 1, 4, 0, 34, 18, 11, 1, 17, 0, 12, 4, 10, 0, 17, 15, - 10, 4, 56, 6, 12, 5, 11, 2, 11, 4, 56, 4, 12, 6, 11, 0, 11, 5, - 11, 6, 11, 3, 56, 7, 2, 0, 0, 0, 1, 0, + 1, 10, 2, 3, 2, 70, 65, 10, 2, 8, 7, 70, 65, 32, 67, 111, 105, 110, + 10, 2, 31, 30, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, + 46, 99, 111, 109, 47, 102, 97, 118, 105, 99, 111, 110, 46, 105, 99, 111, 10, 2, + 19, 18, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, + 111, 109, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, + 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, + 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 140, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 10, 69, 78, 79, 84, 95, 79, 87, 78, + 69, 82, 52, 79, 110, 108, 121, 32, 102, 117, 110, 103, 105, 98, 108, 101, 32, 97, + 115, 115, 101, 116, 32, 109, 101, 116, 97, 100, 97, 116, 97, 32, 111, 119, 110, 101, + 114, 32, 99, 97, 110, 32, 109, 97, 107, 101, 32, 99, 104, 97, 110, 103, 101, 115, + 46, 1, 20, 77, 97, 110, 97, 103, 101, 100, 70, 117, 110, 103, 105, 98, 108, 101, + 65, 115, 115, 101, 116, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, + 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 1, 12, 103, + 101, 116, 95, 109, 101, 116, 97, 100, 97, 116, 97, 1, 1, 0, 0, 2, 3, 2, + 8, 1, 5, 8, 2, 7, 8, 3, 0, 1, 4, 0, 10, 18, 11, 1, 17, 1, + 12, 4, 10, 0, 17, 2, 10, 4, 56, 0, 11, 2, 11, 4, 56, 1, 12, 5, + 12, 6, 11, 0, 11, 6, 11, 5, 11, 3, 56, 2, 2, 6, 1, 4, 1, 0, + 19, 37, 10, 0, 17, 2, 17, 1, 12, 3, 10, 3, 12, 4, 10, 4, 12, 5, + 11, 0, 17, 2, 12, 6, 11, 5, 11, 6, 56, 3, 4, 34, 14, 4, 56, 4, + 43, 0, 12, 7, 11, 1, 11, 3, 56, 1, 12, 8, 10, 7, 16, 0, 11, 2, + 17, 9, 12, 9, 11, 7, 16, 1, 11, 8, 11, 9, 56, 5, 2, 6, 1, 0, + 0, 0, 0, 0, 0, 0, 17, 11, 39, 12, 0, 0, 0, 32, 51, 11, 0, 7, + 0, 17, 13, 12, 2, 14, 2, 12, 3, 10, 3, 12, 4, 56, 6, 7, 1, 17, + 15, 7, 0, 17, 15, 49, 8, 7, 2, 17, 15, 7, 3, 17, 15, 12, 5, 12, + 6, 12, 7, 12, 8, 12, 9, 12, 10, 11, 4, 11, 10, 11, 9, 11, 8, 11, + 7, 11, 6, 11, 5, 17, 16, 10, 3, 17, 17, 10, 3, 17, 18, 12, 11, 10, + 3, 17, 19, 11, 3, 17, 20, 12, 12, 14, 12, 12, 0, 11, 11, 18, 0, 12, + 15, 11, 0, 11, 15, 45, 0, 2, 21, 1, 4, 1, 0, 2, 8, 11, 0, 17, + 2, 12, 3, 11, 1, 11, 3, 11, 2, 17, 6, 2, 1, 1, 0, 0, 1, 5, + 14, 0, 7, 0, 17, 22, 56, 7, 2, 0, 0, 0, 1, 0, ] }); #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_OBJECTS: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 11, 1, 0, 8, 2, 8, 12, 3, 20, 35, - 5, 55, 42, 7, 97, 186, 1, 8, 155, 2, 64, 6, 219, 2, 54, 16, 145, 3, - 130, 1, 10, 147, 4, 11, 12, 158, 4, 241, 1, 13, 143, 6, 2, 0, 0, 1, - 1, 1, 2, 1, 3, 0, 4, 8, 0, 0, 5, 8, 0, 2, 11, 2, 0, 0, - 6, 0, 1, 0, 0, 7, 2, 1, 0, 0, 8, 3, 1, 0, 3, 12, 3, 5, - 0, 2, 13, 5, 7, 0, 2, 14, 8, 9, 0, 1, 15, 11, 11, 0, 3, 6, - 12, 3, 3, 0, 4, 6, 12, 3, 3, 5, 1, 6, 12, 5, 8, 2, 3, 12, - 5, 10, 2, 1, 5, 1, 2, 1, 8, 2, 1, 6, 8, 2, 1, 12, 1, 7, - 8, 1, 1, 3, 7, 111, 98, 106, 101, 99, 116, 115, 5, 101, 114, 114, 111, 114, - 6, 111, 98, 106, 101, 99, 116, 6, 115, 105, 103, 110, 101, 114, 14, 65, 100, 100, - 105, 116, 105, 111, 110, 97, 108, 68, 97, 116, 97, 7, 67, 111, 117, 110, 116, 101, - 114, 14, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 115, 23, 99, - 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 115, 95, 99, 111, 110, 102, - 108, 105, 99, 116, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 4, 100, - 97, 116, 97, 5, 99, 111, 117, 110, 116, 14, 67, 111, 110, 115, 116, 114, 117, 99, - 116, 111, 114, 82, 101, 102, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 13, - 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 15, 103, 101, 110, 101, - 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 16, 105, 110, 118, 97, 108, 105, - 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 11, 1, 0, 8, 2, 8, 12, 3, 20, 42, + 5, 62, 46, 7, 108, 186, 1, 8, 166, 2, 64, 6, 230, 2, 34, 16, 136, 3, + 161, 1, 10, 169, 4, 11, 12, 180, 4, 255, 1, 13, 179, 6, 2, 0, 0, 1, + 6, 1, 9, 1, 14, 0, 1, 8, 0, 0, 3, 8, 0, 2, 11, 2, 0, 0, + 5, 0, 1, 0, 1, 1, 7, 0, 2, 0, 1, 0, 8, 4, 1, 0, 1, 2, + 10, 2, 6, 0, 1, 2, 12, 7, 8, 0, 1, 0, 13, 10, 1, 0, 1, 3, + 15, 11, 11, 0, 1, 1, 6, 12, 0, 1, 5, 1, 8, 0, 3, 6, 12, 3, + 3, 1, 2, 1, 8, 2, 1, 6, 8, 2, 1, 12, 6, 5, 10, 2, 3, 3, + 8, 2, 12, 4, 6, 12, 3, 3, 5, 1, 3, 1, 7, 8, 0, 7, 111, 98, + 106, 101, 99, 116, 115, 7, 67, 111, 117, 110, 116, 101, 114, 5, 99, 111, 117, 110, + 116, 14, 65, 100, 100, 105, 116, 105, 111, 110, 97, 108, 68, 97, 116, 97, 4, 100, + 97, 116, 97, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 6, 115, 105, + 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 14, 99, 114, + 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 115, 6, 111, 98, 106, 101, 99, + 116, 13, 99, 114, 101, 97, 116, 101, 95, 111, 98, 106, 101, 99, 116, 14, 67, 111, + 110, 115, 116, 114, 117, 99, 116, 111, 114, 82, 101, 102, 15, 103, 101, 110, 101, 114, + 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 23, 99, 114, 101, 97, 116, 101, 95, + 111, 98, 106, 101, 99, 116, 115, 95, 99, 111, 110, 102, 108, 105, 99, 116, 5, 101, + 114, 114, 111, 114, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, + 101, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 3, 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0, 0, - 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 171, 205, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, - 95, 118, 49, 110, 2, 1, 0, 0, 0, 0, 0, 0, 0, 29, 69, 67, 79, 85, - 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, - 80, 82, 69, 83, 69, 78, 84, 0, 2, 0, 0, 0, 0, 0, 0, 0, 15, 69, - 78, 79, 84, 95, 65, 85, 84, 72, 79, 82, 73, 90, 69, 68, 0, 1, 14, 65, - 100, 100, 105, 116, 105, 111, 110, 97, 108, 68, 97, 116, 97, 1, 3, 1, 24, 48, - 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, - 71, 114, 111, 117, 112, 0, 0, 2, 1, 9, 10, 2, 1, 2, 1, 10, 3, 0, - 1, 4, 0, 4, 48, 11, 0, 17, 3, 12, 6, 64, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 4, 10, 4, - 10, 2, 35, 4, 23, 5, 12, 13, 7, 10, 4, 6, 100, 0, 0, 0, 0, 0, - 0, 0, 25, 51, 68, 6, 11, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, - 12, 4, 5, 7, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 47, - 5, 28, 10, 6, 17, 4, 12, 3, 10, 2, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 4, 42, 14, 3, 17, 5, 12, 5, 14, 5, 10, 7, 18, 0, 45, 0, - 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 5, 23, 2, 1, - 1, 4, 1, 1, 10, 25, 10, 3, 41, 1, 4, 4, 5, 9, 11, 0, 1, 7, - 0, 17, 6, 39, 11, 3, 42, 1, 12, 4, 10, 4, 16, 0, 20, 6, 1, 0, - 0, 0, 0, 0, 0, 0, 22, 11, 4, 15, 0, 21, 11, 0, 11, 1, 11, 2, - 17, 0, 2, 2, 0, 0, 0, 1, 15, 10, 0, 17, 3, 7, 2, 33, 4, 6, - 5, 10, 11, 0, 1, 7, 1, 39, 11, 0, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 18, 1, 45, 1, 2, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 20, 99, 111, 109, 112, 105, 108, + 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, + 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, + 100, 97, 116, 97, 95, 118, 49, 110, 2, 1, 0, 0, 0, 0, 0, 0, 0, 29, + 69, 67, 79, 85, 78, 84, 69, 82, 95, 82, 69, 83, 79, 85, 82, 67, 69, 95, + 78, 79, 84, 95, 80, 82, 69, 83, 69, 78, 84, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 15, 69, 78, 79, 84, 95, 65, 85, 84, 72, 79, 82, 73, 90, 69, 68, + 0, 1, 14, 65, 100, 100, 105, 116, 105, 111, 110, 97, 108, 68, 97, 116, 97, 1, + 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, 98, + 106, 101, 99, 116, 71, 114, 111, 117, 112, 0, 0, 2, 1, 2, 3, 1, 2, 1, + 4, 10, 2, 0, 0, 0, 0, 3, 16, 10, 0, 17, 1, 7, 0, 33, 4, 12, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 12, 1, 11, 0, 11, 1, 45, + 0, 2, 11, 0, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 39, 2, 1, 4, + 0, 9, 48, 11, 0, 17, 1, 12, 3, 64, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 4, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 5, 10, 5, 10, 2, + 35, 3, 12, 5, 23, 13, 4, 10, 5, 6, 100, 0, 0, 0, 0, 0, 0, 0, + 25, 51, 68, 5, 11, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 5, + 5, 7, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 4, 47, 10, 3, + 17, 3, 12, 7, 10, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 36, 3, 35, + 5, 42, 14, 7, 17, 4, 12, 8, 14, 8, 10, 4, 18, 1, 45, 1, 11, 1, + 6, 1, 0, 0, 0, 0, 0, 0, 0, 23, 12, 1, 5, 23, 2, 5, 1, 4, + 1, 0, 12, 24, 10, 3, 41, 0, 4, 19, 11, 3, 42, 0, 12, 4, 10, 4, + 16, 0, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 4, 15, 0, 21, + 11, 0, 11, 1, 11, 2, 17, 2, 2, 11, 0, 1, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 17, 6, 39, 0, 0, 0, ] }); #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_RESOURCE_GROUPS_EXAMPLE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 11, 1, 0, 8, 2, 8, 40, 3, 48, 50, - 5, 98, 116, 7, 214, 1, 199, 2, 8, 157, 4, 64, 6, 221, 4, 33, 16, 254, - 4, 243, 4, 10, 241, 9, 69, 12, 182, 10, 208, 10, 13, 134, 21, 32, 0, 0, - 1, 1, 1, 2, 1, 3, 0, 4, 0, 0, 0, 5, 8, 0, 0, 6, 8, 0, - 0, 7, 8, 0, 0, 8, 8, 0, 0, 9, 8, 0, 0, 10, 8, 0, 0, 11, - 8, 0, 0, 12, 8, 0, 3, 14, 7, 0, 0, 13, 0, 1, 0, 0, 15, 2, - 1, 0, 0, 16, 3, 1, 0, 0, 17, 4, 1, 0, 0, 18, 5, 1, 0, 0, - 19, 6, 1, 0, 2, 23, 8, 9, 0, 1, 24, 10, 10, 0, 1, 25, 10, 10, - 0, 3, 26, 11, 12, 0, 2, 6, 12, 3, 0, 3, 6, 12, 3, 8, 9, 5, - 6, 12, 3, 3, 3, 8, 9, 4, 6, 12, 3, 3, 8, 9, 5, 6, 12, 6, - 12, 3, 3, 8, 9, 4, 6, 12, 6, 12, 3, 8, 9, 9, 5, 8, 1, 8, - 6, 8, 7, 8, 8, 8, 2, 8, 3, 8, 4, 8, 5, 1, 6, 12, 1, 5, - 1, 3, 1, 10, 2, 1, 8, 9, 17, 5, 7, 8, 1, 8, 1, 7, 8, 6, - 8, 6, 7, 8, 7, 8, 7, 7, 8, 8, 8, 8, 7, 8, 2, 8, 2, 7, - 8, 3, 8, 3, 7, 8, 4, 8, 4, 7, 8, 5, 8, 5, 23, 114, 101, 115, - 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, - 108, 101, 5, 101, 114, 114, 111, 114, 6, 115, 105, 103, 110, 101, 114, 6, 115, 116, - 114, 105, 110, 103, 12, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, - 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 48, 16, 69, - 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 49, 16, 69, 120, - 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 50, 16, 69, 120, 97, - 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 51, 16, 69, 120, 97, 109, - 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 52, 16, 69, 120, 97, 109, 112, - 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 53, 16, 69, 120, 97, 109, 112, 108, - 101, 82, 101, 115, 111, 117, 114, 99, 101, 54, 16, 69, 120, 97, 109, 112, 108, 101, - 82, 101, 115, 111, 117, 114, 99, 101, 55, 12, 114, 101, 97, 100, 95, 111, 114, 95, - 105, 110, 105, 116, 6, 83, 116, 114, 105, 110, 103, 3, 115, 101, 116, 5, 115, 101, - 116, 95, 51, 12, 115, 101, 116, 95, 97, 110, 100, 95, 114, 101, 97, 100, 14, 115, - 101, 116, 95, 97, 110, 100, 95, 114, 101, 97, 100, 95, 112, 5, 115, 101, 116, 95, - 112, 11, 100, 117, 109, 109, 121, 95, 102, 105, 101, 108, 100, 5, 118, 97, 108, 117, - 101, 4, 110, 97, 109, 101, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 16, - 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 13, 105, - 110, 118, 97, 108, 105, 100, 95, 115, 116, 97, 116, 101, 4, 117, 116, 102, 56, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 11, 1, 0, 8, 2, 8, 40, 3, 48, 60, + 5, 108, 97, 7, 205, 1, 199, 2, 8, 148, 4, 64, 6, 212, 4, 13, 16, 225, + 4, 146, 5, 10, 243, 9, 69, 12, 184, 10, 237, 10, 13, 165, 21, 32, 0, 0, + 1, 7, 1, 16, 1, 18, 0, 1, 0, 0, 0, 3, 8, 0, 1, 6, 7, 0, + 0, 8, 8, 0, 0, 9, 8, 0, 0, 10, 8, 0, 0, 11, 8, 0, 0, 12, + 8, 0, 0, 13, 8, 0, 0, 14, 8, 0, 0, 15, 0, 1, 0, 1, 2, 17, + 2, 3, 0, 1, 3, 19, 4, 4, 0, 1, 0, 20, 6, 1, 0, 1, 3, 21, + 4, 4, 0, 1, 1, 22, 7, 8, 0, 1, 0, 23, 10, 1, 0, 1, 0, 24, + 11, 1, 0, 1, 0, 25, 12, 1, 0, 1, 0, 26, 13, 1, 0, 1, 3, 6, + 12, 3, 8, 2, 0, 1, 6, 12, 1, 5, 1, 3, 11, 5, 3, 7, 8, 2, + 8, 1, 8, 3, 8, 4, 8, 5, 8, 6, 8, 7, 8, 8, 8, 9, 2, 6, + 12, 3, 1, 10, 2, 1, 8, 2, 10, 5, 3, 8, 1, 8, 3, 8, 4, 8, + 5, 8, 6, 8, 7, 8, 8, 8, 9, 5, 6, 12, 3, 3, 3, 8, 2, 4, + 6, 12, 3, 3, 8, 2, 5, 6, 12, 6, 12, 3, 3, 8, 2, 4, 6, 12, + 6, 12, 3, 8, 2, 23, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, + 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 12, 69, 120, 97, 109, 112, 108, + 101, 71, 114, 111, 117, 112, 11, 100, 117, 109, 109, 121, 95, 102, 105, 101, 108, 100, + 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 48, 5, + 118, 97, 108, 117, 101, 4, 110, 97, 109, 101, 6, 83, 116, 114, 105, 110, 103, 6, + 115, 116, 114, 105, 110, 103, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, + 117, 114, 99, 101, 49, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, + 114, 99, 101, 50, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, + 99, 101, 51, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, + 101, 52, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, + 53, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 54, + 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 55, 3, + 115, 101, 116, 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, + 95, 111, 102, 5, 101, 114, 114, 111, 114, 16, 105, 110, 118, 97, 108, 105, 100, 95, + 97, 114, 103, 117, 109, 101, 110, 116, 12, 114, 101, 97, 100, 95, 111, 114, 95, 105, + 110, 105, 116, 13, 105, 110, 118, 97, 108, 105, 100, 95, 115, 116, 97, 116, 101, 4, + 117, 116, 102, 56, 5, 115, 101, 116, 95, 51, 12, 115, 101, 116, 95, 97, 110, 100, + 95, 114, 101, 97, 100, 14, 115, 101, 116, 95, 97, 110, 100, 95, 114, 101, 97, 100, + 95, 112, 5, 115, 101, 116, 95, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 8, 1, 0, 0, 0, 0, 0, 0, - 0, 3, 8, 2, 0, 0, 0, 0, 0, 0, 0, 10, 2, 10, 9, 105, 110, 105, - 116, 95, 110, 97, 109, 101, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, - 100, 97, 116, 97, 95, 118, 49, 222, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, - 16, 69, 73, 78, 68, 69, 88, 95, 84, 79, 79, 95, 76, 65, 82, 71, 69, 0, - 2, 0, 0, 0, 0, 0, 0, 0, 16, 69, 86, 65, 76, 85, 69, 95, 84, 79, - 79, 95, 76, 65, 82, 71, 69, 0, 9, 12, 69, 120, 97, 109, 112, 108, 101, 71, - 114, 111, 117, 112, 1, 2, 1, 6, 103, 108, 111, 98, 97, 108, 16, 69, 120, 97, - 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 48, 1, 3, 1, 45, 48, - 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, - 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, - 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, - 115, 111, 117, 114, 99, 101, 49, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, - 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, - 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, - 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, - 50, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, - 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, - 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, - 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 51, 1, 3, 1, 45, 48, - 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, - 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, - 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, - 115, 111, 117, 114, 99, 101, 52, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, - 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, - 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, - 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, - 53, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, - 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, - 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, - 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 54, 1, 3, 1, 45, 48, - 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, - 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, - 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, - 115, 111, 117, 114, 99, 101, 55, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, - 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, - 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, - 117, 112, 0, 0, 2, 1, 20, 1, 1, 2, 2, 21, 3, 22, 8, 9, 2, 2, - 2, 21, 3, 22, 8, 9, 3, 2, 2, 21, 3, 22, 8, 9, 4, 2, 2, 21, - 3, 22, 8, 9, 5, 2, 2, 21, 3, 22, 8, 9, 6, 2, 2, 21, 3, 22, - 8, 9, 7, 2, 2, 21, 3, 22, 8, 9, 8, 2, 2, 21, 3, 22, 8, 9, - 0, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 7, 128, 2, 10, 0, 17, - 6, 12, 2, 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 35, 4, 8, 5, - 13, 11, 0, 1, 7, 0, 17, 7, 39, 10, 1, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 33, 4, 43, 10, 2, 41, 1, 4, 34, 11, 0, 1, 11, 2, 42, 1, - 16, 0, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 30, 5, 33, 7, - 1, 17, 8, 39, 5, 42, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, - 9, 18, 1, 12, 3, 11, 0, 11, 3, 45, 1, 5, 255, 1, 10, 1, 6, 1, - 0, 0, 0, 0, 0, 0, 0, 33, 4, 73, 10, 2, 41, 2, 4, 64, 11, 0, - 1, 11, 2, 42, 2, 16, 1, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, - 4, 60, 5, 63, 7, 1, 17, 8, 39, 5, 72, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 2, 17, 9, 18, 2, 12, 7, 11, 0, 11, 7, 45, 2, 5, 255, - 1, 10, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 33, 4, 103, 10, 2, 41, - 3, 4, 94, 11, 0, 1, 11, 2, 42, 3, 16, 2, 20, 6, 0, 16, 165, 212, - 232, 0, 0, 0, 35, 4, 90, 5, 93, 7, 1, 17, 8, 39, 5, 102, 6, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, 9, 18, 3, 12, 8, 11, 0, 11, - 8, 45, 3, 5, 255, 1, 10, 1, 6, 3, 0, 0, 0, 0, 0, 0, 0, 33, - 4, 133, 1, 10, 2, 41, 4, 4, 124, 11, 0, 1, 11, 2, 42, 4, 16, 3, - 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 120, 5, 123, 7, 1, 17, - 8, 39, 5, 132, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, 9, - 18, 4, 12, 9, 11, 0, 11, 9, 45, 4, 5, 255, 1, 10, 1, 6, 4, 0, - 0, 0, 0, 0, 0, 0, 33, 4, 163, 1, 10, 2, 41, 5, 4, 154, 1, 11, - 0, 1, 11, 2, 42, 5, 16, 4, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, - 35, 4, 150, 1, 5, 153, 1, 7, 1, 17, 8, 39, 5, 162, 1, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 2, 17, 9, 18, 5, 12, 10, 11, 0, 11, 10, - 45, 5, 5, 255, 1, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 33, 4, - 193, 1, 10, 2, 41, 6, 4, 184, 1, 11, 0, 1, 11, 2, 42, 6, 16, 5, - 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 180, 1, 5, 183, 1, 7, - 1, 17, 8, 39, 5, 192, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, - 17, 9, 18, 6, 12, 4, 11, 0, 11, 4, 45, 6, 5, 255, 1, 10, 1, 6, - 6, 0, 0, 0, 0, 0, 0, 0, 33, 4, 223, 1, 10, 2, 41, 7, 4, 214, - 1, 11, 0, 1, 11, 2, 42, 7, 16, 6, 20, 6, 0, 16, 165, 212, 232, 0, - 0, 0, 35, 4, 210, 1, 5, 213, 1, 7, 1, 17, 8, 39, 5, 222, 1, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 7, 2, 17, 9, 18, 7, 12, 5, 11, 0, - 11, 5, 45, 7, 5, 255, 1, 11, 1, 6, 7, 0, 0, 0, 0, 0, 0, 0, - 33, 4, 253, 1, 10, 2, 41, 8, 4, 244, 1, 11, 0, 1, 11, 2, 42, 8, - 16, 7, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 240, 1, 5, 243, - 1, 7, 1, 17, 8, 39, 5, 252, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 2, 17, 9, 18, 8, 12, 6, 11, 0, 11, 6, 45, 8, 5, 255, 1, 11, - 0, 1, 2, 1, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 13, 216, 1, - 10, 0, 17, 6, 12, 3, 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 35, - 4, 8, 5, 13, 11, 0, 1, 7, 0, 17, 7, 39, 10, 1, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 4, 38, 10, 3, 41, 1, 4, 30, 11, 0, 1, 11, - 3, 42, 1, 12, 4, 11, 2, 11, 4, 15, 8, 21, 5, 37, 6, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 2, 18, 1, 12, 5, 11, 0, 11, 5, 45, 1, 5, - 215, 1, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 33, 4, 63, 10, 3, - 41, 2, 4, 55, 11, 0, 1, 11, 3, 42, 2, 12, 12, 11, 2, 11, 12, 15, - 9, 21, 5, 62, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 2, 12, - 13, 11, 0, 11, 13, 45, 2, 5, 215, 1, 10, 1, 6, 2, 0, 0, 0, 0, - 0, 0, 0, 33, 4, 88, 10, 3, 41, 3, 4, 80, 11, 0, 1, 11, 3, 42, - 3, 12, 14, 11, 2, 11, 14, 15, 10, 21, 5, 87, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 2, 18, 3, 12, 15, 11, 0, 11, 15, 45, 3, 5, 215, 1, - 10, 1, 6, 3, 0, 0, 0, 0, 0, 0, 0, 33, 4, 113, 10, 3, 41, 4, - 4, 105, 11, 0, 1, 11, 3, 42, 4, 12, 16, 11, 2, 11, 16, 15, 11, 21, - 5, 112, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 4, 12, 17, 11, - 0, 11, 17, 45, 4, 5, 215, 1, 10, 1, 6, 4, 0, 0, 0, 0, 0, 0, - 0, 33, 4, 138, 1, 10, 3, 41, 5, 4, 130, 1, 11, 0, 1, 11, 3, 42, - 5, 12, 18, 11, 2, 11, 18, 15, 12, 21, 5, 137, 1, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 2, 18, 5, 12, 19, 11, 0, 11, 19, 45, 5, 5, 215, - 1, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 33, 4, 163, 1, 10, 3, - 41, 6, 4, 155, 1, 11, 0, 1, 11, 3, 42, 6, 12, 6, 11, 2, 11, 6, - 15, 13, 21, 5, 162, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, - 6, 12, 7, 11, 0, 11, 7, 45, 6, 5, 215, 1, 10, 1, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 33, 4, 188, 1, 10, 3, 41, 7, 4, 180, 1, 11, 0, - 1, 11, 3, 42, 7, 12, 8, 11, 2, 11, 8, 15, 14, 21, 5, 187, 1, 6, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 7, 12, 9, 11, 0, 11, 9, - 45, 7, 5, 215, 1, 11, 1, 6, 7, 0, 0, 0, 0, 0, 0, 0, 33, 4, - 213, 1, 10, 3, 41, 8, 4, 205, 1, 11, 0, 1, 11, 3, 42, 8, 12, 10, - 11, 2, 11, 10, 15, 15, 21, 5, 212, 1, 6, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 2, 18, 8, 12, 11, 11, 0, 11, 11, 45, 8, 5, 215, 1, 11, 0, - 1, 2, 2, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 13, 10, 0, - 11, 1, 10, 4, 17, 1, 10, 0, 11, 2, 10, 4, 17, 1, 11, 0, 11, 3, - 11, 4, 17, 1, 2, 3, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, - 8, 10, 0, 11, 1, 11, 3, 17, 1, 11, 0, 11, 2, 17, 0, 2, 4, 1, - 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 6, 11, 1, 11, 2, 11, 3, - 11, 4, 17, 3, 2, 5, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, - 5, 11, 1, 11, 2, 11, 3, 17, 1, 2, 1, 0, 2, 0, 3, 0, 4, 0, - 5, 0, 6, 0, 7, 0, 8, 0, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, - 6, 1, 7, 1, 8, 1, 0, + 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 10, 2, 10, 9, 105, 110, 105, 116, 95, 110, 97, 109, 101, 20, 99, 111, 109, 112, + 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, + 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, + 116, 97, 100, 97, 116, 97, 95, 118, 49, 222, 4, 2, 1, 0, 0, 0, 0, 0, + 0, 0, 16, 69, 73, 78, 68, 69, 88, 95, 84, 79, 79, 95, 76, 65, 82, 71, + 69, 0, 2, 0, 0, 0, 0, 0, 0, 0, 16, 69, 86, 65, 76, 85, 69, 95, + 84, 79, 79, 95, 76, 65, 82, 71, 69, 0, 9, 12, 69, 120, 97, 109, 112, 108, + 101, 71, 114, 111, 117, 112, 1, 2, 1, 6, 103, 108, 111, 98, 97, 108, 16, 69, + 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 48, 1, 3, 1, + 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, + 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, + 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, + 82, 101, 115, 111, 117, 114, 99, 101, 49, 1, 3, 1, 45, 48, 120, 97, 98, 99, + 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, + 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, + 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, + 99, 101, 50, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, + 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, + 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, + 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 51, 1, 3, 1, + 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, + 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, + 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, + 82, 101, 115, 111, 117, 114, 99, 101, 52, 1, 3, 1, 45, 48, 120, 97, 98, 99, + 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, + 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, + 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, + 99, 101, 53, 1, 3, 1, 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, + 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, + 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, + 120, 97, 109, 112, 108, 101, 82, 101, 115, 111, 117, 114, 99, 101, 54, 1, 3, 1, + 45, 48, 120, 97, 98, 99, 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, + 103, 114, 111, 117, 112, 115, 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, + 97, 109, 112, 108, 101, 71, 114, 111, 117, 112, 16, 69, 120, 97, 109, 112, 108, 101, + 82, 101, 115, 111, 117, 114, 99, 101, 55, 1, 3, 1, 45, 48, 120, 97, 98, 99, + 100, 58, 58, 114, 101, 115, 111, 117, 114, 99, 101, 95, 103, 114, 111, 117, 112, 115, + 95, 101, 120, 97, 109, 112, 108, 101, 58, 58, 69, 120, 97, 109, 112, 108, 101, 71, + 114, 111, 117, 112, 0, 0, 2, 1, 2, 1, 1, 2, 2, 4, 3, 5, 8, 2, + 3, 2, 2, 4, 3, 5, 8, 2, 4, 2, 2, 4, 3, 5, 8, 2, 5, 2, + 2, 4, 3, 5, 8, 2, 6, 2, 2, 4, 3, 5, 8, 2, 7, 2, 2, 4, + 3, 5, 8, 2, 8, 2, 2, 4, 3, 5, 8, 2, 9, 2, 2, 4, 3, 5, + 8, 2, 0, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 5, 215, 1, 10, + 0, 17, 1, 12, 3, 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 35, 4, + 210, 1, 10, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 33, 4, 32, 10, 3, + 41, 1, 4, 24, 11, 0, 1, 11, 3, 42, 1, 15, 0, 12, 5, 11, 2, 11, + 5, 21, 2, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 1, 12, 6, + 11, 0, 11, 6, 45, 1, 5, 23, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, + 0, 33, 4, 57, 10, 3, 41, 2, 4, 49, 11, 0, 1, 11, 3, 42, 2, 15, + 1, 12, 5, 11, 2, 11, 5, 21, 5, 23, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 2, 18, 2, 12, 7, 11, 0, 11, 7, 45, 2, 5, 23, 10, 1, 6, + 2, 0, 0, 0, 0, 0, 0, 0, 33, 4, 82, 10, 3, 41, 3, 4, 74, 11, + 0, 1, 11, 3, 42, 3, 15, 2, 12, 5, 11, 2, 11, 5, 21, 5, 23, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 3, 12, 8, 11, 0, 11, 8, + 45, 3, 5, 23, 10, 1, 6, 3, 0, 0, 0, 0, 0, 0, 0, 33, 4, 107, + 10, 3, 41, 4, 4, 99, 11, 0, 1, 11, 3, 42, 4, 15, 3, 12, 5, 11, + 2, 11, 5, 21, 5, 23, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, + 4, 12, 9, 11, 0, 11, 9, 45, 4, 5, 23, 10, 1, 6, 4, 0, 0, 0, + 0, 0, 0, 0, 33, 4, 132, 1, 10, 3, 41, 5, 4, 124, 11, 0, 1, 11, + 3, 42, 5, 15, 4, 12, 5, 11, 2, 11, 5, 21, 5, 23, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 2, 18, 5, 12, 10, 11, 0, 11, 10, 45, 5, 5, + 23, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 33, 4, 157, 1, 10, 3, + 41, 6, 4, 149, 1, 11, 0, 1, 11, 3, 42, 6, 15, 5, 12, 5, 11, 2, + 11, 5, 21, 5, 23, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 6, + 12, 11, 11, 0, 11, 11, 45, 6, 5, 23, 10, 1, 6, 6, 0, 0, 0, 0, + 0, 0, 0, 33, 4, 182, 1, 10, 3, 41, 7, 4, 174, 1, 11, 0, 1, 11, + 3, 42, 7, 15, 6, 12, 5, 11, 2, 11, 5, 21, 5, 23, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 2, 18, 7, 12, 12, 11, 0, 11, 12, 45, 7, 5, + 23, 11, 1, 6, 7, 0, 0, 0, 0, 0, 0, 0, 33, 4, 207, 1, 10, 3, + 41, 8, 4, 199, 1, 11, 0, 1, 11, 3, 42, 8, 15, 7, 12, 5, 11, 2, + 11, 5, 21, 5, 23, 6, 0, 0, 0, 0, 0, 0, 0, 0, 11, 2, 18, 8, + 12, 13, 11, 0, 11, 13, 45, 8, 5, 23, 11, 0, 1, 5, 23, 11, 0, 1, + 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 2, 39, 3, 1, 4, 8, 1, 2, + 3, 4, 5, 6, 7, 8, 9, 248, 1, 10, 0, 17, 1, 12, 2, 10, 1, 6, + 8, 0, 0, 0, 0, 0, 0, 0, 35, 4, 243, 1, 10, 1, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 33, 4, 37, 10, 2, 41, 1, 4, 28, 11, 0, 1, 11, + 2, 42, 1, 16, 8, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 25, + 5, 24, 2, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 17, 5, 18, 1, 12, 4, 11, 0, 11, 4, + 45, 1, 5, 24, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 33, 4, 66, + 10, 2, 41, 2, 4, 57, 11, 0, 1, 11, 2, 42, 2, 16, 9, 20, 6, 0, + 16, 165, 212, 232, 0, 0, 0, 35, 4, 54, 5, 24, 6, 2, 0, 0, 0, 0, + 0, 0, 0, 17, 4, 39, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, + 5, 18, 2, 12, 5, 11, 0, 11, 5, 45, 2, 5, 24, 10, 1, 6, 2, 0, + 0, 0, 0, 0, 0, 0, 33, 4, 95, 10, 2, 41, 3, 4, 86, 11, 0, 1, + 11, 2, 42, 3, 16, 10, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, + 83, 5, 24, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 0, 17, 5, 18, 3, 12, 6, 11, 0, 11, 6, + 45, 3, 5, 24, 10, 1, 6, 3, 0, 0, 0, 0, 0, 0, 0, 33, 4, 124, + 10, 2, 41, 4, 4, 115, 11, 0, 1, 11, 2, 42, 4, 16, 11, 20, 6, 0, + 16, 165, 212, 232, 0, 0, 0, 35, 4, 112, 5, 24, 6, 2, 0, 0, 0, 0, + 0, 0, 0, 17, 4, 39, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, + 5, 18, 4, 12, 7, 11, 0, 11, 7, 45, 4, 5, 24, 10, 1, 6, 4, 0, + 0, 0, 0, 0, 0, 0, 33, 4, 153, 1, 10, 2, 41, 5, 4, 144, 1, 11, + 0, 1, 11, 2, 42, 5, 16, 12, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, + 35, 4, 141, 1, 5, 24, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, 5, 18, 5, 12, 8, 11, + 0, 11, 8, 45, 5, 5, 24, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, + 33, 4, 182, 1, 10, 2, 41, 6, 4, 173, 1, 11, 0, 1, 11, 2, 42, 6, + 16, 13, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, 35, 4, 170, 1, 5, 24, + 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 0, 17, 5, 18, 6, 12, 9, 11, 0, 11, 9, 45, 6, 5, + 24, 10, 1, 6, 6, 0, 0, 0, 0, 0, 0, 0, 33, 4, 211, 1, 10, 2, + 41, 7, 4, 202, 1, 11, 0, 1, 11, 2, 42, 7, 16, 14, 20, 6, 0, 16, + 165, 212, 232, 0, 0, 0, 35, 4, 199, 1, 5, 24, 6, 2, 0, 0, 0, 0, + 0, 0, 0, 17, 4, 39, 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, + 5, 18, 7, 12, 10, 11, 0, 11, 10, 45, 7, 5, 24, 11, 1, 6, 7, 0, + 0, 0, 0, 0, 0, 0, 33, 4, 240, 1, 10, 2, 41, 8, 4, 231, 1, 11, + 0, 1, 11, 2, 42, 8, 16, 15, 20, 6, 0, 16, 165, 212, 232, 0, 0, 0, + 35, 4, 228, 1, 5, 24, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 17, 5, 18, 8, 12, 11, 11, + 0, 11, 11, 45, 8, 5, 24, 11, 0, 1, 5, 24, 11, 0, 1, 6, 1, 0, + 0, 0, 0, 0, 0, 0, 17, 2, 39, 6, 1, 4, 8, 1, 2, 3, 4, 5, + 6, 7, 8, 1, 13, 10, 0, 11, 1, 10, 4, 17, 0, 10, 0, 11, 2, 10, + 4, 17, 0, 11, 0, 11, 3, 11, 4, 17, 0, 2, 7, 1, 4, 8, 1, 2, + 3, 4, 5, 6, 7, 8, 1, 8, 10, 0, 11, 1, 11, 3, 17, 0, 11, 0, + 11, 2, 17, 3, 2, 8, 1, 4, 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, + 8, 11, 1, 11, 2, 11, 3, 11, 4, 17, 7, 11, 0, 1, 2, 9, 1, 4, + 8, 1, 2, 3, 4, 5, 6, 7, 8, 1, 7, 11, 1, 11, 2, 11, 3, 17, + 0, 11, 0, 1, 2, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, + 1, 8, 1, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, + 0, 0, ] }); #[rustfmt::skip] pub static MODULE_FRAMEWORK_USECASES_TOKEN_V1: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 11, 1, 0, 16, 2, 16, 42, 3, 58, 167, - 1, 4, 225, 1, 12, 5, 237, 1, 139, 2, 7, 248, 3, 185, 6, 8, 177, 10, - 96, 6, 145, 11, 150, 1, 10, 167, 12, 19, 12, 186, 12, 185, 5, 13, 243, 17, - 6, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 2, 7, 0, - 8, 8, 0, 4, 9, 7, 0, 7, 12, 7, 0, 7, 15, 4, 0, 7, 17, 7, - 0, 1, 27, 6, 0, 6, 29, 4, 2, 3, 1, 0, 1, 2, 30, 7, 1, 0, - 0, 7, 44, 7, 0, 0, 10, 0, 1, 0, 0, 11, 2, 3, 0, 0, 13, 4, - 5, 0, 0, 14, 2, 5, 0, 0, 16, 6, 7, 0, 0, 18, 8, 9, 0, 0, - 19, 10, 7, 0, 0, 20, 4, 7, 0, 0, 21, 4, 7, 0, 0, 22, 4, 7, - 0, 0, 23, 4, 7, 0, 0, 24, 4, 7, 0, 0, 25, 4, 7, 0, 4, 32, - 11, 7, 0, 5, 33, 13, 1, 1, 0, 4, 34, 14, 7, 0, 1, 35, 15, 3, - 0, 3, 36, 10, 2, 0, 1, 37, 2, 12, 0, 4, 38, 17, 1, 0, 7, 39, - 18, 19, 0, 7, 40, 21, 22, 0, 2, 41, 23, 24, 1, 0, 2, 42, 24, 26, - 1, 0, 6, 43, 28, 7, 2, 3, 0, 7, 45, 30, 31, 0, 7, 46, 32, 9, - 0, 1, 47, 35, 36, 0, 7, 48, 37, 7, 0, 6, 49, 7, 38, 2, 3, 4, - 7, 50, 40, 25, 0, 7, 51, 43, 7, 0, 14, 12, 14, 2, 22, 12, 23, 25, - 24, 27, 29, 27, 2, 8, 1, 3, 1, 8, 1, 1, 5, 1, 12, 2, 6, 12, - 5, 2, 12, 8, 2, 3, 5, 5, 8, 3, 0, 4, 6, 12, 8, 1, 8, 1, - 3, 1, 8, 4, 1, 6, 12, 2, 7, 8, 1, 10, 2, 1, 3, 1, 6, 9, - 0, 2, 7, 8, 1, 8, 1, 1, 6, 8, 5, 5, 5, 12, 8, 2, 8, 1, - 8, 4, 1, 10, 2, 3, 6, 12, 8, 4, 3, 1, 8, 2, 6, 11, 7, 1, - 3, 3, 12, 8, 2, 8, 4, 8, 1, 2, 5, 8, 1, 1, 11, 7, 1, 3, - 1, 7, 11, 7, 1, 9, 0, 1, 9, 0, 1, 8, 3, 1, 11, 7, 1, 9, - 0, 2, 5, 11, 7, 1, 8, 3, 3, 7, 11, 6, 2, 9, 0, 9, 1, 9, - 0, 9, 1, 5, 10, 1, 8, 1, 5, 8, 8, 8, 1, 1, 6, 10, 1, 1, - 8, 8, 13, 6, 12, 8, 1, 8, 1, 8, 1, 3, 8, 1, 5, 3, 3, 8, - 8, 10, 8, 1, 10, 10, 2, 10, 8, 1, 6, 8, 1, 8, 1, 8, 1, 12, - 8, 5, 8, 4, 1, 2, 2, 6, 12, 10, 2, 2, 12, 8, 5, 6, 6, 12, - 8, 1, 8, 1, 8, 1, 3, 10, 1, 1, 11, 6, 2, 9, 0, 9, 1, 5, - 12, 6, 12, 8, 3, 8, 2, 8, 4, 3, 6, 12, 8, 2, 3, 3, 12, 8, - 3, 8, 2, 4, 12, 6, 12, 8, 2, 8, 4, 4, 6, 12, 6, 12, 8, 2, - 3, 8, 116, 111, 107, 101, 110, 95, 118, 49, 7, 97, 99, 99, 111, 117, 110, 116, - 6, 111, 112, 116, 105, 111, 110, 6, 115, 105, 103, 110, 101, 114, 6, 115, 116, 114, - 105, 110, 103, 12, 115, 116, 114, 105, 110, 103, 95, 117, 116, 105, 108, 115, 5, 116, - 97, 98, 108, 101, 5, 116, 111, 107, 101, 110, 12, 77, 105, 110, 116, 101, 114, 67, - 111, 110, 102, 105, 103, 6, 83, 116, 114, 105, 110, 103, 16, 98, 117, 105, 108, 100, - 95, 116, 111, 107, 101, 110, 95, 110, 97, 109, 101, 10, 103, 101, 116, 95, 115, 105, - 103, 110, 101, 114, 7, 84, 111, 107, 101, 110, 73, 100, 17, 109, 105, 110, 116, 95, - 110, 102, 116, 95, 112, 97, 114, 97, 108, 108, 101, 108, 19, 109, 105, 110, 116, 95, - 110, 102, 116, 95, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 5, 84, 111, 107, - 101, 110, 16, 115, 101, 116, 95, 116, 111, 107, 101, 110, 95, 109, 105, 110, 116, 101, - 100, 11, 84, 111, 107, 101, 110, 68, 97, 116, 97, 73, 100, 26, 116, 111, 107, 101, - 110, 95, 118, 49, 95, 99, 114, 101, 97, 116, 101, 95, 116, 111, 107, 101, 110, 95, - 100, 97, 116, 97, 30, 116, 111, 107, 101, 110, 95, 118, 49, 95, 105, 110, 105, 116, - 105, 97, 108, 105, 122, 101, 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 26, - 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, - 115, 116, 111, 114, 101, 95, 102, 116, 36, 116, 111, 107, 101, 110, 95, 118, 49, 95, - 109, 105, 110, 116, 95, 97, 110, 100, 95, 115, 116, 111, 114, 101, 95, 110, 102, 116, - 95, 112, 97, 114, 97, 108, 108, 101, 108, 38, 116, 111, 107, 101, 110, 95, 118, 49, - 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, 115, 116, 111, 114, 101, 95, 110, 102, - 116, 95, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 29, 116, 111, 107, 101, 110, - 95, 118, 49, 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, 116, 114, 97, 110, 115, - 102, 101, 114, 95, 102, 116, 39, 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, - 110, 116, 95, 97, 110, 100, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 110, 102, - 116, 95, 112, 97, 114, 97, 108, 108, 101, 108, 41, 116, 111, 107, 101, 110, 95, 118, - 49, 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, 116, 114, 97, 110, 115, 102, 101, - 114, 95, 110, 102, 116, 95, 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 10, 115, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 16, 2, 16, 42, 3, 58, 199, + 1, 4, 129, 2, 12, 5, 141, 2, 205, 2, 7, 218, 4, 185, 6, 8, 147, 11, + 96, 6, 243, 11, 125, 16, 240, 12, 31, 10, 143, 13, 19, 12, 162, 13, 239, 5, + 13, 145, 19, 6, 0, 0, 1, 4, 1, 7, 1, 9, 2, 11, 1, 18, 1, 20, + 1, 25, 0, 1, 8, 0, 1, 3, 6, 0, 2, 6, 4, 2, 3, 1, 0, 1, + 3, 8, 7, 1, 0, 0, 4, 10, 4, 0, 4, 13, 7, 0, 5, 17, 7, 0, + 4, 24, 7, 0, 4, 38, 7, 0, 0, 14, 0, 1, 0, 1, 1, 15, 3, 1, + 0, 1, 0, 16, 4, 5, 0, 1, 5, 19, 6, 2, 0, 1, 6, 21, 8, 5, + 1, 0, 1, 5, 22, 9, 2, 0, 1, 0, 23, 10, 11, 0, 1, 7, 26, 12, + 0, 0, 1, 1, 27, 0, 7, 0, 1, 5, 28, 13, 5, 0, 1, 0, 29, 14, + 15, 0, 1, 4, 30, 16, 17, 0, 1, 0, 31, 0, 11, 0, 1, 4, 32, 19, + 20, 0, 1, 3, 33, 21, 22, 1, 0, 1, 0, 34, 24, 2, 0, 1, 3, 35, + 22, 26, 1, 0, 1, 2, 36, 28, 2, 2, 3, 0, 1, 4, 37, 30, 31, 0, + 1, 4, 39, 32, 15, 0, 1, 0, 40, 12, 2, 0, 1, 1, 41, 35, 36, 0, + 1, 4, 42, 37, 2, 0, 1, 2, 43, 2, 38, 2, 3, 4, 1, 0, 44, 10, + 2, 0, 1, 4, 45, 40, 25, 0, 1, 0, 46, 10, 2, 0, 1, 0, 47, 10, + 2, 0, 1, 0, 48, 10, 2, 0, 1, 4, 49, 43, 2, 0, 1, 0, 50, 10, + 2, 0, 1, 0, 51, 10, 2, 0, 1, 4, 7, 4, 0, 14, 7, 16, 25, 17, + 27, 23, 27, 1, 5, 1, 12, 0, 1, 6, 8, 1, 2, 8, 6, 3, 1, 8, + 6, 2, 7, 8, 6, 10, 2, 1, 3, 1, 6, 9, 0, 2, 7, 8, 6, 8, + 6, 2, 6, 12, 5, 2, 12, 8, 7, 1, 6, 12, 1, 10, 2, 4, 6, 12, + 8, 6, 8, 6, 3, 1, 8, 5, 3, 6, 12, 8, 5, 3, 1, 8, 7, 8, + 12, 5, 8, 6, 3, 8, 6, 8, 5, 8, 7, 12, 2, 5, 8, 6, 1, 11, + 3, 1, 3, 1, 7, 11, 3, 1, 9, 0, 1, 9, 0, 9, 12, 11, 3, 1, + 3, 3, 8, 6, 8, 6, 6, 12, 8, 5, 8, 7, 12, 3, 5, 5, 8, 4, + 1, 8, 4, 1, 11, 3, 1, 9, 0, 2, 5, 11, 3, 1, 8, 4, 3, 7, + 11, 2, 2, 9, 0, 9, 1, 9, 0, 9, 1, 2, 11, 3, 1, 8, 4, 7, + 11, 2, 2, 5, 11, 3, 1, 8, 4, 1, 6, 10, 1, 1, 8, 8, 13, 6, + 12, 8, 6, 8, 6, 8, 6, 3, 8, 6, 5, 3, 3, 8, 8, 10, 8, 6, + 10, 10, 2, 10, 8, 6, 10, 10, 1, 8, 8, 10, 8, 6, 10, 10, 2, 10, + 8, 6, 3, 3, 5, 8, 6, 8, 6, 1, 2, 2, 6, 12, 10, 2, 2, 12, + 8, 1, 6, 6, 12, 8, 6, 8, 6, 8, 6, 3, 10, 1, 1, 11, 2, 2, + 9, 0, 9, 1, 12, 6, 12, 10, 2, 8, 1, 12, 8, 6, 8, 6, 8, 6, + 10, 1, 3, 8, 5, 11, 2, 2, 5, 11, 3, 1, 8, 4, 8, 0, 3, 6, + 12, 8, 7, 3, 6, 12, 6, 12, 3, 8, 5, 8, 7, 8, 4, 5, 8, 7, + 12, 3, 6, 12, 8, 4, 4, 6, 12, 6, 12, 8, 7, 3, 5, 12, 6, 12, + 3, 8, 5, 8, 7, 4, 8, 7, 12, 3, 6, 12, 8, 116, 111, 107, 101, 110, + 95, 118, 49, 12, 77, 105, 110, 116, 101, 114, 67, 111, 110, 102, 105, 103, 10, 115, 105, 103, 110, 101, 114, 95, 99, 97, 112, 16, 83, 105, 103, 110, 101, 114, 67, 97, - 112, 97, 98, 105, 108, 105, 116, 121, 13, 109, 105, 110, 116, 101, 100, 95, 116, 111, - 107, 101, 110, 115, 5, 84, 97, 98, 108, 101, 6, 79, 112, 116, 105, 111, 110, 12, - 116, 111, 107, 101, 110, 100, 97, 116, 97, 95, 105, 100, 11, 97, 112, 112, 101, 110, - 100, 95, 117, 116, 102, 56, 9, 116, 111, 95, 115, 116, 114, 105, 110, 103, 6, 97, - 112, 112, 101, 110, 100, 29, 99, 114, 101, 97, 116, 101, 95, 115, 105, 103, 110, 101, - 114, 95, 119, 105, 116, 104, 95, 99, 97, 112, 97, 98, 105, 108, 105, 116, 121, 10, - 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 19, 103, 101, 116, 95, 115, 101, 113, - 117, 101, 110, 99, 101, 95, 110, 117, 109, 98, 101, 114, 4, 117, 116, 102, 56, 10, - 109, 105, 110, 116, 95, 116, 111, 107, 101, 110, 21, 103, 101, 116, 95, 99, 111, 108, + 112, 97, 98, 105, 108, 105, 116, 121, 7, 97, 99, 99, 111, 117, 110, 116, 13, 109, + 105, 110, 116, 101, 100, 95, 116, 111, 107, 101, 110, 115, 5, 84, 97, 98, 108, 101, + 5, 116, 97, 98, 108, 101, 6, 79, 112, 116, 105, 111, 110, 6, 111, 112, 116, 105, + 111, 110, 5, 84, 111, 107, 101, 110, 5, 116, 111, 107, 101, 110, 12, 116, 111, 107, + 101, 110, 100, 97, 116, 97, 95, 105, 100, 11, 84, 111, 107, 101, 110, 68, 97, 116, + 97, 73, 100, 10, 103, 101, 116, 95, 115, 105, 103, 110, 101, 114, 29, 99, 114, 101, + 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 95, 119, 105, 116, 104, 95, 99, 97, + 112, 97, 98, 105, 108, 105, 116, 121, 16, 98, 117, 105, 108, 100, 95, 116, 111, 107, + 101, 110, 95, 110, 97, 109, 101, 6, 83, 116, 114, 105, 110, 103, 6, 115, 116, 114, + 105, 110, 103, 11, 97, 112, 112, 101, 110, 100, 95, 117, 116, 102, 56, 12, 115, 116, + 114, 105, 110, 103, 95, 117, 116, 105, 108, 115, 9, 116, 111, 95, 115, 116, 114, 105, + 110, 103, 6, 97, 112, 112, 101, 110, 100, 17, 109, 105, 110, 116, 95, 110, 102, 116, + 95, 112, 97, 114, 97, 108, 108, 101, 108, 7, 84, 111, 107, 101, 110, 73, 100, 6, + 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 19, + 103, 101, 116, 95, 115, 101, 113, 117, 101, 110, 99, 101, 95, 110, 117, 109, 98, 101, + 114, 4, 117, 116, 102, 56, 26, 116, 111, 107, 101, 110, 95, 118, 49, 95, 99, 114, + 101, 97, 116, 101, 95, 116, 111, 107, 101, 110, 95, 100, 97, 116, 97, 10, 109, 105, + 110, 116, 95, 116, 111, 107, 101, 110, 19, 109, 105, 110, 116, 95, 110, 102, 116, 95, + 115, 101, 113, 117, 101, 110, 116, 105, 97, 108, 21, 103, 101, 116, 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 95, 115, 117, 112, 112, 108, 121, 7, 101, 120, 116, - 114, 97, 99, 116, 4, 115, 111, 109, 101, 3, 97, 100, 100, 21, 84, 111, 107, 101, - 110, 77, 117, 116, 97, 98, 105, 108, 105, 116, 121, 67, 111, 110, 102, 105, 103, 30, - 99, 114, 101, 97, 116, 101, 95, 116, 111, 107, 101, 110, 95, 109, 117, 116, 97, 98, - 105, 108, 105, 116, 121, 95, 99, 111, 110, 102, 105, 103, 16, 99, 114, 101, 97, 116, - 101, 95, 116, 111, 107, 101, 110, 100, 97, 116, 97, 23, 99, 114, 101, 97, 116, 101, - 95, 114, 101, 115, 111, 117, 114, 99, 101, 95, 97, 99, 99, 111, 117, 110, 116, 17, - 99, 114, 101, 97, 116, 101, 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 3, - 110, 101, 119, 14, 119, 105, 116, 104, 100, 114, 97, 119, 95, 116, 111, 107, 101, 110, - 15, 100, 105, 114, 101, 99, 116, 95, 116, 114, 97, 110, 115, 102, 101, 114, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, + 114, 97, 99, 116, 16, 115, 101, 116, 95, 116, 111, 107, 101, 110, 95, 109, 105, 110, + 116, 101, 100, 4, 115, 111, 109, 101, 3, 97, 100, 100, 30, 99, 114, 101, 97, 116, + 101, 95, 116, 111, 107, 101, 110, 95, 109, 117, 116, 97, 98, 105, 108, 105, 116, 121, + 95, 99, 111, 110, 102, 105, 103, 21, 84, 111, 107, 101, 110, 77, 117, 116, 97, 98, + 105, 108, 105, 116, 121, 67, 111, 110, 102, 105, 103, 16, 99, 114, 101, 97, 116, 101, + 95, 116, 111, 107, 101, 110, 100, 97, 116, 97, 30, 116, 111, 107, 101, 110, 95, 118, + 49, 95, 105, 110, 105, 116, 105, 97, 108, 105, 122, 101, 95, 99, 111, 108, 108, 101, + 99, 116, 105, 111, 110, 23, 99, 114, 101, 97, 116, 101, 95, 114, 101, 115, 111, 117, + 114, 99, 101, 95, 97, 99, 99, 111, 117, 110, 116, 17, 99, 114, 101, 97, 116, 101, + 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 3, 110, 101, 119, 26, 116, 111, + 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, 115, 116, + 111, 114, 101, 95, 102, 116, 14, 119, 105, 116, 104, 100, 114, 97, 119, 95, 116, 111, + 107, 101, 110, 36, 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, 95, + 97, 110, 100, 95, 115, 116, 111, 114, 101, 95, 110, 102, 116, 95, 112, 97, 114, 97, + 108, 108, 101, 108, 38, 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, + 95, 97, 110, 100, 95, 115, 116, 111, 114, 101, 95, 110, 102, 116, 95, 115, 101, 113, + 117, 101, 110, 116, 105, 97, 108, 29, 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, + 105, 110, 116, 95, 97, 110, 100, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 102, + 116, 15, 100, 105, 114, 101, 99, 116, 95, 116, 114, 97, 110, 115, 102, 101, 114, 39, + 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, 95, 97, 110, 100, 95, + 116, 114, 97, 110, 115, 102, 101, 114, 95, 110, 102, 116, 95, 112, 97, 114, 97, 108, + 108, 101, 108, 41, 116, 111, 107, 101, 110, 95, 118, 49, 95, 109, 105, 110, 116, 95, + 97, 110, 100, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 110, 102, 116, 95, 115, + 101, 113, 117, 101, 110, 116, 105, 97, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 171, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3, 10, 2, 30, 29, 65, 110, 32, 78, 70, 84, 32, 67, 111, 108, - 108, 101, 99, 116, 105, 111, 110, 32, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, - 110, 10, 2, 23, 22, 65, 110, 32, 78, 70, 84, 32, 67, 111, 108, 108, 101, 99, - 116, 105, 111, 110, 32, 78, 97, 109, 101, 10, 2, 1, 0, 3, 8, 100, 0, 0, - 0, 0, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 10, 2, 16, - 15, 78, 70, 84, 32, 67, 111, 108, 108, 101, 99, 116, 105, 98, 108, 101, 10, 2, - 18, 17, 104, 116, 116, 112, 115, 58, 47, 47, 97, 112, 116, 111, 115, 46, 100, 101, - 118, 10, 2, 3, 2, 32, 35, 10, 1, 6, 5, 1, 1, 1, 1, 1, 10, 10, - 2, 1, 0, 10, 1, 4, 3, 0, 0, 0, 0, 2, 3, 26, 8, 5, 28, 11, - 6, 2, 5, 11, 7, 1, 8, 3, 31, 8, 4, 0, 0, 0, 0, 7, 9, 13, - 0, 7, 7, 17, 13, 13, 0, 14, 1, 56, 0, 17, 15, 11, 0, 2, 1, 0, - 0, 1, 0, 7, 5, 11, 0, 43, 0, 16, 0, 17, 16, 2, 2, 0, 0, 1, - 0, 16, 28, 11, 1, 17, 1, 12, 3, 10, 0, 17, 17, 12, 2, 14, 2, 56, - 1, 11, 0, 17, 17, 17, 18, 17, 0, 12, 5, 14, 3, 7, 6, 17, 19, 11, - 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 5, 12, 6, 14, 3, 11, 6, - 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 20, 12, 4, 11, 3, 11, 4, 2, - 3, 0, 0, 1, 0, 20, 34, 11, 0, 17, 1, 12, 3, 14, 3, 17, 17, 7, - 1, 17, 19, 17, 21, 12, 1, 13, 1, 56, 2, 6, 1, 0, 0, 0, 0, 0, - 0, 0, 22, 12, 2, 7, 5, 17, 19, 11, 2, 17, 0, 12, 6, 14, 3, 7, - 6, 17, 19, 11, 6, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 5, 12, 5, - 14, 3, 11, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 20, 12, 4, 11, - 3, 11, 4, 2, 4, 0, 0, 1, 0, 7, 8, 11, 1, 42, 0, 15, 1, 11, - 0, 11, 2, 56, 3, 56, 4, 2, 5, 0, 0, 0, 29, 29, 7, 1, 17, 19, - 12, 5, 7, 2, 17, 19, 12, 8, 10, 0, 17, 17, 12, 6, 7, 8, 12, 4, - 14, 4, 17, 25, 12, 7, 11, 0, 11, 5, 11, 2, 11, 8, 11, 3, 11, 1, - 11, 6, 7, 3, 7, 4, 11, 7, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 9, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 17, 26, 2, 6, 1, 4, - 0, 33, 36, 10, 0, 64, 34, 0, 0, 0, 0, 0, 0, 0, 0, 17, 27, 12, - 5, 12, 4, 7, 1, 17, 19, 12, 1, 7, 0, 17, 19, 12, 3, 7, 2, 17, - 19, 12, 2, 14, 4, 11, 1, 11, 3, 11, 2, 6, 64, 66, 15, 0, 0, 0, - 0, 0, 7, 10, 17, 28, 14, 4, 7, 6, 17, 19, 7, 5, 17, 19, 6, 64, - 75, 76, 0, 0, 0, 0, 0, 17, 5, 12, 6, 11, 0, 11, 5, 56, 5, 11, - 6, 18, 0, 45, 0, 2, 7, 1, 4, 1, 0, 39, 26, 10, 1, 17, 1, 12, - 2, 14, 2, 12, 3, 10, 1, 43, 0, 16, 2, 20, 12, 6, 10, 3, 11, 6, - 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 20, 12, 5, 11, 3, 11, 5, 6, - 1, 0, 0, 0, 0, 0, 0, 0, 17, 30, 12, 4, 11, 0, 17, 17, 11, 1, - 11, 4, 17, 4, 2, 8, 1, 4, 1, 0, 41, 16, 10, 0, 10, 1, 17, 2, - 12, 4, 12, 2, 14, 2, 11, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, - 30, 12, 3, 11, 0, 17, 17, 11, 1, 11, 3, 17, 4, 2, 9, 1, 4, 1, - 0, 41, 15, 10, 1, 17, 3, 12, 4, 12, 2, 14, 2, 11, 4, 6, 1, 0, - 0, 0, 0, 0, 0, 0, 17, 30, 12, 3, 11, 0, 17, 17, 11, 1, 11, 3, - 17, 4, 2, 10, 1, 4, 1, 0, 42, 21, 10, 1, 17, 1, 12, 2, 14, 2, - 12, 3, 11, 1, 43, 0, 16, 2, 20, 12, 5, 10, 3, 11, 5, 6, 1, 0, - 0, 0, 0, 0, 0, 0, 17, 20, 12, 4, 11, 3, 11, 0, 11, 4, 6, 1, - 0, 0, 0, 0, 0, 0, 0, 17, 31, 2, 11, 1, 4, 1, 0, 5, 11, 10, - 0, 11, 1, 17, 2, 12, 3, 12, 2, 14, 2, 11, 0, 11, 3, 6, 1, 0, - 0, 0, 0, 0, 0, 0, 17, 31, 2, 12, 1, 4, 1, 0, 5, 10, 11, 1, - 17, 3, 12, 3, 12, 2, 14, 2, 11, 0, 11, 3, 6, 1, 0, 0, 0, 0, - 0, 0, 0, 17, 31, 2, 0, 0, 0, 1, 0, 2, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 2, 3, + 2, 32, 35, 10, 2, 18, 17, 104, 116, 116, 112, 115, 58, 47, 47, 97, 112, 116, + 111, 115, 46, 100, 101, 118, 10, 2, 23, 22, 65, 110, 32, 78, 70, 84, 32, 67, + 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 78, 97, 109, 101, 10, 2, 16, 15, + 78, 70, 84, 32, 67, 111, 108, 108, 101, 99, 116, 105, 98, 108, 101, 10, 2, 1, + 0, 10, 1, 6, 5, 1, 1, 1, 1, 1, 10, 2, 30, 29, 65, 110, 32, 78, + 70, 84, 32, 67, 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 68, 101, 115, 99, + 114, 105, 112, 116, 105, 111, 110, 10, 1, 4, 3, 0, 0, 0, 20, 99, 111, 109, + 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, + 0, 3, 50, 46, 48, 3, 50, 46, 49, 0, 2, 3, 2, 8, 1, 5, 11, 2, + 2, 5, 11, 3, 1, 8, 4, 12, 8, 5, 0, 0, 0, 1, 0, 2, 5, 11, + 0, 43, 0, 16, 0, 17, 1, 2, 2, 0, 0, 0, 5, 9, 13, 0, 7, 0, + 17, 3, 13, 0, 14, 1, 56, 0, 17, 5, 11, 0, 2, 6, 0, 0, 1, 0, + 18, 28, 11, 1, 17, 0, 12, 2, 10, 0, 17, 7, 12, 3, 14, 3, 56, 1, + 11, 0, 17, 7, 17, 8, 17, 2, 12, 4, 14, 2, 7, 1, 17, 9, 11, 4, + 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 10, 12, 7, 14, 2, 11, 7, 6, + 1, 0, 0, 0, 0, 0, 0, 0, 17, 11, 12, 8, 11, 2, 11, 8, 2, 12, + 0, 0, 1, 0, 23, 34, 11, 0, 17, 0, 12, 1, 14, 1, 17, 7, 7, 2, + 17, 9, 17, 13, 12, 2, 13, 2, 56, 2, 6, 1, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 7, 3, 17, 9, 11, 3, 17, 2, 12, 4, 14, 1, 7, 1, + 17, 9, 11, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 10, 12, 7, 14, + 1, 11, 7, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 11, 12, 8, 11, 1, + 11, 8, 2, 15, 0, 0, 1, 0, 29, 10, 11, 1, 42, 0, 15, 1, 11, 2, + 56, 3, 12, 3, 11, 0, 11, 3, 56, 4, 2, 10, 0, 0, 0, 33, 35, 7, + 2, 17, 9, 7, 4, 17, 9, 10, 0, 17, 7, 7, 5, 12, 4, 14, 4, 17, + 18, 12, 5, 64, 5, 0, 0, 0, 0, 0, 0, 0, 0, 12, 6, 64, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 12, 7, 64, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 8, 12, 11, 12, 12, 12, 13, 11, 0, 11, 13, 11, 2, 11, 12, 11, + 3, 11, 1, 11, 11, 6, 100, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 5, 11, 6, 11, 7, 11, 8, 17, 19, 2, 20, 1, + 4, 0, 39, 44, 10, 0, 12, 1, 64, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 12, 2, 11, 1, 11, 2, 17, 21, 12, 3, 12, 4, 7, 2, 17, 9, 12, 5, + 7, 6, 17, 9, 12, 6, 7, 4, 17, 9, 12, 7, 14, 4, 11, 5, 11, 6, + 11, 7, 6, 64, 66, 15, 0, 0, 0, 0, 0, 7, 7, 17, 22, 14, 4, 7, + 1, 17, 9, 7, 3, 17, 9, 6, 64, 75, 76, 0, 0, 0, 0, 0, 17, 10, + 12, 10, 56, 5, 12, 11, 11, 3, 11, 11, 11, 10, 18, 0, 12, 12, 11, 0, + 11, 12, 45, 0, 2, 24, 1, 4, 1, 0, 41, 26, 10, 1, 17, 0, 12, 2, + 14, 2, 12, 3, 10, 1, 43, 0, 16, 2, 20, 12, 5, 10, 3, 11, 5, 6, + 1, 0, 0, 0, 0, 0, 0, 0, 17, 11, 12, 6, 11, 3, 11, 6, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 17, 25, 12, 7, 11, 0, 17, 7, 11, 1, 11, + 7, 17, 15, 2, 26, 1, 4, 1, 0, 42, 16, 10, 0, 10, 1, 17, 6, 12, + 2, 12, 3, 14, 3, 11, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 25, + 12, 6, 11, 0, 17, 7, 11, 1, 11, 6, 17, 15, 2, 27, 1, 4, 1, 0, + 42, 15, 10, 1, 17, 12, 12, 2, 12, 3, 14, 3, 11, 2, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 17, 25, 12, 6, 11, 0, 17, 7, 11, 1, 11, 6, 17, + 15, 2, 28, 1, 4, 1, 0, 44, 21, 10, 1, 17, 0, 12, 2, 14, 2, 12, + 3, 11, 1, 43, 0, 16, 2, 20, 12, 5, 10, 3, 11, 5, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 17, 11, 12, 6, 11, 3, 11, 0, 11, 6, 6, 1, 0, + 0, 0, 0, 0, 0, 0, 17, 29, 2, 30, 1, 4, 1, 0, 45, 11, 10, 0, + 11, 1, 17, 6, 12, 2, 12, 3, 14, 3, 11, 0, 11, 2, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 17, 29, 2, 31, 1, 4, 1, 0, 45, 10, 11, 1, 17, + 12, 12, 2, 12, 3, 14, 3, 11, 0, 11, 2, 6, 1, 0, 0, 0, 0, 0, + 0, 0, 17, 29, 2, 0, 0, 0, 1, 0, 2, 0, ] }); @@ -1572,203 +1623,205 @@ pub static PACKAGE_AMBASSADOR_TOKEN_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_AMBASSADOR_TOKEN_AMBASSADOR: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 24, 2, 24, 60, 3, 84, 239, - 1, 4, 195, 2, 18, 5, 213, 2, 241, 2, 7, 198, 5, 189, 8, 8, 131, 14, - 96, 6, 227, 14, 201, 1, 16, 172, 16, 218, 4, 10, 134, 21, 33, 12, 167, 21, - 233, 5, 13, 144, 27, 8, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, - 1, 6, 1, 7, 2, 8, 2, 9, 2, 10, 2, 11, 0, 12, 8, 0, 0, 13, - 8, 0, 0, 14, 6, 0, 3, 15, 7, 1, 0, 1, 6, 18, 7, 0, 11, 33, - 6, 0, 11, 35, 6, 0, 9, 33, 6, 0, 10, 50, 11, 0, 4, 51, 7, 1, - 0, 0, 3, 53, 2, 0, 9, 55, 10, 0, 3, 56, 6, 0, 3, 64, 2, 0, - 0, 16, 0, 1, 0, 0, 17, 2, 1, 0, 0, 19, 0, 3, 0, 0, 20, 2, - 3, 0, 0, 21, 4, 5, 0, 0, 22, 6, 5, 0, 0, 23, 7, 5, 0, 0, - 24, 7, 5, 0, 0, 25, 8, 5, 0, 0, 26, 9, 5, 0, 0, 27, 10, 5, - 0, 0, 28, 8, 5, 0, 0, 29, 11, 5, 0, 0, 30, 12, 5, 0, 0, 31, - 13, 5, 0, 3, 40, 15, 2, 1, 8, 3, 41, 2, 16, 1, 8, 6, 42, 18, - 3, 0, 9, 43, 19, 3, 1, 8, 1, 44, 1, 1, 0, 11, 45, 16, 2, 1, - 8, 5, 46, 7, 2, 0, 1, 47, 1, 1, 0, 9, 21, 21, 5, 0, 11, 21, - 22, 5, 0, 7, 48, 24, 3, 1, 0, 11, 49, 25, 2, 0, 4, 52, 5, 28, - 1, 0, 8, 54, 29, 30, 0, 6, 57, 32, 5, 0, 11, 58, 33, 30, 0, 11, - 59, 34, 30, 0, 3, 60, 35, 36, 0, 3, 61, 35, 37, 0, 11, 62, 35, 38, - 0, 11, 63, 35, 22, 0, 9, 62, 35, 21, 0, 3, 65, 39, 40, 0, 3, 66, - 41, 5, 0, 3, 67, 39, 5, 0, 9, 68, 42, 43, 0, 9, 69, 44, 5, 0, - 9, 70, 45, 5, 1, 2, 2, 71, 48, 5, 1, 6, 9, 72, 50, 5, 1, 2, - 11, 73, 51, 5, 0, 15, 14, 16, 14, 18, 14, 20, 14, 25, 2, 27, 27, 42, - 3, 43, 47, 44, 3, 1, 11, 3, 1, 8, 1, 1, 3, 1, 5, 1, 8, 4, - 2, 6, 12, 11, 3, 1, 8, 1, 0, 2, 6, 12, 6, 12, 1, 6, 12, 5, - 6, 12, 8, 4, 8, 4, 8, 4, 5, 4, 6, 12, 6, 12, 8, 4, 8, 4, - 6, 6, 12, 8, 4, 8, 4, 8, 4, 5, 1, 5, 6, 12, 6, 12, 8, 4, - 8, 4, 8, 4, 3, 6, 12, 11, 3, 1, 8, 1, 3, 2, 11, 3, 1, 8, - 1, 3, 1, 8, 1, 1, 6, 11, 3, 1, 9, 0, 1, 11, 3, 1, 9, 0, - 2, 8, 4, 6, 11, 3, 1, 8, 1, 1, 10, 2, 2, 6, 11, 3, 1, 9, - 0, 6, 8, 4, 4, 8, 6, 6, 12, 8, 7, 6, 11, 3, 1, 8, 1, 1, - 8, 7, 1, 8, 6, 7, 5, 8, 4, 6, 8, 4, 5, 6, 5, 8, 4, 11, - 3, 1, 8, 1, 1, 6, 9, 0, 3, 6, 5, 6, 8, 4, 6, 8, 4, 3, - 8, 4, 8, 4, 8, 4, 1, 8, 8, 1, 11, 9, 1, 9, 0, 5, 6, 12, - 8, 4, 8, 4, 11, 9, 1, 8, 8, 8, 4, 1, 8, 10, 11, 8, 10, 8, - 1, 8, 6, 8, 4, 8, 10, 8, 5, 12, 8, 11, 8, 7, 8, 12, 8, 4, - 2, 7, 8, 4, 8, 4, 7, 6, 12, 8, 4, 8, 4, 8, 4, 8, 4, 11, - 9, 1, 8, 8, 8, 4, 6, 6, 12, 8, 4, 8, 4, 8, 4, 11, 9, 1, - 8, 8, 8, 4, 1, 6, 8, 10, 1, 12, 1, 8, 12, 1, 8, 5, 1, 6, - 8, 12, 1, 8, 13, 2, 8, 13, 5, 3, 10, 8, 4, 10, 8, 4, 10, 10, - 2, 1, 8, 11, 2, 6, 8, 10, 8, 11, 3, 6, 8, 7, 8, 4, 9, 0, - 3, 7, 8, 0, 6, 12, 6, 11, 3, 1, 8, 1, 1, 8, 2, 1, 9, 0, - 7, 10, 2, 10, 2, 8, 4, 6, 8, 7, 6, 8, 1, 10, 2, 8, 4, 3, - 6, 8, 7, 6, 8, 4, 9, 0, 2, 6, 8, 5, 8, 4, 10, 97, 109, 98, - 97, 115, 115, 97, 100, 111, 114, 5, 101, 114, 114, 111, 114, 5, 101, 118, 101, 110, - 116, 6, 111, 98, 106, 101, 99, 116, 6, 111, 112, 116, 105, 111, 110, 6, 115, 105, - 103, 110, 101, 114, 6, 115, 116, 114, 105, 110, 103, 12, 115, 116, 114, 105, 110, 103, - 95, 117, 116, 105, 108, 115, 10, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 12, - 112, 114, 111, 112, 101, 114, 116, 121, 95, 109, 97, 112, 7, 114, 111, 121, 97, 108, - 116, 121, 5, 116, 111, 107, 101, 110, 15, 65, 109, 98, 97, 115, 115, 97, 100, 111, - 114, 76, 101, 118, 101, 108, 15, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 84, - 111, 107, 101, 110, 11, 76, 101, 118, 101, 108, 85, 112, 100, 97, 116, 101, 6, 79, - 98, 106, 101, 99, 116, 16, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, - 101, 118, 101, 108, 29, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, 101, - 118, 101, 108, 95, 102, 114, 111, 109, 95, 97, 100, 100, 114, 101, 115, 115, 6, 83, - 116, 114, 105, 110, 103, 15, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 114, - 97, 110, 107, 28, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 114, 97, 110, - 107, 95, 102, 114, 111, 109, 95, 97, 100, 100, 114, 101, 115, 115, 4, 98, 117, 114, - 110, 18, 98, 117, 114, 110, 95, 110, 97, 109, 101, 100, 95, 98, 121, 95, 117, 115, - 101, 114, 28, 99, 114, 101, 97, 116, 101, 95, 97, 109, 98, 97, 115, 115, 97, 100, - 111, 114, 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 11, 105, 110, 105, 116, - 95, 109, 111, 100, 117, 108, 101, 21, 109, 105, 110, 116, 95, 97, 109, 98, 97, 115, - 115, 97, 100, 111, 114, 95, 116, 111, 107, 101, 110, 29, 109, 105, 110, 116, 95, 97, - 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 116, 111, 107, 101, 110, 95, 98, 121, - 95, 117, 115, 101, 114, 26, 109, 105, 110, 116, 95, 97, 109, 98, 97, 115, 115, 97, - 100, 111, 114, 95, 116, 111, 107, 101, 110, 95, 105, 109, 112, 108, 30, 109, 105, 110, - 116, 95, 110, 117, 109, 98, 101, 114, 101, 100, 95, 97, 109, 98, 97, 115, 115, 97, - 100, 111, 114, 95, 116, 111, 107, 101, 110, 38, 109, 105, 110, 116, 95, 110, 117, 109, - 98, 101, 114, 101, 100, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 116, - 111, 107, 101, 110, 95, 98, 121, 95, 117, 115, 101, 114, 20, 115, 101, 116, 95, 97, - 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, 101, 118, 101, 108, 22, 117, 112, - 100, 97, 116, 101, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 114, 97, - 110, 107, 11, 109, 117, 116, 97, 116, 111, 114, 95, 114, 101, 102, 10, 77, 117, 116, - 97, 116, 111, 114, 82, 101, 102, 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, - 117, 114, 110, 82, 101, 102, 20, 112, 114, 111, 112, 101, 114, 116, 121, 95, 109, 117, - 116, 97, 116, 111, 114, 95, 114, 101, 102, 8, 98, 97, 115, 101, 95, 117, 114, 105, - 9, 111, 108, 100, 95, 108, 101, 118, 101, 108, 9, 110, 101, 119, 95, 108, 101, 118, - 101, 108, 14, 111, 98, 106, 101, 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, 17, - 97, 100, 100, 114, 101, 115, 115, 95, 116, 111, 95, 111, 98, 106, 101, 99, 116, 4, - 117, 116, 102, 56, 11, 114, 101, 97, 100, 95, 115, 116, 114, 105, 110, 103, 9, 110, - 111, 116, 95, 102, 111, 117, 110, 100, 7, 99, 114, 101, 97, 116, 111, 114, 10, 97, - 100, 100, 114, 101, 115, 115, 95, 111, 102, 17, 112, 101, 114, 109, 105, 115, 115, 105, - 111, 110, 95, 100, 101, 110, 105, 101, 100, 9, 116, 111, 95, 115, 116, 114, 105, 110, - 103, 20, 99, 114, 101, 97, 116, 101, 95, 116, 111, 107, 101, 110, 95, 97, 100, 100, - 114, 101, 115, 115, 7, 82, 111, 121, 97, 108, 116, 121, 6, 79, 112, 116, 105, 111, - 110, 4, 110, 111, 110, 101, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, 111, 114, - 82, 101, 102, 27, 99, 114, 101, 97, 116, 101, 95, 117, 110, 108, 105, 109, 105, 116, - 101, 100, 95, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 11, 80, 114, 111, 112, - 101, 114, 116, 121, 77, 97, 112, 11, 84, 114, 97, 110, 115, 102, 101, 114, 82, 101, - 102, 6, 97, 112, 112, 101, 110, 100, 21, 99, 114, 101, 97, 116, 101, 95, 110, 117, - 109, 98, 101, 114, 101, 100, 95, 116, 111, 107, 101, 110, 18, 99, 114, 101, 97, 116, - 101, 95, 110, 97, 109, 101, 100, 95, 116, 111, 107, 101, 110, 15, 103, 101, 110, 101, - 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 21, 103, 101, 110, 101, 114, 97, - 116, 101, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, 20, 103, 101, - 110, 101, 114, 97, 116, 101, 95, 109, 117, 116, 97, 116, 111, 114, 95, 114, 101, 102, - 17, 103, 101, 110, 101, 114, 97, 116, 101, 95, 98, 117, 114, 110, 95, 114, 101, 102, - 17, 76, 105, 110, 101, 97, 114, 84, 114, 97, 110, 115, 102, 101, 114, 82, 101, 102, - 28, 103, 101, 110, 101, 114, 97, 116, 101, 95, 108, 105, 110, 101, 97, 114, 95, 116, - 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, 102, 17, 116, 114, 97, 110, 115, 102, - 101, 114, 95, 119, 105, 116, 104, 95, 114, 101, 102, 24, 100, 105, 115, 97, 98, 108, - 101, 95, 117, 110, 103, 97, 116, 101, 100, 95, 116, 114, 97, 110, 115, 102, 101, 114, - 13, 112, 114, 101, 112, 97, 114, 101, 95, 105, 110, 112, 117, 116, 4, 105, 110, 105, - 116, 9, 97, 100, 100, 95, 116, 121, 112, 101, 100, 4, 101, 109, 105, 116, 12, 117, - 112, 100, 97, 116, 101, 95, 116, 121, 112, 101, 100, 7, 115, 101, 116, 95, 117, 114, - 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 254, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 24, 2, 24, 60, 3, 84, 157, + 2, 4, 241, 2, 18, 5, 131, 3, 236, 2, 7, 239, 5, 189, 8, 8, 172, 14, + 96, 6, 140, 15, 136, 1, 16, 148, 16, 249, 4, 10, 141, 21, 33, 12, 174, 21, + 129, 6, 13, 175, 27, 8, 0, 0, 1, 6, 1, 10, 2, 13, 2, 16, 2, 22, + 2, 24, 2, 34, 1, 39, 2, 40, 1, 43, 2, 69, 0, 1, 8, 0, 0, 3, + 8, 0, 1, 5, 6, 0, 1, 8, 6, 0, 2, 5, 6, 0, 3, 12, 7, 0, + 0, 14, 6, 0, 4, 15, 7, 1, 0, 1, 8, 38, 11, 0, 9, 42, 7, 1, + 0, 0, 4, 45, 2, 0, 4, 54, 6, 0, 4, 58, 2, 0, 2, 62, 10, 0, + 0, 19, 0, 1, 0, 1, 4, 20, 3, 4, 1, 8, 1, 1, 21, 5, 4, 1, + 8, 1, 5, 23, 6, 4, 0, 1, 2, 19, 7, 1, 0, 1, 1, 19, 8, 1, + 0, 1, 6, 25, 9, 9, 0, 1, 6, 26, 9, 9, 0, 1, 0, 2, 11, 9, + 0, 1, 0, 27, 4, 9, 0, 1, 4, 28, 4, 5, 1, 8, 1, 0, 29, 11, + 12, 0, 1, 3, 30, 13, 12, 0, 1, 2, 31, 14, 12, 1, 8, 1, 0, 32, + 4, 12, 0, 1, 0, 33, 15, 1, 0, 1, 7, 35, 16, 12, 1, 0, 1, 1, + 36, 17, 4, 0, 1, 0, 37, 6, 1, 0, 1, 9, 41, 1, 20, 1, 0, 1, + 10, 44, 21, 22, 0, 1, 0, 46, 6, 1, 0, 1, 0, 47, 24, 1, 0, 1, + 0, 48, 25, 1, 0, 1, 0, 49, 27, 1, 0, 1, 3, 50, 29, 1, 0, 1, + 1, 51, 30, 22, 0, 1, 4, 52, 31, 32, 0, 1, 4, 53, 31, 33, 0, 1, + 1, 55, 31, 34, 0, 1, 1, 56, 31, 8, 0, 1, 2, 55, 31, 7, 0, 1, + 4, 57, 35, 36, 0, 1, 4, 59, 37, 1, 0, 1, 4, 60, 35, 1, 0, 1, + 2, 61, 38, 39, 0, 1, 2, 63, 40, 1, 0, 1, 2, 64, 41, 1, 1, 2, + 1, 1, 65, 42, 22, 0, 1, 0, 66, 24, 1, 0, 1, 0, 67, 44, 1, 0, + 1, 0, 68, 45, 1, 0, 1, 11, 70, 47, 1, 1, 6, 1, 0, 71, 48, 1, + 0, 1, 2, 72, 50, 1, 1, 2, 1, 1, 73, 51, 1, 0, 1, 1, 2, 2, + 2, 10, 2, 13, 2, 16, 4, 19, 19, 37, 12, 42, 46, 44, 12, 2, 6, 12, + 11, 7, 1, 8, 1, 0, 1, 8, 1, 1, 6, 11, 7, 1, 9, 0, 1, 5, + 1, 11, 7, 1, 9, 0, 1, 6, 12, 1, 8, 4, 1, 8, 3, 1, 3, 1, + 6, 11, 7, 1, 8, 1, 1, 11, 7, 1, 8, 1, 1, 8, 5, 1, 10, 2, + 2, 6, 11, 7, 1, 9, 0, 6, 8, 5, 2, 6, 12, 6, 12, 1, 6, 9, + 0, 3, 6, 5, 6, 8, 5, 6, 8, 5, 5, 8, 5, 5, 5, 8, 5, 11, + 7, 1, 8, 1, 1, 8, 8, 1, 11, 9, 1, 9, 0, 5, 6, 12, 8, 5, + 8, 5, 11, 9, 1, 8, 8, 8, 5, 1, 8, 10, 4, 8, 5, 11, 9, 1, + 8, 8, 8, 5, 8, 5, 5, 6, 12, 8, 5, 8, 5, 8, 5, 5, 6, 6, + 12, 8, 5, 8, 5, 8, 5, 5, 1, 1, 1, 4, 6, 12, 6, 12, 8, 5, + 8, 5, 2, 5, 8, 5, 2, 7, 8, 5, 8, 5, 7, 6, 12, 8, 5, 8, + 5, 8, 5, 8, 5, 11, 9, 1, 8, 8, 8, 5, 1, 6, 8, 10, 1, 12, + 1, 8, 11, 1, 8, 2, 1, 6, 8, 11, 1, 8, 12, 2, 8, 12, 5, 3, + 10, 8, 5, 10, 8, 5, 10, 10, 2, 1, 8, 13, 2, 6, 8, 10, 8, 13, + 3, 6, 8, 4, 8, 5, 9, 0, 6, 6, 12, 8, 5, 8, 5, 8, 5, 11, + 9, 1, 8, 8, 8, 5, 14, 8, 5, 8, 5, 6, 12, 8, 5, 8, 5, 8, + 5, 11, 9, 1, 8, 8, 8, 5, 8, 10, 12, 8, 11, 8, 4, 8, 13, 8, + 1, 5, 6, 12, 6, 12, 8, 5, 8, 5, 8, 5, 3, 6, 12, 11, 7, 1, + 8, 1, 3, 1, 8, 6, 1, 9, 0, 2, 11, 7, 1, 8, 1, 3, 4, 6, + 11, 7, 1, 8, 1, 7, 8, 0, 3, 7, 3, 3, 6, 8, 4, 6, 8, 5, + 9, 0, 2, 6, 8, 2, 8, 5, 5, 3, 10, 2, 6, 8, 1, 8, 5, 8, + 5, 10, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 15, 65, 109, 98, 97, 115, + 115, 97, 100, 111, 114, 76, 101, 118, 101, 108, 16, 97, 109, 98, 97, 115, 115, 97, + 100, 111, 114, 95, 108, 101, 118, 101, 108, 15, 65, 109, 98, 97, 115, 115, 97, 100, + 111, 114, 84, 111, 107, 101, 110, 11, 109, 117, 116, 97, 116, 111, 114, 95, 114, 101, + 102, 10, 77, 117, 116, 97, 116, 111, 114, 82, 101, 102, 5, 116, 111, 107, 101, 110, + 8, 98, 117, 114, 110, 95, 114, 101, 102, 7, 66, 117, 114, 110, 82, 101, 102, 20, + 112, 114, 111, 112, 101, 114, 116, 121, 95, 109, 117, 116, 97, 116, 111, 114, 95, 114, + 101, 102, 12, 112, 114, 111, 112, 101, 114, 116, 121, 95, 109, 97, 112, 8, 98, 97, + 115, 101, 95, 117, 114, 105, 6, 83, 116, 114, 105, 110, 103, 6, 115, 116, 114, 105, + 110, 103, 11, 76, 101, 118, 101, 108, 85, 112, 100, 97, 116, 101, 6, 79, 98, 106, + 101, 99, 116, 6, 111, 98, 106, 101, 99, 116, 9, 111, 108, 100, 95, 108, 101, 118, + 101, 108, 9, 110, 101, 119, 95, 108, 101, 118, 101, 108, 4, 98, 117, 114, 110, 14, + 111, 98, 106, 101, 99, 116, 95, 97, 100, 100, 114, 101, 115, 115, 7, 99, 114, 101, + 97, 116, 111, 114, 6, 115, 105, 103, 110, 101, 114, 10, 97, 100, 100, 114, 101, 115, + 115, 95, 111, 102, 5, 101, 114, 114, 111, 114, 17, 112, 101, 114, 109, 105, 115, 115, + 105, 111, 110, 95, 100, 101, 110, 105, 101, 100, 9, 110, 111, 116, 95, 102, 111, 117, + 110, 100, 29, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, 101, 118, 101, + 108, 95, 102, 114, 111, 109, 95, 97, 100, 100, 114, 101, 115, 115, 17, 97, 100, 100, + 114, 101, 115, 115, 95, 116, 111, 95, 111, 98, 106, 101, 99, 116, 15, 97, 109, 98, + 97, 115, 115, 97, 100, 111, 114, 95, 114, 97, 110, 107, 4, 117, 116, 102, 56, 11, + 114, 101, 97, 100, 95, 115, 116, 114, 105, 110, 103, 28, 97, 109, 98, 97, 115, 115, + 97, 100, 111, 114, 95, 114, 97, 110, 107, 95, 102, 114, 111, 109, 95, 97, 100, 100, + 114, 101, 115, 115, 18, 98, 117, 114, 110, 95, 110, 97, 109, 101, 100, 95, 98, 121, + 95, 117, 115, 101, 114, 12, 115, 116, 114, 105, 110, 103, 95, 117, 116, 105, 108, 115, + 9, 116, 111, 95, 115, 116, 114, 105, 110, 103, 20, 99, 114, 101, 97, 116, 101, 95, + 116, 111, 107, 101, 110, 95, 97, 100, 100, 114, 101, 115, 115, 28, 99, 114, 101, 97, + 116, 101, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 99, 111, 108, 108, + 101, 99, 116, 105, 111, 110, 7, 82, 111, 121, 97, 108, 116, 121, 7, 114, 111, 121, + 97, 108, 116, 121, 6, 111, 112, 116, 105, 111, 110, 4, 110, 111, 110, 101, 6, 79, + 112, 116, 105, 111, 110, 10, 99, 111, 108, 108, 101, 99, 116, 105, 111, 110, 27, 99, + 114, 101, 97, 116, 101, 95, 117, 110, 108, 105, 109, 105, 116, 101, 100, 95, 99, 111, + 108, 108, 101, 99, 116, 105, 111, 110, 14, 67, 111, 110, 115, 116, 114, 117, 99, 116, + 111, 114, 82, 101, 102, 11, 105, 110, 105, 116, 95, 109, 111, 100, 117, 108, 101, 21, + 109, 105, 110, 116, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 116, 111, + 107, 101, 110, 26, 109, 105, 110, 116, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, + 114, 95, 116, 111, 107, 101, 110, 95, 105, 109, 112, 108, 29, 109, 105, 110, 116, 95, + 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 116, 111, 107, 101, 110, 95, 98, + 121, 95, 117, 115, 101, 114, 6, 97, 112, 112, 101, 110, 100, 21, 99, 114, 101, 97, + 116, 101, 95, 110, 117, 109, 98, 101, 114, 101, 100, 95, 116, 111, 107, 101, 110, 15, + 103, 101, 110, 101, 114, 97, 116, 101, 95, 115, 105, 103, 110, 101, 114, 21, 103, 101, + 110, 101, 114, 97, 116, 101, 95, 116, 114, 97, 110, 115, 102, 101, 114, 95, 114, 101, + 102, 11, 84, 114, 97, 110, 115, 102, 101, 114, 82, 101, 102, 20, 103, 101, 110, 101, + 114, 97, 116, 101, 95, 109, 117, 116, 97, 116, 111, 114, 95, 114, 101, 102, 17, 103, + 101, 110, 101, 114, 97, 116, 101, 95, 98, 117, 114, 110, 95, 114, 101, 102, 28, 103, + 101, 110, 101, 114, 97, 116, 101, 95, 108, 105, 110, 101, 97, 114, 95, 116, 114, 97, + 110, 115, 102, 101, 114, 95, 114, 101, 102, 17, 76, 105, 110, 101, 97, 114, 84, 114, + 97, 110, 115, 102, 101, 114, 82, 101, 102, 17, 116, 114, 97, 110, 115, 102, 101, 114, + 95, 119, 105, 116, 104, 95, 114, 101, 102, 24, 100, 105, 115, 97, 98, 108, 101, 95, + 117, 110, 103, 97, 116, 101, 100, 95, 116, 114, 97, 110, 115, 102, 101, 114, 13, 112, + 114, 101, 112, 97, 114, 101, 95, 105, 110, 112, 117, 116, 11, 80, 114, 111, 112, 101, + 114, 116, 121, 77, 97, 112, 4, 105, 110, 105, 116, 9, 97, 100, 100, 95, 116, 121, + 112, 101, 100, 18, 99, 114, 101, 97, 116, 101, 95, 110, 97, 109, 101, 100, 95, 116, + 111, 107, 101, 110, 30, 109, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 101, 100, + 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 116, 111, 107, 101, 110, 38, + 109, 105, 110, 116, 95, 110, 117, 109, 98, 101, 114, 101, 100, 95, 97, 109, 98, 97, + 115, 115, 97, 100, 111, 114, 95, 116, 111, 107, 101, 110, 95, 98, 121, 95, 117, 115, + 101, 114, 20, 115, 101, 116, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, + 108, 101, 118, 101, 108, 5, 101, 118, 101, 110, 116, 4, 101, 109, 105, 116, 22, 117, + 112, 100, 97, 116, 101, 95, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 114, + 97, 110, 107, 12, 117, 112, 100, 97, 116, 101, 95, 116, 121, 112, 101, 100, 7, 115, + 101, 116, 95, 117, 114, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 202, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 10, 2, 34, 33, 65, 109, 98, 97, 115, 115, 97, - 100, 111, 114, 32, 67, 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 68, 101, 115, - 99, 114, 105, 112, 116, 105, 111, 110, 10, 2, 27, 26, 65, 109, 98, 97, 115, 115, - 97, 100, 111, 114, 32, 67, 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 78, 97, - 109, 101, 10, 2, 26, 25, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 32, 67, - 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 85, 82, 73, 3, 8, 6, 0, 0, - 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, - 0, 0, 0, 0, 0, 0, 0, 3, 8, 5, 0, 0, 0, 0, 0, 0, 0, 3, - 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, 4, 0, 0, 0, 0, 0, 0, - 0, 10, 2, 7, 6, 66, 114, 111, 110, 122, 101, 10, 2, 5, 4, 71, 111, 108, - 100, 10, 2, 7, 6, 83, 105, 108, 118, 101, 114, 10, 2, 5, 4, 82, 97, 110, - 107, 10, 2, 1, 0, 10, 10, 2, 1, 0, 18, 97, 112, 116, 111, 115, 58, 58, - 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 197, 4, 6, 1, 0, 0, 0, - 0, 0, 0, 0, 21, 69, 84, 79, 75, 69, 78, 95, 68, 79, 69, 83, 95, 78, - 79, 84, 95, 69, 88, 73, 83, 84, 24, 84, 104, 101, 32, 116, 111, 107, 101, 110, - 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 101, 120, 105, 115, 116, 2, 0, 0, - 0, 0, 0, 0, 0, 12, 69, 78, 79, 84, 95, 67, 82, 69, 65, 84, 79, 82, - 38, 84, 104, 101, 32, 112, 114, 111, 118, 105, 100, 101, 100, 32, 115, 105, 103, 110, - 101, 114, 32, 105, 115, 32, 110, 111, 116, 32, 116, 104, 101, 32, 99, 114, 101, 97, - 116, 111, 114, 3, 0, 0, 0, 0, 0, 0, 0, 18, 69, 70, 73, 69, 76, 68, - 95, 78, 79, 84, 95, 77, 85, 84, 65, 66, 76, 69, 38, 65, 116, 116, 101, 109, - 112, 116, 101, 100, 32, 116, 111, 32, 109, 117, 116, 97, 116, 101, 32, 97, 110, 32, - 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 102, 105, 101, 108, 100, 4, 0, 0, - 0, 0, 0, 0, 0, 19, 69, 84, 79, 75, 69, 78, 95, 78, 79, 84, 95, 66, - 85, 82, 78, 65, 66, 76, 69, 38, 65, 116, 116, 101, 109, 112, 116, 101, 100, 32, - 116, 111, 32, 98, 117, 114, 110, 32, 97, 32, 110, 111, 110, 45, 98, 117, 114, 110, - 97, 98, 108, 101, 32, 116, 111, 107, 101, 110, 5, 0, 0, 0, 0, 0, 0, 0, - 23, 69, 80, 82, 79, 80, 69, 82, 84, 73, 69, 83, 95, 78, 79, 84, 95, 77, - 85, 84, 65, 66, 76, 69, 54, 65, 116, 116, 101, 109, 112, 116, 101, 100, 32, 116, - 111, 32, 109, 117, 116, 97, 116, 101, 32, 97, 32, 112, 114, 111, 112, 101, 114, 116, - 121, 32, 109, 97, 112, 32, 116, 104, 97, 116, 32, 105, 115, 32, 110, 111, 116, 32, - 109, 117, 116, 97, 98, 108, 101, 6, 0, 0, 0, 0, 0, 0, 0, 26, 69, 67, - 79, 76, 76, 69, 67, 84, 73, 79, 78, 95, 68, 79, 69, 83, 95, 78, 79, 84, - 95, 69, 88, 73, 83, 84, 0, 3, 11, 76, 101, 118, 101, 108, 85, 112, 100, 97, - 116, 101, 1, 4, 0, 15, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 76, 101, - 118, 101, 108, 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, - 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 15, 65, 109, 98, 97, - 115, 115, 97, 100, 111, 114, 84, 111, 107, 101, 110, 1, 3, 1, 24, 48, 120, 49, - 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, - 111, 117, 112, 4, 15, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 114, 97, - 110, 107, 1, 1, 0, 16, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, - 101, 118, 101, 108, 1, 1, 0, 28, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, - 95, 114, 97, 110, 107, 95, 102, 114, 111, 109, 95, 97, 100, 100, 114, 101, 115, 115, - 1, 1, 0, 29, 97, 109, 98, 97, 115, 115, 97, 100, 111, 114, 95, 108, 101, 118, - 101, 108, 95, 102, 114, 111, 109, 95, 97, 100, 100, 114, 101, 115, 115, 1, 1, 0, - 0, 2, 1, 16, 3, 1, 2, 4, 32, 8, 5, 34, 8, 6, 36, 8, 7, 37, - 8, 4, 2, 2, 3, 11, 11, 3, 1, 8, 1, 38, 3, 39, 3, 0, 1, 0, - 1, 0, 5, 6, 14, 0, 56, 0, 43, 0, 16, 0, 20, 2, 1, 1, 0, 1, - 0, 5, 4, 11, 0, 56, 1, 17, 0, 2, 2, 1, 0, 0, 17, 9, 14, 0, - 12, 2, 7, 12, 17, 17, 12, 1, 11, 2, 14, 1, 56, 2, 2, 3, 1, 0, - 0, 5, 4, 11, 0, 56, 1, 17, 2, 2, 4, 1, 4, 2, 0, 1, 20, 45, - 11, 0, 14, 1, 12, 5, 12, 3, 10, 5, 56, 0, 41, 1, 4, 9, 5, 16, - 11, 5, 1, 11, 3, 1, 7, 7, 17, 19, 39, 11, 5, 20, 56, 3, 11, 3, - 17, 21, 33, 4, 24, 5, 27, 7, 5, 17, 22, 39, 14, 1, 56, 0, 44, 1, - 19, 1, 1, 12, 4, 12, 2, 1, 14, 1, 56, 0, 44, 0, 19, 0, 1, 11, - 4, 17, 23, 11, 2, 17, 24, 2, 5, 1, 4, 2, 0, 1, 23, 26, 7, 1, - 17, 17, 12, 7, 10, 1, 17, 21, 12, 5, 14, 5, 12, 6, 14, 7, 12, 4, - 11, 0, 17, 21, 12, 2, 14, 2, 56, 4, 12, 3, 11, 6, 11, 4, 14, 3, - 17, 26, 56, 1, 12, 8, 11, 1, 11, 8, 17, 4, 2, 6, 0, 0, 0, 26, - 17, 7, 0, 17, 17, 12, 1, 7, 1, 17, 17, 12, 2, 7, 2, 17, 17, 12, - 3, 11, 0, 11, 1, 11, 2, 56, 5, 11, 3, 17, 28, 1, 2, 7, 0, 0, - 0, 5, 3, 11, 0, 17, 6, 2, 8, 1, 4, 0, 5, 8, 11, 0, 11, 1, - 11, 2, 11, 3, 11, 4, 9, 17, 10, 2, 9, 1, 4, 0, 2, 11, 11, 0, - 17, 21, 12, 4, 11, 1, 11, 2, 14, 4, 56, 4, 11, 3, 11, 4, 17, 8, - 2, 10, 0, 0, 0, 31, 81, 7, 1, 17, 17, 12, 9, 10, 3, 12, 16, 13, - 16, 7, 9, 17, 17, 17, 29, 11, 5, 4, 22, 11, 0, 11, 9, 11, 1, 11, - 2, 7, 13, 17, 17, 56, 5, 11, 16, 17, 30, 12, 6, 5, 30, 11, 0, 11, - 9, 11, 1, 11, 2, 56, 5, 11, 16, 17, 31, 12, 6, 11, 6, 12, 10, 14, - 10, 17, 32, 12, 12, 14, 10, 17, 33, 12, 15, 14, 10, 17, 34, 12, 11, 14, - 10, 17, 35, 12, 8, 14, 10, 17, 36, 12, 14, 14, 15, 17, 37, 11, 4, 17, - 38, 14, 15, 17, 39, 14, 12, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, - 45, 0, 64, 3, 0, 0, 0, 0, 0, 0, 0, 0, 64, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 14, 17, 40, 12, 13, 14, 10, 11, 13, 17, 41, 14, 14, - 7, 12, 17, 17, 7, 9, 17, 17, 56, 6, 11, 11, 11, 8, 11, 14, 11, 3, - 18, 1, 12, 7, 14, 12, 11, 7, 45, 1, 2, 11, 1, 4, 0, 5, 8, 11, - 0, 11, 1, 11, 2, 11, 3, 11, 4, 8, 17, 10, 2, 12, 1, 4, 0, 5, - 8, 11, 1, 11, 2, 11, 3, 11, 4, 11, 0, 17, 21, 17, 11, 2, 13, 1, - 4, 2, 0, 1, 46, 46, 11, 0, 14, 1, 12, 5, 12, 4, 10, 5, 56, 0, - 41, 1, 4, 9, 5, 16, 11, 5, 1, 11, 4, 1, 7, 7, 17, 19, 39, 11, - 5, 20, 56, 3, 11, 4, 17, 21, 33, 4, 24, 5, 27, 7, 5, 17, 22, 39, - 14, 1, 56, 0, 42, 0, 12, 3, 10, 1, 10, 3, 16, 0, 20, 10, 2, 18, - 2, 56, 7, 10, 2, 11, 3, 15, 0, 21, 11, 1, 11, 2, 17, 14, 2, 14, - 0, 0, 1, 1, 49, 48, 10, 1, 6, 10, 0, 0, 0, 0, 0, 0, 0, 35, - 4, 7, 7, 9, 12, 3, 5, 18, 11, 1, 6, 20, 0, 0, 0, 0, 0, 0, - 0, 35, 4, 14, 7, 11, 12, 2, 5, 16, 7, 10, 12, 2, 11, 2, 12, 3, - 11, 3, 12, 7, 14, 0, 56, 0, 43, 1, 12, 6, 10, 6, 16, 1, 12, 5, - 7, 12, 17, 17, 12, 4, 11, 5, 14, 4, 10, 7, 17, 17, 56, 8, 10, 6, - 16, 2, 20, 12, 8, 13, 8, 11, 7, 17, 17, 17, 29, 11, 6, 16, 3, 11, - 8, 17, 45, 2, 0, 0, 1, 2, 1, 3, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 2, 5, 4, 82, 97, + 110, 107, 10, 2, 27, 26, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 32, 67, + 111, 108, 108, 101, 99, 116, 105, 111, 110, 32, 78, 97, 109, 101, 10, 2, 34, 33, + 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 32, 67, 111, 108, 108, 101, 99, 116, + 105, 111, 110, 32, 68, 101, 115, 99, 114, 105, 112, 116, 105, 111, 110, 10, 2, 26, + 25, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 32, 67, 111, 108, 108, 101, 99, + 116, 105, 111, 110, 32, 85, 82, 73, 10, 2, 7, 6, 66, 114, 111, 110, 122, 101, + 10, 2, 1, 0, 10, 2, 7, 6, 83, 105, 108, 118, 101, 114, 10, 2, 5, 4, + 71, 111, 108, 100, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, + 101, 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, + 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, + 197, 4, 6, 1, 0, 0, 0, 0, 0, 0, 0, 21, 69, 84, 79, 75, 69, 78, + 95, 68, 79, 69, 83, 95, 78, 79, 84, 95, 69, 88, 73, 83, 84, 24, 84, 104, + 101, 32, 116, 111, 107, 101, 110, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 101, + 120, 105, 115, 116, 2, 0, 0, 0, 0, 0, 0, 0, 12, 69, 78, 79, 84, 95, + 67, 82, 69, 65, 84, 79, 82, 38, 84, 104, 101, 32, 112, 114, 111, 118, 105, 100, + 101, 100, 32, 115, 105, 103, 110, 101, 114, 32, 105, 115, 32, 110, 111, 116, 32, 116, + 104, 101, 32, 99, 114, 101, 97, 116, 111, 114, 3, 0, 0, 0, 0, 0, 0, 0, + 18, 69, 70, 73, 69, 76, 68, 95, 78, 79, 84, 95, 77, 85, 84, 65, 66, 76, + 69, 38, 65, 116, 116, 101, 109, 112, 116, 101, 100, 32, 116, 111, 32, 109, 117, 116, + 97, 116, 101, 32, 97, 110, 32, 105, 109, 109, 117, 116, 97, 98, 108, 101, 32, 102, + 105, 101, 108, 100, 4, 0, 0, 0, 0, 0, 0, 0, 19, 69, 84, 79, 75, 69, + 78, 95, 78, 79, 84, 95, 66, 85, 82, 78, 65, 66, 76, 69, 38, 65, 116, 116, + 101, 109, 112, 116, 101, 100, 32, 116, 111, 32, 98, 117, 114, 110, 32, 97, 32, 110, + 111, 110, 45, 98, 117, 114, 110, 97, 98, 108, 101, 32, 116, 111, 107, 101, 110, 5, + 0, 0, 0, 0, 0, 0, 0, 23, 69, 80, 82, 79, 80, 69, 82, 84, 73, 69, + 83, 95, 78, 79, 84, 95, 77, 85, 84, 65, 66, 76, 69, 54, 65, 116, 116, 101, + 109, 112, 116, 101, 100, 32, 116, 111, 32, 109, 117, 116, 97, 116, 101, 32, 97, 32, + 112, 114, 111, 112, 101, 114, 116, 121, 32, 109, 97, 112, 32, 116, 104, 97, 116, 32, + 105, 115, 32, 110, 111, 116, 32, 109, 117, 116, 97, 98, 108, 101, 6, 0, 0, 0, + 0, 0, 0, 0, 26, 69, 67, 79, 76, 76, 69, 67, 84, 73, 79, 78, 95, 68, + 79, 69, 83, 95, 78, 79, 84, 95, 69, 88, 73, 83, 84, 0, 3, 11, 76, 101, + 118, 101, 108, 85, 112, 100, 97, 116, 101, 1, 4, 0, 15, 65, 109, 98, 97, 115, + 115, 97, 100, 111, 114, 76, 101, 118, 101, 108, 1, 3, 1, 24, 48, 120, 49, 58, + 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, 98, 106, 101, 99, 116, 71, 114, 111, + 117, 112, 15, 65, 109, 98, 97, 115, 115, 97, 100, 111, 114, 84, 111, 107, 101, 110, + 1, 3, 1, 24, 48, 120, 49, 58, 58, 111, 98, 106, 101, 99, 116, 58, 58, 79, + 98, 106, 101, 99, 116, 71, 114, 111, 117, 112, 4, 15, 97, 109, 98, 97, 115, 115, + 97, 100, 111, 114, 95, 114, 97, 110, 107, 1, 1, 0, 16, 97, 109, 98, 97, 115, + 115, 97, 100, 111, 114, 95, 108, 101, 118, 101, 108, 1, 1, 0, 28, 97, 109, 98, + 97, 115, 115, 97, 100, 111, 114, 95, 114, 97, 110, 107, 95, 102, 114, 111, 109, 95, + 97, 100, 100, 114, 101, 115, 115, 1, 1, 0, 29, 97, 109, 98, 97, 115, 115, 97, + 100, 111, 114, 95, 108, 101, 118, 101, 108, 95, 102, 114, 111, 109, 95, 97, 100, 100, + 114, 101, 115, 115, 1, 1, 0, 0, 2, 1, 2, 3, 1, 2, 4, 4, 8, 2, + 7, 8, 3, 9, 8, 4, 11, 8, 5, 6, 2, 3, 6, 11, 7, 1, 8, 1, + 17, 3, 18, 3, 0, 1, 4, 2, 0, 1, 10, 37, 14, 1, 12, 2, 10, 2, + 56, 0, 41, 1, 4, 30, 11, 2, 20, 56, 1, 11, 0, 17, 3, 33, 4, 27, + 14, 1, 56, 0, 44, 1, 19, 1, 1, 14, 1, 56, 0, 44, 0, 19, 0, 1, + 17, 4, 17, 5, 1, 2, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 6, 39, + 11, 0, 1, 11, 2, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 7, 39, + 8, 1, 0, 1, 0, 1, 6, 14, 0, 56, 0, 43, 0, 16, 0, 20, 2, 9, + 1, 0, 1, 0, 1, 4, 11, 0, 56, 2, 17, 8, 2, 11, 1, 0, 0, 12, + 7, 14, 0, 7, 0, 17, 12, 12, 1, 14, 1, 56, 3, 2, 14, 1, 0, 0, + 1, 4, 11, 0, 56, 2, 17, 11, 2, 15, 1, 4, 2, 0, 1, 18, 22, 7, + 1, 17, 12, 12, 2, 10, 1, 17, 3, 12, 3, 14, 3, 14, 2, 11, 0, 17, + 3, 12, 4, 14, 4, 56, 4, 12, 5, 14, 5, 17, 17, 56, 2, 12, 6, 11, + 1, 11, 6, 17, 0, 2, 18, 0, 0, 0, 23, 19, 7, 2, 17, 12, 7, 1, + 17, 12, 7, 3, 17, 12, 12, 1, 56, 5, 12, 2, 12, 3, 12, 4, 11, 0, + 11, 4, 11, 3, 11, 2, 11, 1, 17, 20, 1, 2, 21, 0, 0, 0, 1, 3, + 11, 0, 17, 18, 2, 22, 1, 4, 0, 26, 8, 11, 0, 11, 1, 11, 2, 11, + 3, 11, 4, 9, 17, 23, 2, 24, 1, 4, 0, 28, 13, 11, 0, 17, 3, 12, + 4, 14, 4, 56, 4, 12, 5, 11, 1, 11, 2, 11, 5, 11, 3, 11, 4, 17, + 22, 2, 23, 0, 0, 0, 43, 89, 7, 1, 17, 12, 12, 6, 10, 3, 12, 7, + 13, 7, 7, 4, 17, 12, 17, 25, 11, 5, 4, 78, 11, 0, 12, 8, 11, 6, + 12, 9, 11, 1, 12, 10, 11, 2, 12, 11, 7, 5, 17, 12, 56, 5, 12, 12, + 12, 13, 11, 8, 11, 9, 11, 10, 11, 11, 11, 13, 11, 12, 11, 7, 17, 26, + 12, 14, 14, 14, 17, 27, 12, 15, 14, 14, 17, 28, 12, 16, 14, 14, 17, 29, + 14, 14, 17, 30, 14, 14, 17, 31, 12, 17, 14, 16, 17, 32, 11, 4, 17, 33, + 14, 16, 17, 34, 14, 15, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 45, + 0, 64, 12, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 13, 0, 0, 0, 0, 0, 0, 0, 0, 17, 35, 12, 18, 14, + 14, 11, 18, 17, 36, 14, 17, 7, 0, 17, 12, 7, 4, 17, 12, 56, 6, 11, + 17, 11, 3, 18, 1, 12, 19, 14, 15, 11, 19, 45, 1, 2, 56, 5, 12, 12, + 11, 0, 11, 6, 11, 1, 11, 2, 11, 12, 11, 7, 17, 38, 12, 14, 5, 33, + 39, 1, 4, 0, 26, 8, 11, 0, 11, 1, 11, 2, 11, 3, 11, 4, 8, 17, + 23, 2, 40, 1, 4, 0, 4, 10, 11, 0, 17, 3, 12, 5, 11, 1, 11, 2, + 11, 3, 11, 4, 11, 5, 17, 39, 2, 41, 1, 4, 2, 0, 1, 49, 46, 14, + 1, 12, 3, 10, 3, 56, 0, 41, 1, 4, 39, 11, 3, 20, 56, 1, 11, 0, + 17, 3, 33, 4, 36, 14, 1, 56, 0, 42, 0, 12, 4, 10, 4, 16, 0, 20, + 12, 5, 10, 1, 11, 5, 10, 2, 18, 2, 56, 7, 11, 4, 15, 0, 12, 6, + 10, 2, 11, 6, 21, 11, 1, 11, 2, 17, 43, 2, 6, 2, 0, 0, 0, 0, + 0, 0, 0, 17, 6, 39, 11, 0, 1, 11, 3, 1, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 17, 7, 39, 43, 0, 0, 1, 1, 52, 42, 10, 1, 6, 10, 0, + 0, 0, 0, 0, 0, 0, 35, 4, 32, 7, 4, 12, 3, 14, 0, 56, 0, 43, + 1, 12, 4, 10, 4, 16, 1, 7, 0, 17, 12, 12, 5, 14, 5, 10, 3, 17, + 12, 56, 8, 10, 4, 16, 2, 20, 12, 6, 13, 6, 11, 3, 17, 12, 17, 25, + 11, 4, 16, 3, 11, 6, 17, 45, 2, 11, 1, 6, 20, 0, 0, 0, 0, 0, + 0, 0, 35, 4, 39, 7, 6, 12, 3, 5, 6, 7, 7, 12, 3, 5, 6, 0, + 0, 1, 2, 1, 3, 1, 0, 0, ] }); @@ -1780,11 +1833,11 @@ pub static MODULES_AMBASSADOR_TOKEN: Lazy>> = Lazy::new(|| { vec![ pub static PACKAGE_AGGREGATOR_EXAMPLES_METADATA: Lazy> = Lazy::new(|| { vec![ 19, 65, 103, 103, 114, 101, 103, 97, 116, 111, 114, 32, 101, 120, 97, 109, 112, 108, - 101, 115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 69, 55, 68, 49, 68, 70, - 69, 51, 70, 65, 54, 67, 56, 55, 55, 68, 48, 69, 68, 68, 50, 57, 51, 52, - 54, 55, 67, 49, 51, 49, 53, 53, 51, 50, 52, 57, 56, 49, 53, 48, 67, 68, - 69, 51, 52, 50, 68, 50, 65, 66, 50, 66, 50, 53, 57, 52, 53, 50, 52, 68, - 69, 51, 70, 48, 162, 1, 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 141, 142, + 101, 115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 64, 68, 67, 55, 51, 49, 57, + 51, 57, 49, 54, 57, 50, 56, 54, 56, 57, 49, 55, 68, 67, 56, 51, 68, 70, + 52, 70, 65, 55, 66, 50, 65, 51, 67, 68, 52, 55, 55, 49, 49, 54, 69, 57, + 52, 70, 50, 54, 51, 52, 67, 65, 51, 48, 53, 56, 53, 48, 52, 65, 56, 69, + 69, 53, 51, 70, 162, 1, 31, 139, 8, 0, 0, 0, 0, 0, 2, 255, 141, 142, 65, 10, 195, 32, 16, 69, 247, 158, 66, 220, 215, 244, 2, 93, 72, 105, 46, 208, 101, 8, 101, 170, 83, 145, 24, 21, 71, 218, 64, 233, 221, 171, 41, 201, 186, 204, 108, 62, 255, 61, 248, 67, 2, 61, 129, 197, 145, 5, 152, 145, 159, 184, 80, 214, @@ -1809,56 +1862,59 @@ pub static PACKAGE_AGGREGATOR_EXAMPLES_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_AGGREGATOR_EXAMPLES_COUNTER_WITH_MILESTONE: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 10, 2, 10, 14, 3, 24, 44, - 4, 68, 8, 5, 76, 49, 7, 125, 128, 2, 8, 253, 2, 64, 6, 189, 3, 64, - 16, 253, 3, 132, 1, 10, 129, 5, 17, 12, 146, 5, 164, 1, 13, 182, 6, 6, - 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 0, 5, 8, 0, 0, 6, 6, 0, - 1, 12, 6, 1, 0, 0, 0, 7, 0, 1, 0, 0, 8, 1, 1, 0, 4, 14, - 2, 3, 0, 1, 15, 1, 5, 1, 3, 2, 16, 4, 4, 0, 1, 17, 7, 8, - 1, 0, 1, 18, 9, 8, 1, 0, 3, 19, 11, 1, 1, 6, 3, 4, 5, 4, - 6, 4, 7, 10, 2, 6, 12, 3, 0, 1, 6, 12, 1, 5, 1, 3, 1, 11, - 2, 1, 9, 0, 2, 1, 7, 8, 0, 2, 7, 11, 2, 1, 9, 0, 9, 0, - 1, 1, 2, 6, 11, 2, 1, 9, 0, 9, 0, 1, 8, 1, 1, 9, 0, 22, - 99, 111, 117, 110, 116, 101, 114, 95, 119, 105, 116, 104, 95, 109, 105, 108, 101, 115, - 116, 111, 110, 101, 13, 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 118, 50, - 5, 101, 114, 114, 111, 114, 5, 101, 118, 101, 110, 116, 6, 115, 105, 103, 110, 101, - 114, 16, 77, 105, 108, 101, 115, 116, 111, 110, 101, 67, 111, 117, 110, 116, 101, 114, - 16, 77, 105, 108, 101, 115, 116, 111, 110, 101, 82, 101, 97, 99, 104, 101, 100, 6, - 99, 114, 101, 97, 116, 101, 19, 105, 110, 99, 114, 101, 109, 101, 110, 116, 95, 109, - 105, 108, 101, 115, 116, 111, 110, 101, 14, 110, 101, 120, 116, 95, 109, 105, 108, 101, - 115, 116, 111, 110, 101, 15, 109, 105, 108, 101, 115, 116, 111, 110, 101, 95, 101, 118, - 101, 114, 121, 5, 99, 111, 117, 110, 116, 10, 65, 103, 103, 114, 101, 103, 97, 116, - 111, 114, 9, 109, 105, 108, 101, 115, 116, 111, 110, 101, 10, 97, 100, 100, 114, 101, - 115, 115, 95, 111, 102, 27, 99, 114, 101, 97, 116, 101, 95, 117, 110, 98, 111, 117, - 110, 100, 101, 100, 95, 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 16, 105, 110, - 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 7, 116, 114, 121, - 95, 97, 100, 100, 11, 105, 115, 95, 97, 116, 95, 108, 101, 97, 115, 116, 4, 101, - 109, 105, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 254, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 12, 1, 0, 10, 2, 10, 14, 3, 24, 52, + 4, 76, 8, 5, 84, 60, 7, 144, 1, 128, 2, 8, 144, 3, 64, 6, 208, 3, + 34, 16, 242, 3, 163, 1, 10, 149, 5, 17, 12, 166, 5, 199, 1, 13, 237, 6, + 6, 0, 0, 1, 6, 1, 10, 1, 16, 1, 18, 0, 1, 8, 0, 1, 5, 6, + 1, 0, 0, 0, 7, 6, 0, 0, 9, 0, 1, 0, 1, 2, 11, 2, 3, 0, + 1, 1, 12, 1, 5, 1, 3, 1, 0, 13, 1, 1, 0, 1, 1, 14, 7, 8, + 1, 0, 1, 1, 15, 9, 8, 1, 0, 1, 3, 17, 11, 1, 1, 6, 1, 4, + 19, 4, 4, 0, 1, 2, 4, 4, 4, 5, 4, 6, 10, 2, 6, 12, 3, 0, + 1, 6, 12, 1, 5, 1, 3, 1, 11, 1, 1, 9, 0, 5, 6, 12, 3, 3, + 11, 1, 1, 3, 8, 0, 2, 7, 11, 1, 1, 9, 0, 9, 0, 1, 1, 2, + 6, 11, 1, 1, 9, 0, 9, 0, 1, 8, 2, 1, 9, 0, 2, 7, 8, 0, + 1, 22, 99, 111, 117, 110, 116, 101, 114, 95, 119, 105, 116, 104, 95, 109, 105, 108, + 101, 115, 116, 111, 110, 101, 16, 77, 105, 108, 101, 115, 116, 111, 110, 101, 67, 111, + 117, 110, 116, 101, 114, 14, 110, 101, 120, 116, 95, 109, 105, 108, 101, 115, 116, 111, + 110, 101, 15, 109, 105, 108, 101, 115, 116, 111, 110, 101, 95, 101, 118, 101, 114, 121, + 5, 99, 111, 117, 110, 116, 10, 65, 103, 103, 114, 101, 103, 97, 116, 111, 114, 13, + 97, 103, 103, 114, 101, 103, 97, 116, 111, 114, 95, 118, 50, 16, 77, 105, 108, 101, + 115, 116, 111, 110, 101, 82, 101, 97, 99, 104, 101, 100, 9, 109, 105, 108, 101, 115, + 116, 111, 110, 101, 6, 99, 114, 101, 97, 116, 101, 6, 115, 105, 103, 110, 101, 114, + 10, 97, 100, 100, 114, 101, 115, 115, 95, 111, 102, 27, 99, 114, 101, 97, 116, 101, + 95, 117, 110, 98, 111, 117, 110, 100, 101, 100, 95, 97, 103, 103, 114, 101, 103, 97, + 116, 111, 114, 19, 105, 110, 99, 114, 101, 109, 101, 110, 116, 95, 109, 105, 108, 101, + 115, 116, 111, 110, 101, 7, 116, 114, 121, 95, 97, 100, 100, 11, 105, 115, 95, 97, + 116, 95, 108, 101, 97, 115, 116, 5, 101, 118, 101, 110, 116, 4, 101, 109, 105, 116, + 5, 101, 114, 114, 111, 114, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, + 117, 109, 101, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, + 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 8, 4, 0, 0, - 0, 0, 0, 0, 0, 3, 8, 5, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, - 0, 0, 0, 0, 0, 0, 0, 5, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 202, 254, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, - 97, 116, 97, 95, 118, 49, 112, 3, 2, 0, 0, 0, 0, 0, 0, 0, 21, 69, - 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, 69, 83, 69, - 78, 84, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 69, 67, 79, 85, 78, 84, - 69, 82, 95, 73, 78, 67, 82, 69, 77, 69, 78, 84, 95, 70, 65, 73, 76, 0, - 5, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, 65, 85, 84, 72, - 79, 82, 73, 90, 69, 68, 0, 1, 16, 77, 105, 108, 101, 115, 116, 111, 110, 101, - 82, 101, 97, 99, 104, 101, 100, 1, 4, 0, 0, 0, 2, 3, 9, 3, 10, 3, - 11, 11, 2, 1, 3, 1, 2, 1, 13, 3, 0, 1, 4, 0, 1, 17, 10, 0, - 17, 2, 7, 3, 33, 4, 6, 5, 10, 11, 0, 1, 7, 1, 39, 11, 0, 10, - 1, 11, 1, 56, 0, 18, 0, 45, 0, 2, 1, 1, 4, 1, 0, 6, 61, 7, - 3, 41, 0, 4, 4, 5, 7, 7, 2, 17, 4, 39, 7, 3, 42, 0, 12, 1, - 10, 1, 15, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 56, 1, 4, 16, 5, - 20, 11, 1, 1, 7, 0, 39, 10, 1, 16, 0, 10, 1, 16, 1, 20, 56, 2, - 4, 38, 10, 1, 16, 0, 10, 1, 16, 1, 20, 6, 1, 0, 0, 0, 0, 0, - 0, 0, 22, 56, 2, 32, 12, 0, 5, 40, 9, 12, 0, 11, 0, 4, 58, 10, - 1, 16, 1, 20, 18, 1, 56, 3, 10, 1, 16, 1, 20, 10, 1, 16, 2, 20, - 22, 11, 1, 15, 1, 21, 5, 60, 11, 1, 1, 2, 0, 2, 0, 0, 0, 1, - 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 202, 254, 20, 99, 111, 109, 112, + 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, 116, 97, 100, 97, 116, 97, 9, 0, + 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, + 116, 97, 100, 97, 116, 97, 95, 118, 49, 112, 3, 2, 0, 0, 0, 0, 0, 0, + 0, 21, 69, 82, 69, 83, 79, 85, 82, 67, 69, 95, 78, 79, 84, 95, 80, 82, + 69, 83, 69, 78, 84, 0, 4, 0, 0, 0, 0, 0, 0, 0, 23, 69, 67, 79, + 85, 78, 84, 69, 82, 95, 73, 78, 67, 82, 69, 77, 69, 78, 84, 95, 70, 65, + 73, 76, 0, 5, 0, 0, 0, 0, 0, 0, 0, 15, 69, 78, 79, 84, 95, 65, + 85, 84, 72, 79, 82, 73, 90, 69, 68, 0, 1, 16, 77, 105, 108, 101, 115, 116, + 111, 110, 101, 82, 101, 97, 99, 104, 101, 100, 1, 4, 0, 0, 0, 2, 3, 2, + 3, 3, 3, 4, 11, 1, 1, 3, 2, 2, 1, 8, 3, 0, 1, 4, 0, 6, + 26, 10, 0, 17, 1, 7, 0, 33, 4, 22, 11, 0, 12, 2, 10, 1, 12, 3, + 11, 1, 12, 4, 56, 0, 12, 5, 11, 3, 11, 4, 11, 5, 18, 0, 12, 6, + 11, 2, 11, 6, 45, 0, 2, 11, 0, 1, 6, 5, 0, 0, 0, 0, 0, 0, + 0, 39, 3, 1, 4, 1, 0, 12, 59, 7, 0, 41, 0, 4, 56, 7, 0, 42, + 0, 12, 0, 10, 0, 15, 0, 6, 1, 0, 0, 0, 0, 0, 0, 0, 56, 1, + 4, 52, 10, 0, 16, 0, 10, 0, 16, 1, 20, 56, 2, 4, 49, 10, 0, 16, + 0, 10, 0, 16, 1, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 56, 2, + 32, 12, 1, 11, 1, 4, 46, 10, 0, 16, 1, 20, 18, 1, 56, 3, 10, 0, + 16, 1, 20, 10, 0, 16, 2, 20, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, + 5, 45, 9, 12, 1, 5, 28, 11, 0, 1, 6, 4, 0, 0, 0, 0, 0, 0, + 0, 39, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 7, 39, 0, 2, 0, 0, + 0, 1, 0, ] }); @@ -1894,179 +1950,195 @@ pub static PACKAGE_BCS_STREAM_METADATA: Lazy> = Lazy::new(|| { #[rustfmt::skip] pub static MODULE_BCS_STREAM_BCS_STREAM: Lazy> = Lazy::new(|| { vec![ - 161, 28, 235, 11, 6, 0, 0, 0, 12, 1, 0, 10, 2, 10, 8, 3, 18, 86, - 4, 104, 2, 5, 106, 104, 7, 210, 1, 190, 2, 8, 144, 4, 64, 6, 208, 4, - 20, 16, 228, 4, 175, 1, 10, 147, 6, 8, 12, 155, 6, 198, 17, 13, 225, 23, - 4, 0, 0, 1, 1, 1, 2, 1, 3, 1, 4, 0, 5, 2, 0, 3, 8, 7, - 0, 0, 6, 0, 1, 0, 0, 7, 0, 2, 0, 0, 9, 0, 3, 0, 0, 10, - 0, 4, 0, 0, 11, 0, 5, 0, 0, 12, 0, 6, 0, 0, 13, 7, 8, 0, - 0, 14, 0, 9, 0, 0, 15, 0, 10, 0, 0, 16, 0, 11, 0, 0, 17, 0, - 10, 0, 0, 18, 12, 13, 0, 1, 21, 10, 10, 0, 4, 22, 15, 16, 1, 1, - 2, 23, 12, 1, 0, 1, 24, 10, 10, 0, 3, 25, 12, 3, 0, 13, 11, 1, - 7, 8, 0, 1, 5, 1, 1, 1, 8, 1, 1, 4, 1, 13, 1, 15, 2, 10, - 2, 3, 0, 1, 14, 1, 3, 1, 2, 1, 10, 2, 1, 8, 0, 3, 3, 6, - 10, 2, 5, 3, 6, 10, 9, 0, 3, 3, 1, 10, 9, 0, 2, 1, 2, 4, - 3, 6, 10, 2, 3, 8, 1, 3, 3, 6, 10, 2, 4, 3, 3, 6, 10, 2, - 13, 3, 3, 6, 10, 2, 15, 3, 3, 6, 10, 2, 14, 3, 3, 6, 10, 2, - 3, 3, 3, 6, 10, 2, 2, 5, 1, 2, 3, 2, 3, 10, 98, 99, 115, 95, - 115, 116, 114, 101, 97, 109, 5, 101, 114, 114, 111, 114, 8, 102, 114, 111, 109, 95, - 98, 99, 115, 6, 115, 116, 114, 105, 110, 103, 6, 118, 101, 99, 116, 111, 114, 9, - 66, 67, 83, 83, 116, 114, 101, 97, 109, 19, 100, 101, 115, 101, 114, 105, 97, 108, - 105, 122, 101, 95, 97, 100, 100, 114, 101, 115, 115, 16, 100, 101, 115, 101, 114, 105, - 97, 108, 105, 122, 101, 95, 98, 111, 111, 108, 6, 83, 116, 114, 105, 110, 103, 18, - 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 115, 116, 114, 105, 110, 103, - 16, 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 49, 50, 56, 15, - 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 49, 54, 16, 100, 101, - 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 50, 53, 54, 22, 100, 101, 115, - 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 50, 53, 54, 95, 101, 110, 116, 114, - 121, 15, 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 51, 50, 15, - 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 54, 52, 14, 100, 101, - 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 56, 19, 100, 101, 115, 101, 114, - 105, 97, 108, 105, 122, 101, 95, 117, 108, 101, 98, 49, 50, 56, 3, 110, 101, 119, - 4, 100, 97, 116, 97, 3, 99, 117, 114, 12, 111, 117, 116, 95, 111, 102, 95, 114, - 97, 110, 103, 101, 5, 115, 108, 105, 99, 101, 10, 116, 111, 95, 97, 100, 100, 114, - 101, 115, 115, 16, 105, 110, 118, 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, - 110, 116, 4, 117, 116, 102, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 161, 28, 235, 11, 7, 0, 0, 10, 11, 1, 0, 10, 2, 10, 8, 3, 18, 103, + 4, 121, 2, 5, 123, 77, 7, 200, 1, 190, 2, 8, 134, 4, 64, 16, 198, 4, + 206, 1, 10, 148, 6, 8, 12, 156, 6, 236, 19, 13, 136, 26, 4, 0, 0, 1, + 6, 1, 8, 1, 10, 1, 16, 0, 1, 2, 0, 4, 15, 7, 0, 0, 4, 0, + 1, 0, 1, 0, 5, 3, 4, 0, 1, 1, 7, 6, 7, 1, 1, 1, 2, 9, + 0, 4, 0, 1, 3, 11, 2, 2, 0, 1, 0, 12, 3, 10, 0, 1, 3, 13, + 2, 2, 0, 1, 0, 14, 3, 12, 0, 1, 0, 17, 3, 2, 0, 1, 4, 18, + 0, 12, 0, 1, 0, 19, 3, 14, 0, 1, 0, 20, 3, 15, 0, 1, 0, 21, + 3, 16, 0, 1, 0, 22, 17, 8, 0, 1, 0, 23, 3, 18, 0, 1, 0, 24, + 3, 2, 0, 1, 0, 25, 3, 5, 0, 1, 2, 5, 1, 10, 2, 1, 8, 0, + 1, 3, 1, 7, 8, 0, 1, 5, 1, 2, 3, 6, 10, 9, 0, 3, 3, 1, + 10, 9, 0, 0, 3, 6, 10, 2, 3, 3, 1, 1, 3, 2, 2, 1, 1, 8, + 1, 4, 3, 6, 10, 2, 3, 3, 1, 4, 1, 13, 1, 15, 2, 10, 2, 3, + 1, 14, 4, 6, 10, 2, 3, 3, 3, 7, 3, 2, 2, 2, 3, 3, 1, 10, + 98, 99, 115, 95, 115, 116, 114, 101, 97, 109, 9, 66, 67, 83, 83, 116, 114, 101, + 97, 109, 4, 100, 97, 116, 97, 3, 99, 117, 114, 3, 110, 101, 119, 19, 100, 101, + 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 97, 100, 100, 114, 101, 115, 115, 6, + 118, 101, 99, 116, 111, 114, 5, 115, 108, 105, 99, 101, 8, 102, 114, 111, 109, 95, + 98, 99, 115, 10, 116, 111, 95, 97, 100, 100, 114, 101, 115, 115, 5, 101, 114, 114, + 111, 114, 12, 111, 117, 116, 95, 111, 102, 95, 114, 97, 110, 103, 101, 16, 100, 101, + 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 98, 111, 111, 108, 16, 105, 110, 118, + 97, 108, 105, 100, 95, 97, 114, 103, 117, 109, 101, 110, 116, 18, 100, 101, 115, 101, + 114, 105, 97, 108, 105, 122, 101, 95, 115, 116, 114, 105, 110, 103, 6, 83, 116, 114, + 105, 110, 103, 6, 115, 116, 114, 105, 110, 103, 19, 100, 101, 115, 101, 114, 105, 97, + 108, 105, 122, 101, 95, 117, 108, 101, 98, 49, 50, 56, 4, 117, 116, 102, 56, 16, + 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 49, 50, 56, 15, 100, + 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 49, 54, 16, 100, 101, 115, + 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 50, 53, 54, 22, 100, 101, 115, 101, + 114, 105, 97, 108, 105, 122, 101, 95, 117, 50, 53, 54, 95, 101, 110, 116, 114, 121, + 15, 100, 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 51, 50, 15, 100, + 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 54, 52, 14, 100, 101, 115, + 101, 114, 105, 97, 108, 105, 122, 101, 95, 117, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 202, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 202, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, - 8, 1, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0, 0, 0, 0, 0, - 0, 18, 97, 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, - 118, 49, 154, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 15, 69, 77, 65, 76, - 70, 79, 82, 77, 69, 68, 95, 68, 65, 84, 65, 42, 84, 104, 101, 32, 100, 97, - 116, 97, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 102, 105, 116, 32, 116, 104, - 101, 32, 101, 120, 112, 101, 99, 116, 101, 100, 32, 102, 111, 114, 109, 97, 116, 46, - 2, 0, 0, 0, 0, 0, 0, 0, 13, 69, 79, 85, 84, 95, 79, 70, 95, 66, - 89, 84, 69, 83, 61, 84, 104, 101, 114, 101, 32, 97, 114, 101, 32, 110, 111, 116, - 32, 101, 110, 111, 117, 103, 104, 32, 98, 121, 116, 101, 115, 32, 116, 111, 32, 100, - 101, 115, 101, 114, 105, 97, 108, 105, 122, 101, 32, 102, 111, 114, 32, 116, 104, 101, - 32, 103, 105, 118, 101, 110, 32, 116, 121, 112, 101, 46, 0, 0, 0, 2, 2, 19, - 10, 2, 20, 3, 0, 1, 0, 0, 14, 38, 10, 0, 16, 0, 12, 2, 10, 0, - 16, 1, 20, 12, 1, 10, 1, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 10, - 2, 65, 11, 37, 4, 15, 5, 22, 11, 0, 1, 11, 2, 1, 7, 1, 17, 12, - 39, 11, 2, 10, 1, 10, 1, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 56, - 0, 17, 14, 12, 3, 11, 1, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 11, - 0, 15, 1, 21, 11, 3, 2, 1, 1, 0, 0, 17, 49, 10, 0, 16, 1, 20, - 10, 0, 16, 0, 65, 11, 35, 4, 9, 5, 14, 11, 0, 1, 7, 1, 17, 12, - 39, 10, 0, 16, 0, 10, 0, 16, 1, 20, 66, 11, 20, 12, 2, 10, 0, 16, - 1, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 10, - 2, 49, 0, 33, 4, 37, 9, 12, 1, 5, 47, 11, 2, 49, 1, 33, 4, 42, - 5, 45, 7, 0, 17, 15, 39, 8, 12, 1, 11, 1, 2, 2, 1, 0, 0, 18, - 41, 10, 0, 17, 10, 12, 3, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, 20, - 12, 1, 10, 1, 10, 3, 22, 10, 2, 65, 11, 37, 4, 18, 5, 25, 11, 0, - 1, 11, 2, 1, 7, 1, 17, 12, 39, 11, 2, 10, 1, 10, 1, 10, 3, 22, - 56, 0, 17, 16, 12, 4, 11, 1, 11, 3, 22, 11, 0, 15, 1, 21, 11, 4, - 2, 3, 1, 0, 0, 19, 188, 1, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, - 20, 12, 1, 10, 1, 6, 16, 0, 0, 0, 0, 0, 0, 0, 22, 10, 2, 65, - 11, 37, 4, 15, 5, 22, 11, 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 10, - 2, 10, 1, 66, 11, 20, 53, 10, 2, 10, 1, 6, 1, 0, 0, 0, 0, 0, - 0, 0, 22, 66, 11, 20, 53, 49, 8, 47, 27, 10, 2, 10, 1, 6, 2, 0, - 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 16, 47, 27, 10, 2, 10, - 1, 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 24, 47, - 27, 10, 2, 10, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, - 53, 49, 32, 47, 27, 10, 2, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, - 22, 66, 11, 20, 53, 49, 40, 47, 27, 10, 2, 10, 1, 6, 6, 0, 0, 0, - 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 48, 47, 27, 10, 2, 10, 1, 6, - 7, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 56, 47, 27, 10, - 2, 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, - 64, 47, 27, 10, 2, 10, 1, 6, 9, 0, 0, 0, 0, 0, 0, 0, 22, 66, - 11, 20, 53, 49, 72, 47, 27, 10, 2, 10, 1, 6, 10, 0, 0, 0, 0, 0, - 0, 0, 22, 66, 11, 20, 53, 49, 80, 47, 27, 10, 2, 10, 1, 6, 11, 0, - 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 88, 47, 27, 10, 2, 10, - 1, 6, 12, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 96, 47, - 27, 10, 2, 10, 1, 6, 13, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, - 53, 49, 104, 47, 27, 10, 2, 10, 1, 6, 14, 0, 0, 0, 0, 0, 0, 0, - 22, 66, 11, 20, 53, 49, 112, 47, 27, 11, 2, 11, 1, 6, 15, 0, 0, 0, - 0, 0, 0, 0, 22, 66, 11, 20, 53, 49, 120, 47, 27, 12, 3, 10, 0, 16, - 1, 20, 6, 16, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 11, - 3, 2, 4, 1, 0, 0, 20, 48, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, - 20, 12, 1, 10, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 22, 10, 2, 65, - 11, 37, 4, 15, 5, 22, 11, 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 10, - 2, 10, 1, 66, 11, 20, 75, 11, 2, 11, 1, 6, 1, 0, 0, 0, 0, 0, - 0, 0, 22, 66, 11, 20, 75, 49, 8, 47, 27, 12, 3, 10, 0, 16, 1, 20, - 6, 2, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 11, 3, 2, - 5, 1, 0, 0, 21, 220, 2, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, 20, - 12, 1, 10, 1, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 10, 2, 65, 11, - 37, 4, 15, 5, 22, 11, 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 10, 2, - 10, 1, 66, 11, 20, 77, 10, 2, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, - 0, 22, 66, 11, 20, 77, 49, 8, 47, 27, 10, 2, 10, 1, 6, 2, 0, 0, - 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 16, 47, 27, 10, 2, 10, 1, - 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 24, 47, 27, - 10, 2, 10, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, - 49, 32, 47, 27, 10, 2, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 22, - 66, 11, 20, 77, 49, 40, 47, 27, 10, 2, 10, 1, 6, 6, 0, 0, 0, 0, - 0, 0, 0, 22, 66, 11, 20, 77, 49, 48, 47, 27, 10, 2, 10, 1, 6, 7, - 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 56, 47, 27, 10, 2, - 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 64, - 47, 27, 10, 2, 10, 1, 6, 9, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, - 20, 77, 49, 72, 47, 27, 10, 2, 10, 1, 6, 10, 0, 0, 0, 0, 0, 0, - 0, 22, 66, 11, 20, 77, 49, 80, 47, 27, 10, 2, 10, 1, 6, 11, 0, 0, - 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 88, 47, 27, 10, 2, 10, 1, - 6, 12, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 96, 47, 27, - 10, 2, 10, 1, 6, 13, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, - 49, 104, 47, 27, 10, 2, 10, 1, 6, 14, 0, 0, 0, 0, 0, 0, 0, 22, - 66, 11, 20, 77, 49, 112, 47, 27, 10, 2, 10, 1, 6, 15, 0, 0, 0, 0, - 0, 0, 0, 22, 66, 11, 20, 77, 49, 120, 47, 27, 10, 2, 10, 1, 6, 16, - 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 128, 47, 27, 10, 2, - 10, 1, 6, 17, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 136, - 47, 27, 10, 2, 10, 1, 6, 18, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, - 20, 77, 49, 144, 47, 27, 10, 2, 10, 1, 6, 19, 0, 0, 0, 0, 0, 0, - 0, 22, 66, 11, 20, 77, 49, 152, 47, 27, 10, 2, 10, 1, 6, 20, 0, 0, - 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 160, 47, 27, 10, 2, 10, 1, - 6, 21, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 168, 47, 27, - 10, 2, 10, 1, 6, 22, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, - 49, 176, 47, 27, 10, 2, 10, 1, 6, 23, 0, 0, 0, 0, 0, 0, 0, 22, - 66, 11, 20, 77, 49, 184, 47, 27, 10, 2, 10, 1, 6, 24, 0, 0, 0, 0, - 0, 0, 0, 22, 66, 11, 20, 77, 49, 192, 47, 27, 10, 2, 10, 1, 6, 25, - 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 200, 47, 27, 10, 2, - 10, 1, 6, 26, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 208, - 47, 27, 10, 2, 10, 1, 6, 27, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, - 20, 77, 49, 216, 47, 27, 10, 2, 10, 1, 6, 28, 0, 0, 0, 0, 0, 0, - 0, 22, 66, 11, 20, 77, 49, 224, 47, 27, 10, 2, 10, 1, 6, 29, 0, 0, - 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 232, 47, 27, 10, 2, 10, 1, - 6, 30, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, 49, 240, 47, 27, - 11, 2, 11, 1, 6, 31, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 77, - 49, 248, 47, 27, 12, 3, 10, 0, 16, 1, 20, 6, 32, 0, 0, 0, 0, 0, - 0, 0, 22, 11, 0, 15, 1, 21, 11, 3, 2, 6, 1, 4, 0, 13, 8, 11, - 0, 11, 1, 18, 0, 12, 2, 13, 2, 17, 5, 1, 2, 7, 1, 0, 0, 22, - 68, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, 20, 12, 1, 10, 1, 6, 4, - 0, 0, 0, 0, 0, 0, 0, 22, 10, 2, 65, 11, 37, 4, 15, 5, 22, 11, - 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 10, 2, 10, 1, 66, 11, 20, 76, - 10, 2, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 76, - 49, 8, 47, 27, 10, 2, 10, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 22, - 66, 11, 20, 76, 49, 16, 47, 27, 11, 2, 11, 1, 6, 3, 0, 0, 0, 0, - 0, 0, 0, 22, 66, 11, 20, 76, 49, 24, 47, 27, 12, 3, 10, 0, 16, 1, - 20, 6, 4, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 11, 3, - 2, 8, 1, 0, 0, 23, 108, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, 20, - 12, 1, 10, 1, 6, 8, 0, 0, 0, 0, 0, 0, 0, 22, 10, 2, 65, 11, - 37, 4, 15, 5, 22, 11, 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 10, 2, - 10, 1, 66, 11, 20, 52, 10, 2, 10, 1, 6, 1, 0, 0, 0, 0, 0, 0, - 0, 22, 66, 11, 20, 52, 49, 8, 47, 27, 10, 2, 10, 1, 6, 2, 0, 0, - 0, 0, 0, 0, 0, 22, 66, 11, 20, 52, 49, 16, 47, 27, 10, 2, 10, 1, - 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 52, 49, 24, 47, 27, - 10, 2, 10, 1, 6, 4, 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 52, - 49, 32, 47, 27, 10, 2, 10, 1, 6, 5, 0, 0, 0, 0, 0, 0, 0, 22, - 66, 11, 20, 52, 49, 40, 47, 27, 10, 2, 10, 1, 6, 6, 0, 0, 0, 0, - 0, 0, 0, 22, 66, 11, 20, 52, 49, 48, 47, 27, 11, 2, 11, 1, 6, 7, - 0, 0, 0, 0, 0, 0, 0, 22, 66, 11, 20, 52, 49, 56, 47, 27, 12, 3, - 10, 0, 16, 1, 20, 6, 8, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, - 1, 21, 11, 3, 2, 9, 1, 0, 0, 24, 33, 10, 0, 16, 0, 12, 2, 10, - 0, 16, 1, 20, 12, 1, 10, 1, 10, 2, 65, 11, 35, 4, 13, 5, 20, 11, - 0, 1, 11, 2, 1, 7, 1, 17, 12, 39, 11, 2, 10, 1, 66, 11, 20, 12, - 3, 11, 1, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, - 11, 3, 2, 10, 1, 0, 0, 25, 98, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 3, 49, 0, 12, 4, 10, 0, 16, 1, 20, 10, 0, 16, 0, 65, 11, 35, - 4, 93, 5, 13, 10, 0, 16, 0, 10, 0, 16, 1, 20, 66, 11, 20, 12, 2, - 10, 0, 16, 1, 20, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 10, 0, 15, - 1, 21, 10, 2, 49, 127, 28, 52, 12, 5, 10, 5, 10, 4, 47, 10, 4, 48, - 10, 5, 34, 4, 47, 11, 0, 1, 7, 0, 17, 15, 39, 11, 3, 10, 5, 10, - 4, 47, 27, 12, 3, 11, 2, 49, 128, 28, 49, 0, 33, 4, 79, 11, 0, 1, - 11, 4, 49, 0, 36, 4, 70, 11, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 33, 12, 1, 5, 72, 9, 12, 1, 11, 1, 4, 77, 7, 0, 17, 15, 39, 11, - 3, 2, 11, 4, 49, 7, 22, 12, 4, 10, 4, 49, 64, 36, 4, 92, 11, 0, - 1, 7, 0, 17, 15, 39, 5, 4, 11, 0, 1, 7, 1, 17, 12, 39, 11, 1, - 0, 0, 8, 4, 11, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 2, - 0, 0, 0, 1, 0, + 0, 0, 1, 20, 99, 111, 109, 112, 105, 108, 97, 116, 105, 111, 110, 95, 109, 101, + 116, 97, 100, 97, 116, 97, 9, 0, 3, 50, 46, 48, 3, 50, 46, 49, 18, 97, + 112, 116, 111, 115, 58, 58, 109, 101, 116, 97, 100, 97, 116, 97, 95, 118, 49, 154, + 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 15, 69, 77, 65, 76, 70, 79, 82, + 77, 69, 68, 95, 68, 65, 84, 65, 42, 84, 104, 101, 32, 100, 97, 116, 97, 32, + 100, 111, 101, 115, 32, 110, 111, 116, 32, 102, 105, 116, 32, 116, 104, 101, 32, 101, + 120, 112, 101, 99, 116, 101, 100, 32, 102, 111, 114, 109, 97, 116, 46, 2, 0, 0, + 0, 0, 0, 0, 0, 13, 69, 79, 85, 84, 95, 79, 70, 95, 66, 89, 84, 69, + 83, 61, 84, 104, 101, 114, 101, 32, 97, 114, 101, 32, 110, 111, 116, 32, 101, 110, + 111, 117, 103, 104, 32, 98, 121, 116, 101, 115, 32, 116, 111, 32, 100, 101, 115, 101, + 114, 105, 97, 108, 105, 122, 101, 32, 102, 111, 114, 32, 116, 104, 101, 32, 103, 105, + 118, 101, 110, 32, 116, 121, 112, 101, 46, 0, 0, 0, 2, 2, 2, 10, 2, 3, + 3, 0, 1, 0, 0, 2, 4, 11, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 18, 0, 2, 1, 1, 0, 0, 9, 37, 10, 0, 16, 0, 12, 1, 10, 0, 16, + 1, 20, 12, 2, 10, 2, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 10, 1, + 65, 5, 37, 4, 30, 10, 2, 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 12, + 3, 11, 1, 10, 2, 11, 3, 56, 0, 17, 3, 11, 2, 6, 32, 0, 0, 0, + 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, 1, 1, 6, + 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 5, 1, 0, 0, 11, 47, 10, + 0, 16, 1, 20, 10, 0, 16, 0, 65, 5, 35, 4, 42, 10, 0, 16, 0, 10, + 0, 16, 1, 20, 66, 5, 20, 12, 1, 10, 0, 16, 1, 20, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 10, 1, 49, 0, 33, 4, 32, + 9, 12, 3, 11, 3, 2, 11, 1, 49, 1, 33, 4, 39, 8, 12, 3, 5, 30, + 6, 1, 0, 0, 0, 0, 0, 0, 0, 17, 6, 39, 11, 0, 1, 6, 2, 0, + 0, 0, 0, 0, 0, 0, 17, 4, 39, 7, 1, 0, 0, 13, 40, 10, 0, 17, + 8, 12, 1, 10, 0, 16, 0, 12, 2, 10, 0, 16, 1, 20, 12, 3, 10, 3, + 10, 1, 22, 10, 2, 65, 5, 37, 4, 33, 10, 3, 10, 1, 22, 12, 4, 11, + 2, 10, 3, 11, 4, 56, 0, 17, 9, 11, 3, 11, 1, 22, 11, 0, 15, 1, + 21, 2, 11, 0, 1, 11, 2, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, + 4, 39, 10, 1, 0, 0, 9, 215, 1, 10, 0, 16, 0, 12, 1, 10, 0, 16, + 1, 20, 12, 2, 10, 2, 6, 16, 0, 0, 0, 0, 0, 0, 0, 22, 10, 1, + 65, 5, 37, 4, 208, 1, 10, 1, 10, 2, 66, 5, 20, 53, 10, 2, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, + 49, 8, 47, 27, 10, 2, 6, 2, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, + 10, 1, 11, 3, 66, 5, 20, 53, 49, 16, 47, 27, 10, 2, 6, 3, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 24, + 47, 27, 10, 2, 6, 4, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, + 11, 3, 66, 5, 20, 53, 49, 32, 47, 27, 10, 2, 6, 5, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 40, 47, 27, + 10, 2, 6, 6, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, + 66, 5, 20, 53, 49, 48, 47, 27, 10, 2, 6, 7, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 56, 47, 27, 10, 2, + 6, 8, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, + 20, 53, 49, 64, 47, 27, 10, 2, 6, 9, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 72, 47, 27, 10, 2, 6, 10, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, + 49, 80, 47, 27, 10, 2, 6, 11, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, + 10, 1, 11, 3, 66, 5, 20, 53, 49, 88, 47, 27, 10, 2, 6, 12, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 96, + 47, 27, 10, 2, 6, 13, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, + 11, 3, 66, 5, 20, 53, 49, 104, 47, 27, 10, 2, 6, 14, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 53, 49, 112, 47, 27, + 11, 2, 6, 15, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 11, 1, 11, 3, + 66, 5, 20, 53, 49, 120, 47, 27, 10, 0, 16, 1, 20, 6, 16, 0, 0, 0, + 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, 1, 1, 6, + 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 11, 1, 0, 0, 9, 47, 10, + 0, 16, 0, 12, 1, 10, 0, 16, 1, 20, 12, 2, 10, 2, 6, 2, 0, 0, + 0, 0, 0, 0, 0, 22, 10, 1, 65, 5, 37, 4, 40, 10, 1, 10, 2, 66, + 5, 20, 75, 11, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 11, + 1, 11, 3, 66, 5, 20, 75, 49, 8, 47, 27, 10, 0, 16, 1, 20, 6, 2, + 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, + 1, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 12, 1, 0, 0, + 9, 151, 3, 10, 0, 16, 0, 12, 1, 10, 0, 16, 1, 20, 12, 2, 10, 2, + 6, 32, 0, 0, 0, 0, 0, 0, 0, 22, 10, 1, 65, 5, 37, 4, 144, 3, + 10, 1, 10, 2, 66, 5, 20, 77, 10, 2, 6, 1, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 8, 47, 27, 10, 2, + 6, 2, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, + 20, 77, 49, 16, 47, 27, 10, 2, 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 24, 47, 27, 10, 2, 6, 4, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, + 49, 32, 47, 27, 10, 2, 6, 5, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, + 10, 1, 11, 3, 66, 5, 20, 77, 49, 40, 47, 27, 10, 2, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 48, + 47, 27, 10, 2, 6, 7, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, + 11, 3, 66, 5, 20, 77, 49, 56, 47, 27, 10, 2, 6, 8, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 64, 47, 27, + 10, 2, 6, 9, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, + 66, 5, 20, 77, 49, 72, 47, 27, 10, 2, 6, 10, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 80, 47, 27, 10, 2, + 6, 11, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, + 20, 77, 49, 88, 47, 27, 10, 2, 6, 12, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 96, 47, 27, 10, 2, 6, 13, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, + 49, 104, 47, 27, 10, 2, 6, 14, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, + 10, 1, 11, 3, 66, 5, 20, 77, 49, 112, 47, 27, 10, 2, 6, 15, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 120, + 47, 27, 10, 2, 6, 16, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, + 11, 3, 66, 5, 20, 77, 49, 128, 47, 27, 10, 2, 6, 17, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 136, 47, 27, + 10, 2, 6, 18, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, + 66, 5, 20, 77, 49, 144, 47, 27, 10, 2, 6, 19, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 152, 47, 27, 10, 2, + 6, 20, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, + 20, 77, 49, 160, 47, 27, 10, 2, 6, 21, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 168, 47, 27, 10, 2, 6, 22, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, + 49, 176, 47, 27, 10, 2, 6, 23, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, + 10, 1, 11, 3, 66, 5, 20, 77, 49, 184, 47, 27, 10, 2, 6, 24, 0, 0, + 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 192, + 47, 27, 10, 2, 6, 25, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, + 11, 3, 66, 5, 20, 77, 49, 200, 47, 27, 10, 2, 6, 26, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 208, 47, 27, + 10, 2, 6, 27, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, + 66, 5, 20, 77, 49, 216, 47, 27, 10, 2, 6, 28, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 224, 47, 27, 10, 2, + 6, 29, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, + 20, 77, 49, 232, 47, 27, 10, 2, 6, 30, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 3, 10, 1, 11, 3, 66, 5, 20, 77, 49, 240, 47, 27, 11, 2, 6, 31, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 11, 1, 11, 3, 66, 5, 20, 77, + 49, 248, 47, 27, 10, 0, 16, 1, 20, 6, 32, 0, 0, 0, 0, 0, 0, 0, + 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, 1, 1, 6, 2, 0, 0, 0, + 0, 0, 0, 0, 17, 4, 39, 13, 1, 4, 0, 1, 8, 11, 0, 11, 1, 18, + 0, 12, 2, 13, 2, 17, 12, 1, 2, 14, 1, 0, 0, 9, 71, 10, 0, 16, + 0, 12, 1, 10, 0, 16, 1, 20, 12, 2, 10, 2, 6, 4, 0, 0, 0, 0, + 0, 0, 0, 22, 10, 1, 65, 5, 37, 4, 64, 10, 1, 10, 2, 66, 5, 20, + 76, 10, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 10, 1, 11, + 3, 66, 5, 20, 76, 49, 8, 47, 27, 10, 2, 6, 2, 0, 0, 0, 0, 0, + 0, 0, 22, 12, 3, 10, 1, 11, 3, 66, 5, 20, 76, 49, 16, 47, 27, 11, + 2, 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, 12, 3, 11, 1, 11, 3, 66, + 5, 20, 76, 49, 24, 47, 27, 10, 0, 16, 1, 20, 6, 4, 0, 0, 0, 0, + 0, 0, 0, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, 1, 1, 6, 2, + 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 15, 1, 0, 0, 19, 119, 10, 0, + 16, 0, 12, 1, 10, 0, 16, 1, 20, 12, 2, 10, 2, 6, 8, 0, 0, 0, + 0, 0, 0, 0, 22, 10, 1, 65, 5, 37, 4, 112, 10, 1, 10, 2, 66, 5, + 20, 52, 10, 2, 6, 1, 0, 0, 0, 0, 0, 0, 0, 22, 12, 4, 10, 1, + 11, 4, 66, 5, 20, 52, 49, 8, 47, 27, 10, 2, 6, 2, 0, 0, 0, 0, + 0, 0, 0, 22, 12, 4, 10, 1, 11, 4, 66, 5, 20, 52, 49, 16, 47, 27, + 10, 2, 6, 3, 0, 0, 0, 0, 0, 0, 0, 22, 12, 4, 10, 1, 11, 4, + 66, 5, 20, 52, 49, 24, 47, 27, 10, 2, 6, 4, 0, 0, 0, 0, 0, 0, + 0, 22, 12, 4, 10, 1, 11, 4, 66, 5, 20, 52, 49, 32, 47, 27, 10, 2, + 6, 5, 0, 0, 0, 0, 0, 0, 0, 22, 12, 4, 10, 1, 11, 4, 66, 5, + 20, 52, 49, 40, 47, 27, 10, 2, 6, 6, 0, 0, 0, 0, 0, 0, 0, 22, + 12, 4, 10, 1, 11, 4, 66, 5, 20, 52, 49, 48, 47, 27, 11, 2, 6, 7, + 0, 0, 0, 0, 0, 0, 0, 22, 12, 4, 11, 1, 11, 4, 66, 5, 20, 52, + 49, 56, 47, 27, 10, 0, 16, 1, 20, 6, 8, 0, 0, 0, 0, 0, 0, 0, + 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, 1, 1, 6, 2, 0, 0, 0, + 0, 0, 0, 0, 17, 4, 39, 16, 1, 0, 0, 19, 34, 10, 0, 16, 0, 12, + 1, 10, 0, 16, 1, 20, 12, 2, 10, 2, 12, 3, 10, 1, 65, 5, 12, 4, + 11, 3, 11, 4, 35, 4, 27, 11, 1, 10, 2, 66, 5, 20, 11, 2, 6, 1, + 0, 0, 0, 0, 0, 0, 0, 22, 11, 0, 15, 1, 21, 2, 11, 0, 1, 11, + 1, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, 17, 4, 39, 8, 1, 0, 0, + 20, 99, 6, 0, 0, 0, 0, 0, 0, 0, 0, 12, 1, 49, 0, 12, 2, 10, + 0, 16, 1, 20, 10, 0, 16, 0, 65, 5, 35, 4, 94, 10, 0, 16, 0, 10, + 0, 16, 1, 20, 66, 5, 20, 12, 3, 10, 0, 16, 1, 20, 6, 1, 0, 0, + 0, 0, 0, 0, 0, 22, 10, 0, 15, 1, 21, 10, 3, 49, 127, 28, 52, 12, + 5, 10, 5, 10, 2, 47, 10, 2, 48, 10, 5, 34, 4, 46, 11, 0, 1, 6, + 1, 0, 0, 0, 0, 0, 0, 0, 17, 6, 39, 10, 5, 10, 2, 47, 12, 6, + 11, 1, 11, 6, 27, 12, 1, 11, 3, 49, 128, 28, 49, 0, 33, 4, 80, 11, + 0, 1, 11, 2, 49, 0, 36, 4, 77, 11, 5, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 33, 12, 7, 11, 7, 4, 75, 6, 1, 0, 0, 0, 0, 0, 0, 0, + 17, 6, 39, 11, 1, 2, 9, 12, 7, 5, 70, 11, 2, 49, 7, 22, 12, 2, + 10, 2, 49, 64, 36, 3, 89, 5, 4, 11, 0, 1, 6, 1, 0, 0, 0, 0, + 0, 0, 0, 17, 6, 39, 11, 0, 1, 6, 2, 0, 0, 0, 0, 0, 0, 0, + 17, 4, 39, 0, 0, 0, 1, 0, ] }); diff --git a/execution/executor/tests/internal_indexer_test.rs b/execution/executor/tests/internal_indexer_test.rs index 64526d56d4617..dbc58d60d64d6 100644 --- a/execution/executor/tests/internal_indexer_test.rs +++ b/execution/executor/tests/internal_indexer_test.rs @@ -20,7 +20,7 @@ use aptos_types::{ account_config::aptos_test_root_address, block_metadata::BlockMetadata, chain_id::ChainId, - state_store::state_key::prefix::StateKeyPrefix, + state_store::state_key::{prefix::StateKeyPrefix, StateKey}, test_helpers::transaction_test_helpers::TEST_BLOCK_EXECUTOR_ONCHAIN_CONFIG, transaction::{ signature_verified_transaction::into_signature_verified_block, @@ -28,8 +28,9 @@ use aptos_types::{ WriteSetPayload, }, }; +use move_core_types::{ident_str, language_storage::StructTag}; use rand::SeedableRng; -use std::sync::Arc; +use std::{fmt::Debug, str::FromStr, sync::Arc}; const B: u64 = 1_000_000_000; @@ -192,6 +193,206 @@ fn test_db_indexer_data() { total_version, ) .unwrap(); - let address_one_kv_res: Vec<_> = address_one_kv_iter.collect(); - assert_eq!(address_one_kv_res.len(), 152); + let address_one_kv_res = address_one_kv_iter.collect::, _>>().unwrap(); + + let (code, resources): (Vec<_>, Vec<_>) = address_one_kv_res + .into_iter() + .map(|(s, _)| s) + .partition(|s| s.is_aptos_code()); + + let expected_code = vec![ + ident_str!("acl"), + ident_str!("any"), + ident_str!("bcs"), + ident_str!("dkg"), + ident_str!("code"), + ident_str!("coin"), + ident_str!("guid"), + ident_str!("hash"), + ident_str!("jwks"), + ident_str!("util"), + ident_str!("block"), + ident_str!("debug"), + ident_str!("error"), + ident_str!("event"), + ident_str!("stake"), + ident_str!("table"), + ident_str!("math64"), + ident_str!("object"), + ident_str!("option"), + ident_str!("signer"), + ident_str!("string"), + ident_str!("vector"), + ident_str!("voting"), + ident_str!("account"), + ident_str!("ed25519"), + ident_str!("genesis"), + ident_str!("math128"), + ident_str!("version"), + ident_str!("vesting"), + ident_str!("bls12381"), + ident_str!("chain_id"), + ident_str!("features"), + ident_str!("from_bcs"), + ident_str!("pool_u64"), + ident_str!("secp256k1"), + ident_str!("timestamp"), + ident_str!("type_info"), + ident_str!("aggregator"), + ident_str!("aptos_coin"), + ident_str!("aptos_hash"), + ident_str!("big_vector"), + ident_str!("bit_vector"), + ident_str!("capability"), + ident_str!("comparator"), + ident_str!("math_fixed"), + ident_str!("randomness"), + ident_str!("simple_map"), + ident_str!("smart_table"), + ident_str!("storage_gas"), + ident_str!("chain_status"), + ident_str!("copyable_any"), + ident_str!("gas_schedule"), + ident_str!("managed_coin"), + ident_str!("math_fixed64"), + ident_str!("ristretto255"), + ident_str!("smart_vector"), + ident_str!("string_utils"), + ident_str!("aggregator_v2"), + ident_str!("aptos_account"), + ident_str!("bn254_algebra"), + ident_str!("config_buffer"), + ident_str!("create_signer"), + ident_str!("fixed_point32"), + ident_str!("fixed_point64"), + ident_str!("function_info"), + ident_str!("multi_ed25519"), + ident_str!("staking_proxy"), + ident_str!("state_storage"), + ident_str!("crypto_algebra"), + ident_str!("fungible_asset"), + ident_str!("staking_config"), + ident_str!("delegation_pool"), + ident_str!("keyless_account"), + ident_str!("reconfiguration"), + ident_str!("transaction_fee"), + ident_str!("aptos_governance"), + ident_str!("bls12381_algebra"), + ident_str!("consensus_config"), + ident_str!("execution_config"), + ident_str!("multisig_account"), + ident_str!("pool_u64_unbound"), + ident_str!("resource_account"), + ident_str!("staking_contract"), + ident_str!("system_addresses"), + ident_str!("randomness_config"), + ident_str!("table_with_length"), + ident_str!("aggregator_factory"), + ident_str!("governance_proposal"), + ident_str!("optional_aggregator"), + ident_str!("transaction_context"), + ident_str!("jwk_consensus_config"), + ident_str!("ristretto255_elgamal"), + ident_str!("reconfiguration_state"), + ident_str!("ristretto255_pedersen"), + ident_str!("object_code_deployment"), + ident_str!("primary_fungible_store"), + ident_str!("transaction_validation"), + ident_str!("randomness_api_v0_config"), + ident_str!("randomness_config_seqnum"), + ident_str!("reconfiguration_with_dkg"), + ident_str!("validator_consensus_info"), + ident_str!("ristretto255_bulletproofs"), + ident_str!("dispatchable_fungible_asset"), + ] + .into_iter() + .map(|module| StateKey::module(&AccountAddress::ONE, module)) + .collect::>(); + + assert_vec_eq(&code, &expected_code); + + let expected_resources = vec![ + (false, "0x1::dkg::DKGState"), + (false, "0x1::jwks::Patches"), + (false, "0x1::account::Account"), + (false, "0x1::version::Version"), + (false, "0x1::jwks::PatchedJWKs"), + (false, "0x1::chain_id::ChainId"), + (false, "0x1::jwks::ObservedJWKs"), + (false, "0x1::features::Features"), + (false, "0x1::stake::ValidatorSet"), + (false, "0x1::block::BlockResource"), + (false, "0x1::block::CommitHistory"), + (false, "0x1::code::PackageRegistry"), + (true, "0x1::keyless_account::Group"), + (false, "0x1::coin::CoinConversionMap"), + (false, "0x1::storage_gas::StorageGas"), + (false, "0x1::stake::ValidatorPerformance"), + (false, "0x1::account::OriginatingAddress"), + (false, "0x1::gas_schedule::GasScheduleV2"), + (false, "0x1::jwks::SupportedOIDCProviders"), + (false, "0x1::stake::AptosCoinCapabilities"), + (false, "0x1::reconfiguration_state::State"), + (false, "0x1::version::SetVersionCapability"), + (false, "0x1::storage_gas::StorageGasConfig"), + (false, "0x1::config_buffer::PendingConfigs"), + (false, "0x1::staking_config::StakingConfig"), + (false, "0x1::randomness::PerBlockRandomness"), + (false, "0x1::chain_status::GenesisEndMarker"), + (false, "0x1::reconfiguration::Configuration"), + (false, "0x1::aptos_governance::VotingRecords"), + (false, "0x1::state_storage::StateStorageUsage"), + (false, "0x1::consensus_config::ConsensusConfig"), + (false, "0x1::execution_config::ExecutionConfig"), + (false, "0x1::timestamp::CurrentTimeMicroseconds"), + (false, "0x1::aptos_governance::GovernanceConfig"), + (false, "0x1::aptos_governance::GovernanceEvents"), + (false, "0x1::randomness_config::RandomnessConfig"), + (false, "0x1::aggregator_factory::AggregatorFactory"), + (false, "0x1::transaction_fee::AptosCoinCapabilities"), + (false, "0x1::transaction_fee::AptosCoinMintCapability"), + (false, "0x1::jwk_consensus_config::JWKConsensusConfig"), + (false, "0x1::aptos_governance::ApprovedExecutionHashes"), + (false, "0x1::aptos_governance::GovernanceResponsbility"), + (false, "0x1::randomness_api_v0_config::RequiredGasDeposit"), + (false, "0x1::transaction_validation::TransactionValidation"), + ( + false, + "0x1::randomness_api_v0_config::AllowCustomMaxGasFlag", + ), + ( + false, + "0x1::randomness_config_seqnum::RandomnessConfigSeqNum", + ), + (false, "0x1::coin::CoinInfo<0x1::aptos_coin::AptosCoin>"), + ( + false, + "0x1::voting::VotingForum<0x1::governance_proposal::GovernanceProposal>", + ), + ] + .into_iter() + .map(|(rg, struct_tag)| { + if rg { + StateKey::resource_group( + &AccountAddress::ONE, + &StructTag::from_str(struct_tag).unwrap(), + ) + } else { + StateKey::resource( + &AccountAddress::ONE, + &StructTag::from_str(struct_tag).unwrap(), + ) + .unwrap() + } + }) + .collect::>(); + + assert_vec_eq(&resources, &expected_resources); +} + +fn assert_vec_eq(left: &[T], right: &[T]) { + for i in 0..left.len().min(right.len()) { + assert_eq!(left[i], right[i], "difference at position {}", i); + } + assert_eq!(left.len(), right.len(), "difference at last element"); } diff --git a/testsuite/fixtures/testFormatJunitXml.fixture b/testsuite/fixtures/testFormatJunitXml.fixture new file mode 100644 index 0000000000000..8548bf70a0ca7 --- /dev/null +++ b/testsuite/fixtures/testFormatJunitXml.fixture @@ -0,0 +1,3 @@ + +blah + \ No newline at end of file diff --git a/testsuite/fixtures/testMain.fixture b/testsuite/fixtures/testMain.fixture index c0107a095369b..aeb54372076e1 100644 --- a/testsuite/fixtures/testMain.fixture +++ b/testsuite/fixtures/testMain.fixture @@ -8,6 +8,7 @@ Using the following image tags: Checking if image exists in GCP: aptos/validator-testing:banana Checking if image exists in GCP: aptos/validator-testing:banana Checking if image exists in GCP: aptos/forge:banana +forge_args: ['forge', '--suite', 'banana-test', '--duration-secs', '300', 'test', 'k8s-swarm', '--image-tag', 'banana', '--upgrade-image-tag', 'banana', '--namespace', 'forge-perry-1659078000'] === Start temp-pre-comment === ### Forge is running suite `banana-test` on `banana` * [Grafana dashboard (auto-refresh)](https://aptoslabs.grafana.net/d/overview/overview?orgId=1&refresh=10s&var-Datasource=VictoriaMetrics%20Global%20%28Non-mainnet%29&var-BigQuery=Google%20BigQuery&var-namespace=forge-perry-1659078000&var-metrics_source=All&var-chain_name=forge-big-1&refresh=10s&from=now-15m&to=now) @@ -19,6 +20,7 @@ Checking if image exists in GCP: aptos/forge:banana * Test run is land-blocking === End temp-pre-comment === Deleting forge pod for namespace forge-perry-1659078000 +rendered_forge_test_runner: Deleting forge pod for namespace forge-perry-1659078000 === Start temp-report === Forge test runner terminated: diff --git a/testsuite/forge-cli/Cargo.toml b/testsuite/forge-cli/Cargo.toml index 4006dbc32c6f7..e6b3000ee9b30 100644 --- a/testsuite/forge-cli/Cargo.toml +++ b/testsuite/forge-cli/Cargo.toml @@ -32,6 +32,7 @@ random_word = { workspace = true } reqwest = { workspace = true } serde_json = { workspace = true } serde_yaml = { workspace = true } +sugars = { workspace = true } tokio = { workspace = true } url = { workspace = true } diff --git a/testsuite/forge-cli/src/main.rs b/testsuite/forge-cli/src/main.rs index 269247405b162..b90cf2fa40372 100644 --- a/testsuite/forge-cli/src/main.rs +++ b/testsuite/forge-cli/src/main.rs @@ -5,13 +5,14 @@ #![allow(clippy::field_reassign_with_default)] use anyhow::{bail, format_err, Context, Result}; -use aptos_forge::{ForgeConfig, Options, *}; +use aptos_forge::{config::ForgeConfig, Options, *}; use aptos_logger::Level; use clap::{Parser, Subcommand}; use futures::{future, FutureExt}; use rand::{rngs::ThreadRng, seq::SliceRandom, Rng}; use serde_json::{json, Value}; use std::{self, env, num::NonZeroUsize, process, time::Duration}; +use sugars::{boxed, hmap}; use suites::{ dag::get_dag_test, indexer::get_indexer_test, @@ -277,13 +278,13 @@ fn main() -> Result<()> { mempool_backlog: 5000, })); let swarm_dir = local_cfg.swarmdir.clone(); - run_forge( - duration, + let forge = Forge::new( + &args.options, test_suite, + duration, LocalFactory::from_workspace(swarm_dir)?, - &args.options, - args.changelog.clone(), - ) + ); + run_forge_with_changelog(forge, &args.options, args.changelog.clone()) }, TestCommand::K8sSwarm(k8s) => { if let Some(move_modules_dir) = &k8s.move_modules_dir { @@ -308,9 +309,10 @@ fn main() -> Result<()> { }; let forge_runner_mode = ForgeRunnerMode::try_from_env().unwrap_or(ForgeRunnerMode::K8s); - run_forge( - duration, + let forge = Forge::new( + &args.options, test_suite, + duration, K8sFactory::new( namespace, k8s.image_tag.clone(), @@ -322,12 +324,9 @@ fn main() -> Result<()> { k8s.enable_haproxy, k8s.enable_indexer, k8s.deployer_profile.clone(), - ) - .unwrap(), - &args.options, - args.changelog, - )?; - Ok(()) + )?, + ); + run_forge_with_changelog(forge, &args.options, args.changelog) }, } }, @@ -413,39 +412,33 @@ fn main() -> Result<()> { } } -pub fn run_forge( - global_duration: Duration, - tests: ForgeConfig, - factory: F, +pub fn run_forge_with_changelog( + forge: Forge, options: &Options, - logs: Option>, + optional_changelog: Option>, ) -> Result<()> { - let forge = Forge::new(options, tests, global_duration, factory); - if options.list { forge.list()?; return Ok(()); } - match forge.run() { - Ok(report) => { - if let Some(mut changelog) = logs { - if changelog.len() != 2 { - println!("Use: changelog "); - process::exit(1); - } - let to_commit = changelog.remove(1); - let from_commit = Some(changelog.remove(0)); - send_changelog_message(&report.to_string(), &from_commit, &to_commit); - } - Ok(()) - }, - Err(e) => { - eprintln!("Failed to run tests:\n{}", e); - Err(e) - }, + let forge_result = forge.run(); + let report = forge_result.map_err(|e| { + eprintln!("Failed to run tests:\n{}", e); + anyhow::anyhow!(e) + })?; + + if let Some(changelog) = optional_changelog { + if changelog.len() != 2 { + println!("Use: changelog "); + process::exit(1); + } + let to_commit = changelog[1].clone(); + let from_commit = Some(changelog[0].clone()); + send_changelog_message(&report.to_string(), &from_commit, &to_commit); } + Ok(()) } pub fn send_changelog_message(perf_msg: &str, from_commit: &Option, to_commit: &str) { @@ -503,39 +496,42 @@ fn get_test_suite( duration: Duration, test_cmd: &TestCommand, ) -> Result { - // Check the test name against the multi-test suites - match test_name { - "local_test_suite" => return Ok(local_test_suite()), - "pre_release" => return Ok(pre_release_suite()), - "run_forever" => return Ok(run_forever()), - // TODO(rustielin): verify each test suite - "k8s_suite" => return Ok(k8s_test_suite()), - "chaos" => return Ok(chaos_test_suite(duration)), - _ => {}, // No multi-test suite matches! + // These are high level suite aliases that express an intent + let suite_aliases = hmap! { + "local_test_suite" => boxed!(local_test_suite) as Box ForgeConfig>, + "pre_release" => boxed!(pre_release_suite), + "run_forever" => boxed!(run_forever), + "k8s_suite" => boxed!(k8s_test_suite), + "chaos" => boxed!(|| chaos_test_suite(duration)), }; + if let Some(test_suite) = suite_aliases.get(test_name) { + return Ok(test_suite()); + } + // Otherwise, check the test name against the grouped test suites - if let Some(test_suite) = get_land_blocking_test(test_name, duration, test_cmd) { - Ok(test_suite) - } else if let Some(test_suite) = get_multi_region_test(test_name) { - return Ok(test_suite); - } else if let Some(test_suite) = get_netbench_test(test_name) { - return Ok(test_suite); - } else if let Some(test_suite) = get_pfn_test(test_name, duration) { - return Ok(test_suite); - } else if let Some(test_suite) = get_realistic_env_test(test_name, duration, test_cmd) { - return Ok(test_suite); - } else if let Some(test_suite) = get_state_sync_test(test_name) { - return Ok(test_suite); - } else if let Some(test_suite) = get_dag_test(test_name, duration, test_cmd) { - return Ok(test_suite); - } else if let Some(test_suite) = get_indexer_test(test_name) { - return Ok(test_suite); - } else if let Some(test_suite) = get_ungrouped_test(test_name) { - return Ok(test_suite); - } else { - bail!(format_err!("Invalid --suite given: {:?}", test_name)) + // This is done in order of priority + // A match higher up in the list will take precedence + let named_test_suites = [ + boxed!(|| get_land_blocking_test(test_name, duration, test_cmd)) + as Box Option>, + boxed!(|| get_multi_region_test(test_name)), + boxed!(|| get_netbench_test(test_name)), + boxed!(|| get_pfn_test(test_name, duration)), + boxed!(|| get_realistic_env_test(test_name, duration, test_cmd)), + boxed!(|| get_state_sync_test(test_name)), + boxed!(|| get_dag_test(test_name, duration, test_cmd)), + boxed!(|| get_indexer_test(test_name)), + boxed!(|| get_ungrouped_test(test_name)), + ]; + + for named_suite in named_test_suites.iter() { + if let Some(suite) = named_suite() { + return Ok(suite); + } } + + bail!(format_err!("Invalid --suite given: {:?}", test_name)) } #[cfg(test)] mod test { diff --git a/testsuite/forge-test-runner-template.yaml b/testsuite/forge-test-runner-template.yaml index 60876c498df8c..1d856ca269c04 100644 --- a/testsuite/forge-test-runner-template.yaml +++ b/testsuite/forge-test-runner-template.yaml @@ -38,6 +38,8 @@ spec: value: {FORGE_USERNAME} - name: FORGE_RETAIN_DEBUG_LOGS value: "{FORGE_RETAIN_DEBUG_LOGS}" + - name: FORGE_JUNIT_XML_PATH + value: "{FORGE_JUNIT_XML_PATH}" - name: PROMETHEUS_URL valueFrom: secretKeyRef: diff --git a/testsuite/forge.py b/testsuite/forge.py index 772597c976009..242d7e1233d4c 100644 --- a/testsuite/forge.py +++ b/testsuite/forge.py @@ -266,6 +266,7 @@ class ForgeContext: forge_username: str forge_blocking: bool forge_retain_debug_logs: str + forge_junit_xml_path: Optional[str] github_actions: str github_job_url: Optional[str] @@ -688,6 +689,33 @@ def format_comment(context: ForgeContext, result: ForgeResult) -> str: ) +BEGIN_JUNIT = "=== BEGIN JUNIT ===" +END_JUNIT = "=== END JUNIT ===" + + +def format_junit_xml(_context: ForgeContext, result: ForgeResult) -> str: + forge_output = result.output + start_index = forge_output.find(BEGIN_JUNIT) + if start_index == -1: + raise Exception( + "=== BEGIN JUNIT === not found in forge output, unable to write junit xml" + ) + + start_index += len(BEGIN_JUNIT) + if start_index > len(forge_output): + raise Exception( + "=== BEGIN JUNIT === found at end of forge output, unable to write junit xml" + ) + + end_index = forge_output.find(END_JUNIT) + if end_index == -1: + raise Exception( + "=== END JUNIT === not found in forge output, unable to write junit xml" + ) + + return forge_output[start_index:end_index].strip().lstrip() + + class ForgeRunner: def run(self, context: ForgeContext) -> ForgeResult: raise NotImplementedError @@ -840,6 +868,7 @@ def run(self, context: ForgeContext) -> ForgeResult: FORGE_TEST_SUITE=sanitize_k8s_resource_name(context.forge_test_suite), FORGE_USERNAME=sanitize_k8s_resource_name(context.forge_username), FORGE_RETAIN_DEBUG_LOGS=context.forge_retain_debug_logs, + FORGE_JUNIT_XML_PATH=context.forge_junit_xml_path, VALIDATOR_NODE_SELECTOR=validator_node_selector, KUBECONFIG=MULTIREGION_KUBECONFIG_PATH, MULTIREGION_KUBECONFIG_DIR=MULTIREGION_KUBECONFIG_DIR, @@ -1340,10 +1369,11 @@ def seeded_random_choice(namespace: str, cluster_names: Sequence[str]) -> str: @envoption("FORGE_DEPLOYER_PROFILE") @envoption("FORGE_ENABLE_FAILPOINTS") @envoption("FORGE_ENABLE_PERFORMANCE") -@envoption("FORGE_TEST_SUITE") @envoption("FORGE_RUNNER_DURATION_SECS", "300") @envoption("FORGE_IMAGE_TAG") @envoption("FORGE_RETAIN_DEBUG_LOGS", "false") +@envoption("FORGE_JUNIT_XML_PATH") +@envoption("FORGE_TEST_SUITE") @envoption("IMAGE_TAG") @envoption("UPGRADE_IMAGE_TAG") @envoption("FORGE_NAMESPACE") @@ -1389,6 +1419,7 @@ def test( forge_runner_duration_secs: str, forge_image_tag: Optional[str], forge_retain_debug_logs: str, + forge_junit_xml_path: Optional[str], image_tag: Optional[str], upgrade_image_tag: Optional[str], forge_namespace: Optional[str], @@ -1639,6 +1670,7 @@ def test( forge_test_suite=forge_test_suite, forge_username=forge_username, forge_retain_debug_logs=forge_retain_debug_logs, + forge_junit_xml_path=forge_junit_xml_path, forge_blocking=forge_blocking == "true", github_actions=github_actions, github_job_url=( @@ -1683,6 +1715,9 @@ def test( log.info(format_comment(forge_context, result)) if github_step_summary: outputs.append(ForgeFormatter(github_step_summary, format_comment)) + if forge_junit_xml_path: + outputs.append(ForgeFormatter(forge_junit_xml_path, format_junit_xml)) + forge_context.report(result, outputs) log.info(result.format(forge_context)) diff --git a/testsuite/forge/Cargo.toml b/testsuite/forge/Cargo.toml index 9b877474df562..2755feb131130 100644 --- a/testsuite/forge/Cargo.toml +++ b/testsuite/forge/Cargo.toml @@ -50,17 +50,20 @@ kube = { version = "0.65.0", default-features = false, features = ["jsonpatch", num_cpus = { workspace = true } once_cell = { workspace = true } prometheus-http-query = { workspace = true } +quick-junit = { workspace = true } rand = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } serde_yaml = { workspace = true } +sugars = { workspace = true } tempfile = { workspace = true } termcolor = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } url = { workspace = true } +uuid = { workspace = true } [dev-dependencies] serde_merge = { workspace = true } diff --git a/testsuite/forge/src/config.rs b/testsuite/forge/src/config.rs new file mode 100644 index 0000000000000..940589e7fb3b1 --- /dev/null +++ b/testsuite/forge/src/config.rs @@ -0,0 +1,342 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use crate::{ + success_criteria::{MetricsThreshold, SuccessCriteria, SystemMetricsThreshold}, + *, +}; +use aptos_config::config::{NodeConfig, OverrideNodeConfig}; +use aptos_framework::ReleaseBundle; +use std::{num::NonZeroUsize, sync::Arc}; + +pub struct ForgeConfig { + suite_name: Option, + + pub aptos_tests: Vec>, + pub admin_tests: Vec>, + pub network_tests: Vec>, + + /// The initial number of validators to spawn when the test harness creates a swarm + pub initial_validator_count: NonZeroUsize, + + /// The initial number of fullnodes to spawn when the test harness creates a swarm + pub initial_fullnode_count: usize, + + /// The initial version to use when the test harness creates a swarm + pub initial_version: InitialVersion, + + /// The initial genesis modules to use when starting a network + pub genesis_config: Option, + + /// Optional genesis helm values init function + pub genesis_helm_config_fn: Option, + + /// Optional validator node config override function + pub validator_override_node_config_fn: Option, + + /// Optional fullnode node config override function + pub fullnode_override_node_config_fn: Option, + + pub multi_region_config: bool, + + /// Transaction workload to run on the swarm + pub emit_job_request: EmitJobRequest, + + /// Success criteria + pub success_criteria: SuccessCriteria, + + /// The label of existing DBs to use, if None, will create new db. + pub existing_db_tag: Option, + + pub validator_resource_override: NodeResourceOverride, + + pub fullnode_resource_override: NodeResourceOverride, + + /// Retain debug logs and above for all nodes instead of just the first 5 nodes + pub retain_debug_logs: bool, +} + +impl ForgeConfig { + pub fn new() -> Self { + Self::default() + } + + pub fn add_aptos_test(mut self, aptos_test: T) -> Self { + self.aptos_tests.push(Box::new(aptos_test)); + self + } + + pub fn get_suite_name(&self) -> Option { + self.suite_name.clone() + } + + pub fn with_suite_name(mut self, suite_name: String) -> Self { + self.suite_name = Some(suite_name); + self + } + + pub fn with_aptos_tests(mut self, aptos_tests: Vec>) -> Self { + self.aptos_tests = aptos_tests; + self + } + + pub fn add_admin_test(mut self, admin_test: T) -> Self { + self.admin_tests.push(Box::new(admin_test)); + self + } + + pub fn with_admin_tests(mut self, admin_tests: Vec>) -> Self { + self.admin_tests = admin_tests; + self + } + + pub fn add_network_test(mut self, network_test: T) -> Self { + self.network_tests.push(Box::new(network_test)); + self + } + + pub fn with_network_tests(mut self, network_tests: Vec>) -> Self { + self.network_tests = network_tests; + self + } + + pub fn with_initial_validator_count(mut self, initial_validator_count: NonZeroUsize) -> Self { + self.initial_validator_count = initial_validator_count; + self + } + + pub fn with_initial_fullnode_count(mut self, initial_fullnode_count: usize) -> Self { + self.initial_fullnode_count = initial_fullnode_count; + self + } + + pub fn with_genesis_helm_config_fn(mut self, genesis_helm_config_fn: GenesisConfigFn) -> Self { + self.genesis_helm_config_fn = Some(genesis_helm_config_fn); + self + } + + pub fn with_validator_override_node_config_fn(mut self, f: OverrideNodeConfigFn) -> Self { + self.validator_override_node_config_fn = Some(f); + self + } + + pub fn with_fullnode_override_node_config_fn(mut self, f: OverrideNodeConfigFn) -> Self { + self.fullnode_override_node_config_fn = Some(f); + self + } + + pub fn with_multi_region_config(mut self) -> Self { + self.multi_region_config = true; + self + } + + pub fn with_validator_resource_override( + mut self, + resource_override: NodeResourceOverride, + ) -> Self { + self.validator_resource_override = resource_override; + self + } + + pub fn with_fullnode_resource_override( + mut self, + resource_override: NodeResourceOverride, + ) -> Self { + self.fullnode_resource_override = resource_override; + self + } + + fn override_node_config_from_fn(config_fn: OverrideNodeConfigFn) -> OverrideNodeConfig { + let mut override_config = NodeConfig::default(); + let mut base_config = NodeConfig::default(); + config_fn(&mut override_config, &mut base_config); + OverrideNodeConfig::new(override_config, base_config) + } + + /// Builds a function that can be used to override the default helm values for the validator and fullnode. + /// If a configuration is intended to be set for all nodes, set the value in the default helm values file: + /// testsuite/forge/src/backend/k8s/helm-values/aptos-node-default-values.yaml + pub fn build_node_helm_config_fn(&self, retain_debug_logs: bool) -> Option { + let validator_override_node_config = self + .validator_override_node_config_fn + .clone() + .map(|config_fn| Self::override_node_config_from_fn(config_fn)); + let fullnode_override_node_config = self + .fullnode_override_node_config_fn + .clone() + .map(|config_fn| Self::override_node_config_from_fn(config_fn)); + let multi_region_config = self.multi_region_config; + let existing_db_tag = self.existing_db_tag.clone(); + let validator_resource_override = self.validator_resource_override; + let fullnode_resource_override = self.fullnode_resource_override; + + // Override specific helm values. See reference: terraform/helm/aptos-node/values.yaml + Some(Arc::new(move |helm_values: &mut serde_yaml::Value| { + if let Some(override_config) = &validator_override_node_config { + helm_values["validator"]["config"] = override_config.get_yaml().unwrap(); + } + if let Some(override_config) = &fullnode_override_node_config { + helm_values["fullnode"]["config"] = override_config.get_yaml().unwrap(); + } + if multi_region_config { + helm_values["multicluster"]["enabled"] = true.into(); + // Create headless services for validators and fullnodes. + // Note: chaos-mesh will not work with clusterIP services. + helm_values["service"]["validator"]["internal"]["type"] = "ClusterIP".into(); + helm_values["service"]["validator"]["internal"]["headless"] = true.into(); + helm_values["service"]["fullnode"]["internal"]["type"] = "ClusterIP".into(); + helm_values["service"]["fullnode"]["internal"]["headless"] = true.into(); + } + if let Some(existing_db_tag) = &existing_db_tag { + helm_values["validator"]["storage"]["labels"]["tag"] = + existing_db_tag.clone().into(); + helm_values["fullnode"]["storage"]["labels"]["tag"] = + existing_db_tag.clone().into(); + } + + // validator resource overrides + if let Some(cpu_cores) = validator_resource_override.cpu_cores { + helm_values["validator"]["resources"]["requests"]["cpu"] = cpu_cores.into(); + helm_values["validator"]["resources"]["limits"]["cpu"] = cpu_cores.into(); + } + if let Some(memory_gib) = validator_resource_override.memory_gib { + helm_values["validator"]["resources"]["requests"]["memory"] = + format!("{}Gi", memory_gib).into(); + helm_values["validator"]["resources"]["limits"]["memory"] = + format!("{}Gi", memory_gib).into(); + } + if let Some(storage_gib) = validator_resource_override.storage_gib { + helm_values["validator"]["storage"]["size"] = format!("{}Gi", storage_gib).into(); + } + // fullnode resource overrides + if let Some(cpu_cores) = fullnode_resource_override.cpu_cores { + helm_values["fullnode"]["resources"]["requests"]["cpu"] = cpu_cores.into(); + helm_values["fullnode"]["resources"]["limits"]["cpu"] = cpu_cores.into(); + } + if let Some(memory_gib) = fullnode_resource_override.memory_gib { + helm_values["fullnode"]["resources"]["requests"]["memory"] = + format!("{}Gi", memory_gib).into(); + helm_values["fullnode"]["resources"]["limits"]["memory"] = + format!("{}Gi", memory_gib).into(); + } + if let Some(storage_gib) = fullnode_resource_override.storage_gib { + helm_values["fullnode"]["storage"]["size"] = format!("{}Gi", storage_gib).into(); + } + + if retain_debug_logs { + helm_values["validator"]["podAnnotations"]["aptos.dev/min-log-level-to-retain"] = + serde_yaml::Value::String("debug".to_owned()); + helm_values["fullnode"]["podAnnotations"]["aptos.dev/min-log-level-to-retain"] = + serde_yaml::Value::String("debug".to_owned()); + helm_values["validator"]["rust_log"] = "debug,hyper=off".into(); + helm_values["fullnode"]["rust_log"] = "debug,hyper=off".into(); + } + helm_values["validator"]["config"]["storage"]["rocksdb_configs"] + ["enable_storage_sharding"] = true.into(); + helm_values["fullnode"]["config"]["storage"]["rocksdb_configs"] + ["enable_storage_sharding"] = true.into(); + helm_values["validator"]["config"]["indexer_db_config"]["enable_event"] = true.into(); + helm_values["fullnode"]["config"]["indexer_db_config"]["enable_event"] = true.into(); + })) + } + + pub fn with_initial_version(mut self, initial_version: InitialVersion) -> Self { + self.initial_version = initial_version; + self + } + + pub fn with_genesis_module_bundle(mut self, bundle: ReleaseBundle) -> Self { + self.genesis_config = Some(GenesisConfig::Bundle(bundle)); + self + } + + pub fn with_genesis_modules_path(mut self, genesis_modules: String) -> Self { + self.genesis_config = Some(GenesisConfig::Path(genesis_modules)); + self + } + + pub fn with_emit_job(mut self, emit_job_request: EmitJobRequest) -> Self { + self.emit_job_request = emit_job_request; + self + } + + pub fn get_emit_job(&self) -> &EmitJobRequest { + &self.emit_job_request + } + + pub fn with_success_criteria(mut self, success_criteria: SuccessCriteria) -> Self { + self.success_criteria = success_criteria; + self + } + + pub fn get_success_criteria_mut(&mut self) -> &mut SuccessCriteria { + &mut self.success_criteria + } + + pub fn with_existing_db(mut self, tag: String) -> Self { + self.existing_db_tag = Some(tag); + self + } + + pub fn number_of_tests(&self) -> usize { + self.admin_tests.len() + self.network_tests.len() + self.aptos_tests.len() + } + + pub fn all_tests(&self) -> Vec>> { + self.admin_tests + .iter() + .map(|t| Box::new(AnyTestRef::Admin(t.as_ref()))) + .chain( + self.network_tests + .iter() + .map(|t| Box::new(AnyTestRef::Network(t.as_ref()))), + ) + .chain( + self.aptos_tests + .iter() + .map(|t| Box::new(AnyTestRef::Aptos(t.as_ref()))), + ) + .collect() + } +} + +impl Default for ForgeConfig { + fn default() -> Self { + let forge_run_mode = ForgeRunnerMode::try_from_env().unwrap_or(ForgeRunnerMode::K8s); + let success_criteria = if forge_run_mode == ForgeRunnerMode::Local { + SuccessCriteria::new(600).add_no_restarts() + } else { + SuccessCriteria::new(3500) + .add_no_restarts() + .add_system_metrics_threshold(SystemMetricsThreshold::new( + // Check that we don't use more than 12 CPU cores for 30% of the time. + MetricsThreshold::new(12.0, 30), + // Check that we don't use more than 10 GB of memory for 30% of the time. + MetricsThreshold::new_gb(10.0, 30), + )) + }; + Self { + suite_name: None, + aptos_tests: vec![], + admin_tests: vec![], + network_tests: vec![], + initial_validator_count: NonZeroUsize::new(1).unwrap(), + initial_fullnode_count: 0, + initial_version: InitialVersion::Oldest, + genesis_config: None, + genesis_helm_config_fn: None, + validator_override_node_config_fn: None, + fullnode_override_node_config_fn: None, + multi_region_config: false, + emit_job_request: EmitJobRequest::default().mode(EmitJobMode::MaxLoad { + mempool_backlog: 40000, + }), + success_criteria, + existing_db_tag: None, + validator_resource_override: NodeResourceOverride::default(), + fullnode_resource_override: NodeResourceOverride::default(), + retain_debug_logs: false, + } + } +} diff --git a/testsuite/forge/src/interface/test.rs b/testsuite/forge/src/interface/test.rs index 72c78e6a64514..d3f6c9244b89c 100644 --- a/testsuite/forge/src/interface/test.rs +++ b/testsuite/forge/src/interface/test.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 use rand::SeedableRng; +use std::borrow::Cow; /// Whether a test is expected to fail or not #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] @@ -12,6 +13,22 @@ pub enum ShouldFail { YesWithMessage(&'static str), } +#[derive(Debug, Clone)] +pub struct TestDetails { + pub name: String, + pub reporting_name: String, +} + +impl TestDetails { + pub fn name(&self) -> String { + self.name.clone() + } + + pub fn reporting_name(&self) -> String { + self.reporting_name.clone() + } +} + /// Represents a Test in Forge /// /// This is meant to be a super trait of the other test interfaces. @@ -28,6 +45,18 @@ pub trait Test: Send + Sync { fn should_fail(&self) -> ShouldFail { ShouldFail::No } + + /// Name used specifically for external reporting + fn reporting_name(&self) -> Cow<'static, str> { + Cow::Borrowed(self.name()) + } + + fn details(&self) -> TestDetails { + TestDetails { + name: self.name().to_string(), + reporting_name: self.reporting_name().to_string(), + } + } } impl Test for &T { diff --git a/testsuite/forge/src/lib.rs b/testsuite/forge/src/lib.rs index bdd8ec3cc6eeb..3c8dffb773d1b 100644 --- a/testsuite/forge/src/lib.rs +++ b/testsuite/forge/src/lib.rs @@ -9,6 +9,7 @@ pub use anyhow::Result; mod interface; pub use interface::*; +pub mod observer; mod runner; pub use runner::*; @@ -19,6 +20,7 @@ pub use backend::*; mod report; pub use report::*; +pub mod result; mod github; pub use github::*; @@ -29,3 +31,6 @@ pub use slack::*; pub mod success_criteria; pub mod test_utils; + +pub mod config; +pub use config::ForgeConfig; diff --git a/testsuite/forge/src/observer/junit.rs b/testsuite/forge/src/observer/junit.rs new file mode 100644 index 0000000000000..30ddce90db671 --- /dev/null +++ b/testsuite/forge/src/observer/junit.rs @@ -0,0 +1,79 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use crate::{ + result::{TestObserver, TestResult}, + TestDetails, +}; +use anyhow::Result; +use quick_junit::{NonSuccessKind, Report, TestCase, TestSuite}; +use std::sync::Mutex; +use uuid::Uuid; + +pub struct JunitTestObserver { + name: String, + path: String, + results: Mutex>, +} + +impl JunitTestObserver { + pub fn new(name: String, path: String) -> Self { + Self { + name, + path, + results: Mutex::new(vec![]), + } + } +} + +impl TestObserver for JunitTestObserver { + fn name(&self) -> String { + format!("{} junit observer", self.name) + } + + fn handle_result(&self, details: &TestDetails, result: &TestResult) -> Result<()> { + self.results + .lock() + .unwrap() + .push((details.reporting_name(), result.clone())); + Ok(()) + } + + fn finish(&self) -> Result<()> { + let mut report = Report::new("forge"); + let uuid = Uuid::new_v4(); + report.set_uuid(uuid); + + let mut suite = TestSuite::new(self.name.clone()); + for (test_name, result) in self.results.lock().unwrap().iter() { + let status = match result { + TestResult::Ok => quick_junit::TestCaseStatus::success(), + TestResult::FailedWithMsg(msg) => { + // Not 100% sure what the difference between failure and error is. + let mut status = + quick_junit::TestCaseStatus::non_success(NonSuccessKind::Failure); + status.set_message(msg.clone()); + status + }, + }; + + let test_case = TestCase::new(test_name.clone(), status); + suite.add_test_case(test_case); + } + + report.add_test_suite(suite); + + // Write to stdout so github test runner can parse it easily + println!("=== BEGIN JUNIT ==="); + let stdout = std::io::stdout(); + report.serialize(stdout)?; + println!("=== END JUNIT ==="); + + // Also write to the file + let writer = std::fs::File::create(&self.path)?; + report.serialize(writer)?; + + Ok(()) + } +} diff --git a/testsuite/forge/src/observer/mod.rs b/testsuite/forge/src/observer/mod.rs new file mode 100644 index 0000000000000..e5948202b9e2d --- /dev/null +++ b/testsuite/forge/src/observer/mod.rs @@ -0,0 +1,5 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +pub mod junit; diff --git a/testsuite/forge/src/result.rs b/testsuite/forge/src/result.rs new file mode 100644 index 0000000000000..0c96d2d1f1d19 --- /dev/null +++ b/testsuite/forge/src/result.rs @@ -0,0 +1,159 @@ +// Copyright © Aptos Foundation +// Parts of the project are originally copyright © Meta Platforms, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use crate::TestDetails; +use anyhow::{bail, Result}; +use std::{ + fmt::{Display, Formatter}, + io::{self, Write as _}, +}; +use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; + +#[derive(Debug, Clone)] +pub enum TestResult { + Ok, + FailedWithMsg(String), +} + +impl Display for TestResult { + fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { + match self { + TestResult::Ok => write!(f, "Test Ok"), + TestResult::FailedWithMsg(msg) => write!(f, "Test Failed: {}", msg), + } + } +} + +pub trait TestObserver { + fn name(&self) -> String; + fn handle_result(&self, details: &TestDetails, result: &TestResult) -> Result<()>; + fn finish(&self) -> Result<()>; +} + +pub struct TestSummary { + stdout: StandardStream, + total: usize, + filtered_out: usize, + passed: usize, + failed: Vec, + observers: Vec>, +} + +impl TestSummary { + pub fn new(total: usize, filtered_out: usize) -> Self { + Self { + stdout: StandardStream::stdout(ColorChoice::Auto), + total, + filtered_out, + passed: 0, + failed: Vec::new(), + observers: Vec::new(), + } + } + + pub fn add_observer(&mut self, observer: Box) { + self.observers.push(observer); + } + + pub fn handle_result(&mut self, details: TestDetails, result: TestResult) -> Result<()> { + write!(self.stdout, "test {} ... ", details.name())?; + match result.clone() { + TestResult::Ok => { + self.passed += 1; + self.write_ok()?; + }, + TestResult::FailedWithMsg(msg) => { + self.failed.push(details.name()); + self.write_failed()?; + writeln!(self.stdout)?; + + write!(self.stdout, "Error: {}", msg)?; + }, + } + writeln!(self.stdout)?; + let mut errors = vec![]; + for observer in &self.observers { + let result = observer.handle_result(&details, &result); + if let Err(e) = result { + errors.push(format!("{}: {}", observer.name(), e)); + } + } + if !errors.is_empty() { + bail!("Failed to handle_result in observers: {:?}", errors); + } + Ok(()) + } + + pub fn finish(&self) -> Result<()> { + let mut errors = vec![]; + for observer in &self.observers { + let result = observer.finish(); + if let Err(e) = result { + errors.push(format!("{}: {}", observer.name(), e)); + } + } + if !errors.is_empty() { + bail!("Failed to finish observers: {:?}", errors); + } + Ok(()) + } + + fn write_ok(&mut self) -> io::Result<()> { + self.stdout + .set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; + write!(self.stdout, "ok")?; + self.stdout.reset()?; + Ok(()) + } + + fn write_failed(&mut self) -> io::Result<()> { + self.stdout + .set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; + write!(self.stdout, "FAILED")?; + self.stdout.reset()?; + Ok(()) + } + + pub fn write_starting_msg(&mut self) -> io::Result<()> { + writeln!(self.stdout)?; + writeln!( + self.stdout, + "running {} tests", + self.total - self.filtered_out + )?; + Ok(()) + } + + pub fn write_summary(&mut self) -> io::Result<()> { + // Print out the failing tests + if !self.failed.is_empty() { + writeln!(self.stdout)?; + writeln!(self.stdout, "failures:")?; + for name in &self.failed { + writeln!(self.stdout, " {}", name)?; + } + } + + writeln!(self.stdout)?; + write!(self.stdout, "test result: ")?; + if self.failed.is_empty() { + self.write_ok()?; + } else { + self.write_failed()?; + } + writeln!( + self.stdout, + ". {} passed; {} failed; {} filtered out", + self.passed, + self.failed.len(), + self.filtered_out + )?; + writeln!(self.stdout)?; + Ok(()) + } + + pub fn success(&self) -> bool { + self.failed.is_empty() + } +} diff --git a/testsuite/forge/src/runner.rs b/testsuite/forge/src/runner.rs index 73e0262708f9e..5545f9ef2939b 100644 --- a/testsuite/forge/src/runner.rs +++ b/testsuite/forge/src/runner.rs @@ -4,16 +4,18 @@ // TODO going to remove random seed once cluster deployment supports re-run genesis use crate::{ - success_criteria::{MetricsThreshold, SuccessCriteria, SystemMetricsThreshold}, - *, + config::ForgeConfig, + observer::junit::JunitTestObserver, + result::{TestResult, TestSummary}, + AdminContext, AdminTest, AptosContext, AptosTest, CoreContext, Factory, NetworkContext, + NetworkContextSynchronizer, NetworkTest, ShouldFail, Test, TestReport, Version, + NAMESPACE_CLEANUP_DURATION_BUFFER_SECS, }; use anyhow::{bail, format_err, Error, Result}; -use aptos_config::config::{NodeConfig, OverrideNodeConfig}; -use aptos_framework::ReleaseBundle; +use aptos_config::config::NodeConfig; use clap::{Parser, ValueEnum}; use rand::{rngs::OsRng, Rng, SeedableRng}; use std::{ - fmt::{Display, Formatter}, io::{self, Write}, num::NonZeroUsize, process, @@ -21,7 +23,7 @@ use std::{ sync::Arc, time::Duration, }; -use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; +use sugars::boxed; use tokio::runtime::Runtime; const KUBERNETES_SERVICE_HOST: &str = "KUBERNETES_SERVICE_HOST"; @@ -78,6 +80,9 @@ pub struct Options { /// Retain debug logs and above for all nodes instead of just the first 5 nodes #[clap(long, default_value = "false", env = "FORGE_RETAIN_DEBUG_LOGS")] retain_debug_logs: bool, + /// Optional path to write junit xml test report + #[clap(long, env = "FORGE_JUNIT_XML_PATH")] + junit_xml_path: Option, } impl Options { @@ -130,286 +135,6 @@ pub struct NodeResourceOverride { pub storage_gib: Option, } -pub struct ForgeConfig { - aptos_tests: Vec>, - admin_tests: Vec>, - network_tests: Vec>, - - /// The initial number of validators to spawn when the test harness creates a swarm - initial_validator_count: NonZeroUsize, - - /// The initial number of fullnodes to spawn when the test harness creates a swarm - initial_fullnode_count: usize, - - /// The initial version to use when the test harness creates a swarm - initial_version: InitialVersion, - - /// The initial genesis modules to use when starting a network - genesis_config: Option, - - /// Optional genesis helm values init function - genesis_helm_config_fn: Option, - - /// Optional validator node config override function - validator_override_node_config_fn: Option, - - /// Optional fullnode node config override function - fullnode_override_node_config_fn: Option, - - multi_region_config: bool, - - /// Transaction workload to run on the swarm - emit_job_request: EmitJobRequest, - - /// Success criteria - success_criteria: SuccessCriteria, - - /// The label of existing DBs to use, if None, will create new db. - existing_db_tag: Option, - - validator_resource_override: NodeResourceOverride, - - fullnode_resource_override: NodeResourceOverride, - - /// Retain debug logs and above for all nodes instead of just the first 5 nodes - retain_debug_logs: bool, -} - -impl ForgeConfig { - pub fn new() -> Self { - Self::default() - } - - pub fn add_aptos_test(mut self, aptos_test: T) -> Self { - self.aptos_tests.push(Box::new(aptos_test)); - self - } - - pub fn with_aptos_tests(mut self, aptos_tests: Vec>) -> Self { - self.aptos_tests = aptos_tests; - self - } - - pub fn add_admin_test(mut self, admin_test: T) -> Self { - self.admin_tests.push(Box::new(admin_test)); - self - } - - pub fn with_admin_tests(mut self, admin_tests: Vec>) -> Self { - self.admin_tests = admin_tests; - self - } - - pub fn add_network_test(mut self, network_test: T) -> Self { - self.network_tests.push(Box::new(network_test)); - self - } - - pub fn with_network_tests(mut self, network_tests: Vec>) -> Self { - self.network_tests = network_tests; - self - } - - pub fn with_initial_validator_count(mut self, initial_validator_count: NonZeroUsize) -> Self { - self.initial_validator_count = initial_validator_count; - self - } - - pub fn with_initial_fullnode_count(mut self, initial_fullnode_count: usize) -> Self { - self.initial_fullnode_count = initial_fullnode_count; - self - } - - pub fn with_genesis_helm_config_fn(mut self, genesis_helm_config_fn: GenesisConfigFn) -> Self { - self.genesis_helm_config_fn = Some(genesis_helm_config_fn); - self - } - - pub fn with_validator_override_node_config_fn(mut self, f: OverrideNodeConfigFn) -> Self { - self.validator_override_node_config_fn = Some(f); - self - } - - pub fn with_fullnode_override_node_config_fn(mut self, f: OverrideNodeConfigFn) -> Self { - self.fullnode_override_node_config_fn = Some(f); - self - } - - pub fn with_multi_region_config(mut self) -> Self { - self.multi_region_config = true; - self - } - - pub fn with_validator_resource_override( - mut self, - resource_override: NodeResourceOverride, - ) -> Self { - self.validator_resource_override = resource_override; - self - } - - pub fn with_fullnode_resource_override( - mut self, - resource_override: NodeResourceOverride, - ) -> Self { - self.fullnode_resource_override = resource_override; - self - } - - fn override_node_config_from_fn(config_fn: OverrideNodeConfigFn) -> OverrideNodeConfig { - let mut override_config = NodeConfig::default(); - let mut base_config = NodeConfig::default(); - config_fn(&mut override_config, &mut base_config); - OverrideNodeConfig::new(override_config, base_config) - } - - /// Builds a function that can be used to override the default helm values for the validator and fullnode. - /// If a configuration is intended to be set for all nodes, set the value in the default helm values file: - /// testsuite/forge/src/backend/k8s/helm-values/aptos-node-default-values.yaml - pub fn build_node_helm_config_fn(&self, retain_debug_logs: bool) -> Option { - let validator_override_node_config = self - .validator_override_node_config_fn - .clone() - .map(|config_fn| Self::override_node_config_from_fn(config_fn)); - let fullnode_override_node_config = self - .fullnode_override_node_config_fn - .clone() - .map(|config_fn| Self::override_node_config_from_fn(config_fn)); - let multi_region_config = self.multi_region_config; - let existing_db_tag = self.existing_db_tag.clone(); - let validator_resource_override = self.validator_resource_override; - let fullnode_resource_override = self.fullnode_resource_override; - - // Override specific helm values. See reference: terraform/helm/aptos-node/values.yaml - Some(Arc::new(move |helm_values: &mut serde_yaml::Value| { - if let Some(override_config) = &validator_override_node_config { - helm_values["validator"]["config"] = override_config.get_yaml().unwrap(); - } - if let Some(override_config) = &fullnode_override_node_config { - helm_values["fullnode"]["config"] = override_config.get_yaml().unwrap(); - } - if multi_region_config { - helm_values["multicluster"]["enabled"] = true.into(); - // Create headless services for validators and fullnodes. - // Note: chaos-mesh will not work with clusterIP services. - helm_values["service"]["validator"]["internal"]["type"] = "ClusterIP".into(); - helm_values["service"]["validator"]["internal"]["headless"] = true.into(); - helm_values["service"]["fullnode"]["internal"]["type"] = "ClusterIP".into(); - helm_values["service"]["fullnode"]["internal"]["headless"] = true.into(); - } - if let Some(existing_db_tag) = &existing_db_tag { - helm_values["validator"]["storage"]["labels"]["tag"] = - existing_db_tag.clone().into(); - helm_values["fullnode"]["storage"]["labels"]["tag"] = - existing_db_tag.clone().into(); - } - - // validator resource overrides - if let Some(cpu_cores) = validator_resource_override.cpu_cores { - helm_values["validator"]["resources"]["requests"]["cpu"] = cpu_cores.into(); - helm_values["validator"]["resources"]["limits"]["cpu"] = cpu_cores.into(); - } - if let Some(memory_gib) = validator_resource_override.memory_gib { - helm_values["validator"]["resources"]["requests"]["memory"] = - format!("{}Gi", memory_gib).into(); - helm_values["validator"]["resources"]["limits"]["memory"] = - format!("{}Gi", memory_gib).into(); - } - if let Some(storage_gib) = validator_resource_override.storage_gib { - helm_values["validator"]["storage"]["size"] = format!("{}Gi", storage_gib).into(); - } - // fullnode resource overrides - if let Some(cpu_cores) = fullnode_resource_override.cpu_cores { - helm_values["fullnode"]["resources"]["requests"]["cpu"] = cpu_cores.into(); - helm_values["fullnode"]["resources"]["limits"]["cpu"] = cpu_cores.into(); - } - if let Some(memory_gib) = fullnode_resource_override.memory_gib { - helm_values["fullnode"]["resources"]["requests"]["memory"] = - format!("{}Gi", memory_gib).into(); - helm_values["fullnode"]["resources"]["limits"]["memory"] = - format!("{}Gi", memory_gib).into(); - } - if let Some(storage_gib) = fullnode_resource_override.storage_gib { - helm_values["fullnode"]["storage"]["size"] = format!("{}Gi", storage_gib).into(); - } - - if retain_debug_logs { - helm_values["validator"]["podAnnotations"]["aptos.dev/min-log-level-to-retain"] = - serde_yaml::Value::String("debug".to_owned()); - helm_values["fullnode"]["podAnnotations"]["aptos.dev/min-log-level-to-retain"] = - serde_yaml::Value::String("debug".to_owned()); - helm_values["validator"]["rust_log"] = "debug,hyper=off".into(); - helm_values["fullnode"]["rust_log"] = "debug,hyper=off".into(); - } - helm_values["validator"]["config"]["storage"]["rocksdb_configs"] - ["enable_storage_sharding"] = true.into(); - helm_values["fullnode"]["config"]["storage"]["rocksdb_configs"] - ["enable_storage_sharding"] = true.into(); - helm_values["validator"]["config"]["indexer_db_config"]["enable_event"] = true.into(); - helm_values["fullnode"]["config"]["indexer_db_config"]["enable_event"] = true.into(); - })) - } - - pub fn with_initial_version(mut self, initial_version: InitialVersion) -> Self { - self.initial_version = initial_version; - self - } - - pub fn with_genesis_module_bundle(mut self, bundle: ReleaseBundle) -> Self { - self.genesis_config = Some(GenesisConfig::Bundle(bundle)); - self - } - - pub fn with_genesis_modules_path(mut self, genesis_modules: String) -> Self { - self.genesis_config = Some(GenesisConfig::Path(genesis_modules)); - self - } - - pub fn with_emit_job(mut self, emit_job_request: EmitJobRequest) -> Self { - self.emit_job_request = emit_job_request; - self - } - - pub fn get_emit_job(&self) -> &EmitJobRequest { - &self.emit_job_request - } - - pub fn with_success_criteria(mut self, success_criteria: SuccessCriteria) -> Self { - self.success_criteria = success_criteria; - self - } - - pub fn get_success_criteria_mut(&mut self) -> &mut SuccessCriteria { - &mut self.success_criteria - } - - pub fn with_existing_db(mut self, tag: String) -> Self { - self.existing_db_tag = Some(tag); - self - } - - pub fn number_of_tests(&self) -> usize { - self.admin_tests.len() + self.network_tests.len() + self.aptos_tests.len() - } - - pub fn all_tests(&self) -> Vec>> { - self.admin_tests - .iter() - .map(|t| Box::new(AnyTestRef::Admin(t.as_ref()))) - .chain( - self.network_tests - .iter() - .map(|t| Box::new(AnyTestRef::Network(t.as_ref()))), - ) - .chain( - self.aptos_tests - .iter() - .map(|t| Box::new(AnyTestRef::Aptos(t.as_ref()))), - ) - .collect() - } -} - // Workaround way to implement all_tests, for: // error[E0658]: cannot cast `dyn interface::admin::AdminTest` to `dyn interface::test::Test`, trait upcasting coercion is experimental pub enum AnyTestRef<'a> { @@ -474,45 +199,6 @@ impl ForgeRunnerMode { } } -impl Default for ForgeConfig { - fn default() -> Self { - let forge_run_mode = ForgeRunnerMode::try_from_env().unwrap_or(ForgeRunnerMode::K8s); - let success_criteria = if forge_run_mode == ForgeRunnerMode::Local { - SuccessCriteria::new(600).add_no_restarts() - } else { - SuccessCriteria::new(3500) - .add_no_restarts() - .add_system_metrics_threshold(SystemMetricsThreshold::new( - // Check that we don't use more than 12 CPU cores for 30% of the time. - MetricsThreshold::new(12.0, 30), - // Check that we don't use more than 10 GB of memory for 30% of the time. - MetricsThreshold::new_gb(10.0, 30), - )) - }; - Self { - aptos_tests: vec![], - admin_tests: vec![], - network_tests: vec![], - initial_validator_count: NonZeroUsize::new(1).unwrap(), - initial_fullnode_count: 0, - initial_version: InitialVersion::Oldest, - genesis_config: None, - genesis_helm_config_fn: None, - validator_override_node_config_fn: None, - fullnode_override_node_config_fn: None, - multi_region_config: false, - emit_job_request: EmitJobRequest::default().mode(EmitJobMode::MaxLoad { - mempool_backlog: 40000, - }), - success_criteria, - existing_db_tag: None, - validator_resource_override: NodeResourceOverride::default(), - fullnode_resource_override: NodeResourceOverride::default(), - retain_debug_logs: false, - } - } -} - pub struct Forge<'cfg, F> { options: &'cfg Options, tests: ForgeConfig, @@ -568,6 +254,15 @@ impl<'cfg, F: Factory> Forge<'cfg, F> { let mut report = TestReport::new(); let mut summary = TestSummary::new(test_count, filtered_out); + + // Optionally write junit xml test report for external processing + if let Some(junit_xml_path) = self.options.junit_xml_path.as_ref() { + let junit_observer = JunitTestObserver::new( + self.tests.get_suite_name().unwrap_or("local".to_string()), + junit_xml_path.to_owned(), + ); + summary.add_observer(boxed!(junit_observer)); + } summary.write_starting_msg()?; if test_count > 0 { @@ -603,9 +298,9 @@ impl<'cfg, F: Factory> Forge<'cfg, F> { swarm.chain_info().into_aptos_public_info(), &mut report, ); - let result = run_test(|| runtime.block_on(test.run(&mut aptos_ctx))); + let result = process_test_result(runtime.block_on(test.run(&mut aptos_ctx))); report.report_text(result.to_string()); - summary.handle_result(test.name().to_owned(), result)?; + summary.handle_result(test.details(), result)?; } // Run AdminTests @@ -615,9 +310,9 @@ impl<'cfg, F: Factory> Forge<'cfg, F> { swarm.chain_info(), &mut report, ); - let result = run_test(|| test.run(&mut admin_ctx)); + let result = process_test_result(test.run(&mut admin_ctx)); report.report_text(result.to_string()); - summary.handle_result(test.name().to_owned(), result)?; + summary.handle_result(test.details(), result)?; } let logs_location = swarm.logs_location(); @@ -634,17 +329,18 @@ impl<'cfg, F: Factory> Forge<'cfg, F> { let handle = network_ctx.runtime.handle().clone(); let _handle_context = handle.enter(); let network_ctx = NetworkContextSynchronizer::new(network_ctx, handle.clone()); - let result = run_test(|| handle.block_on(test.run(network_ctx.clone()))); + let result = process_test_result(handle.block_on(test.run(network_ctx.clone()))); // explicitly keep network context in scope so that its created tokio Runtime drops after all the stuff has run. let NetworkContextSynchronizer { ctx, handle } = network_ctx; drop(handle); let ctx = Arc::into_inner(ctx).unwrap().into_inner(); drop(ctx); report.report_text(result.to_string()); - summary.handle_result(test.name().to_owned(), result)?; + summary.handle_result(test.details(), result)?; } report.print_report(); + summary.finish()?; io::stdout().flush()?; io::stderr().flush()?; @@ -692,22 +388,8 @@ impl<'cfg, F: Factory> Forge<'cfg, F> { } } -enum TestResult { - Ok, - FailedWithMsg(String), -} - -impl Display for TestResult { - fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { - match self { - TestResult::Ok => write!(f, "Test Ok"), - TestResult::FailedWithMsg(msg) => write!(f, "Test Failed: {}", msg), - } - } -} - -fn run_test Result<()>>(f: F) -> TestResult { - match f() { +fn process_test_result(result: Result<()>) -> TestResult { + match result { Ok(()) => TestResult::Ok, Err(e) => { let is_triggerd_by_github_actions = @@ -721,103 +403,6 @@ fn run_test Result<()>>(f: F) -> TestResult { } } -struct TestSummary { - stdout: StandardStream, - total: usize, - filtered_out: usize, - passed: usize, - failed: Vec, -} - -impl TestSummary { - fn new(total: usize, filtered_out: usize) -> Self { - Self { - stdout: StandardStream::stdout(ColorChoice::Auto), - total, - filtered_out, - passed: 0, - failed: Vec::new(), - } - } - - fn handle_result(&mut self, name: String, result: TestResult) -> io::Result<()> { - write!(self.stdout, "test {} ... ", name)?; - match result { - TestResult::Ok => { - self.passed += 1; - self.write_ok()?; - }, - TestResult::FailedWithMsg(msg) => { - self.failed.push(name); - self.write_failed()?; - writeln!(self.stdout)?; - - write!(self.stdout, "Error: {}", msg)?; - }, - } - writeln!(self.stdout)?; - Ok(()) - } - - fn write_ok(&mut self) -> io::Result<()> { - self.stdout - .set_color(ColorSpec::new().set_fg(Some(Color::Green)))?; - write!(self.stdout, "ok")?; - self.stdout.reset()?; - Ok(()) - } - - fn write_failed(&mut self) -> io::Result<()> { - self.stdout - .set_color(ColorSpec::new().set_fg(Some(Color::Red)))?; - write!(self.stdout, "FAILED")?; - self.stdout.reset()?; - Ok(()) - } - - fn write_starting_msg(&mut self) -> io::Result<()> { - writeln!(self.stdout)?; - writeln!( - self.stdout, - "running {} tests", - self.total - self.filtered_out - )?; - Ok(()) - } - - fn write_summary(&mut self) -> io::Result<()> { - // Print out the failing tests - if !self.failed.is_empty() { - writeln!(self.stdout)?; - writeln!(self.stdout, "failures:")?; - for name in &self.failed { - writeln!(self.stdout, " {}", name)?; - } - } - - writeln!(self.stdout)?; - write!(self.stdout, "test result: ")?; - if self.failed.is_empty() { - self.write_ok()?; - } else { - self.write_failed()?; - } - writeln!( - self.stdout, - ". {} passed; {} failed; {} filtered out", - self.passed, - self.failed.len(), - self.filtered_out - )?; - writeln!(self.stdout)?; - Ok(()) - } - - fn success(&self) -> bool { - self.failed.is_empty() - } -} - #[cfg(test)] mod test { use super::*; diff --git a/testsuite/forge_test.py b/testsuite/forge_test.py index 5b6c4b567e674..a337e06fd5109 100644 --- a/testsuite/forge_test.py +++ b/testsuite/forge_test.py @@ -1,6 +1,7 @@ from contextlib import ExitStack import json import os +import textwrap import unittest import tempfile from datetime import datetime, timezone, timedelta @@ -14,6 +15,8 @@ import forge from forge import ( + BEGIN_JUNIT, + END_JUNIT, ForgeCluster, ForgeConfigBackend, ForgeContext, @@ -29,6 +32,7 @@ find_recent_images, find_recent_images_by_profile_or_features, format_comment, + format_junit_xml, format_pre_comment, format_report, get_all_forge_jobs, @@ -167,6 +171,7 @@ def fake_context( forge_username="banana-eater", forge_blocking=True, forge_retain_debug_logs="true", + forge_junit_xml_path=None, github_actions="false", github_job_url="https://banana", ) @@ -661,6 +666,25 @@ def testPossibleAuthFailureMessage(self) -> None: output = result.format(context) self.assertFixture(output, "testPossibleAuthFailureMessage.fixture") + def testFormatJunitXml(self) -> None: + result = ForgeResult.empty() + context = fake_context() + + result.set_output( + textwrap.dedent( + f""" + {BEGIN_JUNIT} + + blah + + {END_JUNIT} + """ + ) + ) + + output = format_junit_xml(context, result) + self.assertFixture(output, "testFormatJunitXml.fixture") + class ForgeMainTests(unittest.TestCase, AssertFixtureMixin): maxDiff = None diff --git a/testsuite/module-publish/src/main.rs b/testsuite/module-publish/src/main.rs index 9c428bbf0e1d5..7be0b3756122f 100644 --- a/testsuite/module-publish/src/main.rs +++ b/testsuite/module-publish/src/main.rs @@ -148,7 +148,7 @@ use std::collections::HashMap;"#, fn write_package(file: &mut File, package_path: PathBuf, package_name: &str) -> String { println!("Building package {}", package_name); // build package - let package = BuiltPackage::build(package_path, BuildOptions::default()) + let package = BuiltPackage::build(package_path, BuildOptions::move_2()) .expect("building package must succeed"); let code = package.extract_code(); let package_metadata = package.extract_metadata().expect("Metadata must exist"); diff --git a/testsuite/module-publish/src/packages/complex/sources/vector_picture.move b/testsuite/module-publish/src/packages/complex/sources/vector_picture.move index a727a589f2383..f556630227024 100644 --- a/testsuite/module-publish/src/packages/complex/sources/vector_picture.move +++ b/testsuite/module-publish/src/packages/complex/sources/vector_picture.move @@ -56,7 +56,7 @@ module 0xABCD::vector_picture { let vec = vector::empty(); let i = 0; while (i < length) { - vector::push_back(&mut vec, color); + vec.push_back(color); i = i + 1; }; let palette = Palette { vec }; @@ -70,7 +70,7 @@ module 0xABCD::vector_picture { if (!exists(caller_addr)) { let vec = vector::empty(); - vector::push_back(&mut vec, object::address_from_constructor_ref(&constructor_ref)); + vec.push_back(object::address_from_constructor_ref(&constructor_ref)); move_to( caller, @@ -80,7 +80,7 @@ module 0xABCD::vector_picture { ); } else { let all_palettes = borrow_global_mut(caller_addr); - vector::push_back(&mut all_palettes.all, object::address_from_constructor_ref(&constructor_ref)); + all_palettes.all.push_back(object::address_from_constructor_ref(&constructor_ref)); } } @@ -94,16 +94,16 @@ module 0xABCD::vector_picture { b: u8, ) acquires Palette, AllPalettes { let all_palettes = borrow_global(palette_addr); - let palette_addr = vector::borrow(&all_palettes.all, palette_index); + let palette_addr = all_palettes.all.borrow(palette_index); let palette = borrow_global_mut(*palette_addr); // Confirm the index is not out of bounds. - assert!(index < vector::length(&palette.vec), error::invalid_argument(E_INDEX_OUT_OF_BOUNDS)); + assert!(index < palette.vec.length(), error::invalid_argument(E_INDEX_OUT_OF_BOUNDS)); // Write the pixel. let color = Color { r, g, b }; - *vector::borrow_mut(&mut palette.vec, index) = color; + *palette.vec.borrow_mut(index) = color; } public entry fun check( @@ -112,14 +112,14 @@ module 0xABCD::vector_picture { index: u64, ) acquires Palette, AllPalettes { let all_palettes = borrow_global(palette_addr); - let palette_addr = vector::borrow(&all_palettes.all, palette_index); + let palette_addr = all_palettes.all.borrow(palette_index); let palette = borrow_global_mut(*palette_addr); // Confirm the index is not out of bounds. - assert!(index < vector::length(&palette.vec), error::invalid_argument(E_INDEX_OUT_OF_BOUNDS)); + assert!(index < palette.vec.length(), error::invalid_argument(E_INDEX_OUT_OF_BOUNDS)); - let color = vector::borrow(&mut palette.vec, index); + let color = palette.vec.borrow(index); assert!(color.r != 255 || color.g != 255 || color.b != 255, error::invalid_argument(E_MAX_COLOR)); } } diff --git a/testsuite/single_node_performance.py b/testsuite/single_node_performance.py index f57eda59c8f7d..7ca1aea5ce604 100755 --- a/testsuite/single_node_performance.py +++ b/testsuite/single_node_performance.py @@ -159,46 +159,46 @@ class RunGroupConfig: # transaction_type module_working_set_size executor_type count min_ratio max_ratio median CALIBRATION = """ -no-op 1 VM 15 0.922 1.06 42737.7 -no-op 1000 VM 15 0.879 1.024 23373.9 -apt-fa-transfer 1 VM 15 0.934 1.068 29963.1 -account-generation 1 VM 15 0.871 1.016 24567.9 -account-resource32-b 1 VM 8 0.879 1.048 38063.3 -modify-global-resource 1 VM 15 0.971 1.023 2839.5 -modify-global-resource 100 VM 8 0.927 1.015 37424.8 -publish-package 1 VM 15 0.963 1.036 143.4 -mix_publish_transfer 1 VM 15 0.968 1.048 2175 -batch100-transfer 1 VM 15 0.88 1.014 770.5 -vector-picture30k 1 VM 15 0.98 1.025 110.6 -vector-picture30k 100 VM 8 0.894 1.029 2033.8 -smart-table-picture30-k-with200-change 1 VM 15 0.974 1.062 21.5 -smart-table-picture30-k-with200-change 100 VM 8 0.983 1.038 411.5 -modify-global-resource-agg-v2 1 VM 15 0.867 1.082 38997.7 -modify-global-flag-agg-v2 1 VM 8 0.989 1.008 5648.5 -modify-global-bounded-agg-v2 1 VM 8 0.942 1.02 10303.1 -modify-global-milestone-agg-v2 1 VM 8 0.957 1.017 29851.6 -resource-groups-global-write-tag1-kb 1 VM 15 0.869 1.052 9391.5 -resource-groups-global-write-and-read-tag1-kb 1 VM 8 0.963 1.008 6432.7 -resource-groups-sender-write-tag1-kb 1 VM 8 0.982 1.086 20121.2 -resource-groups-sender-multi-change1-kb 1 VM 15 0.857 1.065 16862.9 -token-v1ft-mint-and-transfer 1 VM 8 0.962 1.035 1292.6 -token-v1ft-mint-and-transfer 100 VM 8 0.918 1.025 18747.7 -token-v1nft-mint-and-transfer-sequential 1 VM 8 0.973 1.023 805.5 -token-v1nft-mint-and-transfer-sequential 100 VM 8 0.902 1.015 13333.2 -coin-init-and-mint 1 VM 8 0.878 1.036 31056.8 -coin-init-and-mint 100 VM 8 0.906 1.032 25868.8 -fungible-asset-mint 1 VM 15 0.874 1.019 28045.4 -fungible-asset-mint 100 VM 8 0.928 1.047 21876 -no-op5-signers 1 VM 8 0.897 1.056 42970.1 -token-v2-ambassador-mint 1 VM 15 0.942 1.031 17842.6 -token-v2-ambassador-mint 100 VM 8 0.944 1.042 16270.3 -liquidity-pool-swap 1 VM 15 0.968 1.024 972.4 -liquidity-pool-swap 100 VM 8 0.964 1.043 11297.1 -liquidity-pool-swap-stable 1 VM 8 0.955 1.03 936.3 -liquidity-pool-swap-stable 100 VM 8 0.949 1.04 11116.3 -deserialize-u256 1 VM 8 0.935 1.043 41589.9 -no-op-fee-payer 1 VM 15 0.97 1.044 2124.5 -no-op-fee-payer 100 VM 8 0.934 1.023 28717.2 +no-op 1 VM 34 0.841 1.086 42046.2 +no-op 1000 VM 33 0.857 1.026 23125.1 +apt-fa-transfer 1 VM 34 0.843 1.057 29851.6 +account-generation 1 VM 34 0.843 1.046 24134.9 +account-resource32-b 1 VM 34 0.803 1.089 37283.8 +modify-global-resource 1 VM 34 0.841 1.017 2854.7 +modify-global-resource 100 VM 34 0.844 1.035 36514.1 +publish-package 1 VM 34 0.915 1.049 143.4 +mix_publish_transfer 1 VM 34 0.912 1.131 2149.7 +batch100-transfer 1 VM 33 0.823 1.037 754.2 +vector-picture30k 1 VM 33 0.892 1.018 112.4 +vector-picture30k 100 VM 34 0.706 1.03 2050.1 +smart-table-picture30-k-with200-change 1 VM 34 0.959 1.057 21.5 +smart-table-picture30-k-with200-change 100 VM 34 0.9 1.021 412.2 +modify-global-resource-agg-v2 1 VM 34 0.729 1.076 39288.2 +modify-global-flag-agg-v2 1 VM 34 0.948 1.016 5598.2 +modify-global-bounded-agg-v2 1 VM 34 0.881 1.06 9968.4 +modify-global-milestone-agg-v2 1 VM 34 0.831 1.029 29575.5 +resource-groups-global-write-tag1-kb 1 VM 34 0.933 1.051 9285.8 +resource-groups-global-write-and-read-tag1-kb 1 VM 34 0.9 1.016 6353 +resource-groups-sender-write-tag1-kb 1 VM 34 0.845 1.163 20568.6 +resource-groups-sender-multi-change1-kb 1 VM 34 0.888 1.116 17029.7 +token-v1ft-mint-and-transfer 1 VM 34 0.853 1.029 1455.7 +token-v1ft-mint-and-transfer 100 VM 34 0.801 1.021 20418.7 +token-v1nft-mint-and-transfer-sequential 1 VM 34 0.881 1.023 884.4 +token-v1nft-mint-and-transfer-sequential 100 VM 34 0.85 1.021 14733.1 +coin-init-and-mint 1 VM 35 0.839 1.056 31116.2 +coin-init-and-mint 100 VM 35 0.788 1.04 25367 +fungible-asset-mint 1 VM 35 0.861 1.043 27493.2 +fungible-asset-mint 100 VM 35 0.865 1.033 22113.3 +no-op5-signers 1 VM 34 0.825 1.104 41817.6 +token-v2-ambassador-mint 1 VM 35 0.864 1.026 18187.6 +token-v2-ambassador-mint 100 VM 35 0.894 1.033 16597.8 +liquidity-pool-swap 1 VM 34 0.894 1.026 965 +liquidity-pool-swap 100 VM 35 0.893 1.026 11439.4 +liquidity-pool-swap-stable 1 VM 36 0.897 1.018 945.1 +liquidity-pool-swap-stable 100 VM 36 0.824 1.031 11196.4 +deserialize-u256 1 VM 36 0.881 1.06 41062.1 +no-op-fee-payer 1 VM 36 0.863 1.031 2141.3 +no-op-fee-payer 100 VM 36 0.898 1.02 28717.2 """ # when adding a new test, add estimated expected_tps to it, as well as waived=True. diff --git a/testsuite/testcases/src/lib.rs b/testsuite/testcases/src/lib.rs index 92320a3136405..3e3bc617c2fd7 100644 --- a/testsuite/testcases/src/lib.rs +++ b/testsuite/testcases/src/lib.rs @@ -39,6 +39,7 @@ use async_trait::async_trait; use futures::future::join_all; use rand::{rngs::StdRng, SeedableRng}; use std::{ + borrow::Cow, fmt::Write, ops::DerefMut, sync::Arc, @@ -644,6 +645,15 @@ impl Test for CompositeNetworkTest { fn name(&self) -> &'static str { "CompositeNetworkTest" } + + fn reporting_name(&self) -> Cow<'static, str> { + let mut name_builder = self.test.name().to_owned(); + for wrapper in self.wrappers.iter() { + name_builder = format!("{}({})", wrapper.name(), name_builder); + } + name_builder = format!("CompositeNetworkTest({}) with ", name_builder); + Cow::Owned(name_builder) + } } pub(crate) fn generate_onchain_config_blob(data: &[u8]) -> String { diff --git a/third_party/move/move-binary-format/src/builders.rs b/third_party/move/move-binary-format/src/builders.rs new file mode 100644 index 0000000000000..17fae53208aed --- /dev/null +++ b/third_party/move/move-binary-format/src/builders.rs @@ -0,0 +1,321 @@ +// Copyright (c) The Move Contributors +// SPDX-License-Identifier: Apache-2.0 + +use crate::{ + access::{ModuleAccess, ScriptAccess}, + errors::{PartialVMError, PartialVMResult}, + file_format::*, +}; +use move_core_types::{ + account_address::AccountAddress, + identifier::{IdentStr, Identifier}, + language_storage::ModuleId, + vm_status::StatusCode, +}; +use std::collections::{btree_map::Entry, BTreeMap}; + +/// Structure to support incremental additions to an existing `CompiledScript`. +/// For incremental construction, start with `CompiledScript::new()`. +#[derive(Clone, Debug)] +pub struct CompiledScriptBuilder { + script: CompiledScript, + address_pool: BTreeMap, + identifier_pool: BTreeMap, + module_pool: BTreeMap<(AddressIdentifierIndex, IdentifierIndex), usize>, + function_pool: BTreeMap<(ModuleHandleIndex, IdentifierIndex), usize>, + struct_pool: BTreeMap<(ModuleHandleIndex, IdentifierIndex), usize>, + signature_pool: BTreeMap, +} + +/// Checks `idx_map` for key `idx` and returns it if present; otherwise, calls `val` to obtain a new +/// value, which is appended to `pool` and the resulting index stored in `idx_map` for later use. +fn get_or_add_impl( + pool: &mut Vec, + idx_map: &mut BTreeMap, + val: F, + idx: I, +) -> PartialVMResult +where + I: Ord, + F: FnOnce() -> T, +{ + match idx_map.entry(idx) { + Entry::Occupied(i) => Ok(*i.get()), + Entry::Vacant(entry) => { + let idx = pool.len(); + if pool.len() >= TableIndex::MAX as usize { + return Err(PartialVMError::new(StatusCode::INDEX_OUT_OF_BOUNDS)); + } + pool.push(val()); + entry.insert(idx); + Ok(idx) + }, + } +} + +/// Check if `val` is in `idx_map` and returns it if present. Otherwise, append `val` to `pool` and the +/// resulting index stored in `idx_map` for later use. +fn get_or_add( + pool: &mut Vec, + idx_map: &mut BTreeMap, + val: T, +) -> PartialVMResult { + let val_cloned = val.clone(); + get_or_add_impl(pool, idx_map, || val, val_cloned) +} + +impl CompiledScriptBuilder { + pub fn new(script: CompiledScript) -> Self { + let address_pool = script + .address_identifiers() + .iter() + .enumerate() + .map(|(idx, addr)| (*addr, idx)) + .collect(); + let identifier_pool = script + .identifiers() + .iter() + .enumerate() + .map(|(idx, ident)| (ident.to_owned(), idx)) + .collect(); + let module_pool = script + .module_handles() + .iter() + .enumerate() + .map(|(idx, handle)| ((handle.address, handle.name), idx)) + .collect(); + let function_pool = script + .function_handles() + .iter() + .enumerate() + .map(|(idx, handle)| ((handle.module, handle.name), idx)) + .collect(); + let struct_pool = script + .struct_handles() + .iter() + .enumerate() + .map(|(idx, handle)| ((handle.module, handle.name), idx)) + .collect(); + let signature_pool = script + .signatures() + .iter() + .enumerate() + .map(|(idx, signature)| (signature.clone(), idx)) + .collect(); + + Self { + script, + address_pool, + identifier_pool, + module_pool, + function_pool, + struct_pool, + signature_pool, + } + } + + pub fn import_address( + &mut self, + module: &CompiledModule, + idx: AddressIdentifierIndex, + ) -> PartialVMResult { + self.import_address_by_name(module.address_identifier_at(idx)) + } + + pub fn import_address_by_name( + &mut self, + address: &AccountAddress, + ) -> PartialVMResult { + get_or_add( + &mut self.script.address_identifiers, + &mut self.address_pool, + *address, + ) + .map(|idx| AddressIdentifierIndex(idx as u16)) + } + + pub fn import_identifier_by_name( + &mut self, + ident: &IdentStr, + ) -> PartialVMResult { + get_or_add( + &mut self.script.identifiers, + &mut self.identifier_pool, + ident.to_owned(), + ) + .map(|idx| IdentifierIndex(idx as u16)) + } + + pub fn import_identifier( + &mut self, + module: &CompiledModule, + idx: IdentifierIndex, + ) -> PartialVMResult { + self.import_identifier_by_name(module.identifier_at(idx)) + } + + pub fn import_module_by_id(&mut self, module: &ModuleId) -> PartialVMResult { + let address = self.import_address_by_name(module.address())?; + let name = self.import_identifier_by_name(module.name())?; + self.import_module_impl(address, name) + } + + pub fn import_module( + &mut self, + module: &CompiledModule, + idx: ModuleHandleIndex, + ) -> PartialVMResult { + let handle = module.module_handle_at(idx); + let address = self.import_address(module, handle.address)?; + let name = self.import_identifier(module, handle.name)?; + self.import_module_impl(address, name) + } + + fn import_module_impl( + &mut self, + address: AddressIdentifierIndex, + name: IdentifierIndex, + ) -> PartialVMResult { + get_or_add_impl( + &mut self.script.module_handles, + &mut self.module_pool, + || ModuleHandle { address, name }, + (address, name), + ) + .map(|idx| ModuleHandleIndex(idx as u16)) + } + + pub fn import_struct( + &mut self, + module: &CompiledModule, + idx: StructHandleIndex, + ) -> PartialVMResult { + let handle = module.struct_handle_at(idx); + let module_id = self.import_module(module, handle.module)?; + let name = self.import_identifier(module, handle.name)?; + let idx = get_or_add_impl( + &mut self.script.struct_handles, + &mut self.struct_pool, + || StructHandle { + module: module_id, + name, + abilities: handle.abilities, + type_parameters: handle.type_parameters.clone(), + }, + (module_id, name), + )?; + Ok(StructHandleIndex(idx as u16)) + } + + pub fn import_signature_token( + &mut self, + module: &CompiledModule, + sig: &SignatureToken, + ) -> PartialVMResult { + use SignatureToken::*; + Ok(match sig { + U8 => U8, + U16 => U16, + U32 => U32, + U64 => U64, + U128 => U128, + U256 => U256, + Bool => Bool, + Address => Address, + Signer => Signer, + TypeParameter(i) => TypeParameter(*i), + Reference(ty) => Reference(Box::new(self.import_signature_token(module, ty)?)), + MutableReference(ty) => { + MutableReference(Box::new(self.import_signature_token(module, ty)?)) + }, + Vector(ty) => Vector(Box::new(self.import_signature_token(module, ty)?)), + Struct(idx) => Struct(self.import_struct(module, *idx)?), + StructInstantiation(idx, inst_tys) => StructInstantiation( + self.import_struct(module, *idx)?, + inst_tys + .iter() + .map(|sig| self.import_signature_token(module, sig)) + .collect::>>()?, + ), + }) + } + + pub fn import_signatures( + &mut self, + module: &CompiledModule, + idx: SignatureIndex, + ) -> PartialVMResult { + let sig = Signature( + module + .signature_at(idx) + .0 + .iter() + .map(|sig| self.import_signature_token(module, sig)) + .collect::>>()?, + ); + self.add_signature(sig) + } + + pub fn add_signature(&mut self, signature: Signature) -> PartialVMResult { + get_or_add( + &mut self.script.signatures, + &mut self.signature_pool, + signature, + ) + .map(|idx| SignatureIndex(idx as u16)) + } + + pub fn import_function_by_handle( + &mut self, + module: &CompiledModule, + idx: FunctionHandleIndex, + ) -> PartialVMResult { + let handle = module.function_handle_at(idx); + let module_id = self.import_module(module, handle.module)?; + let name = self.import_identifier(module, handle.name)?; + let idx = match self.function_pool.get(&(module_id, name)) { + Some(idx) => Ok(*idx), + None => { + let idx = self.script.function_handles.len(); + if self.script.function_handles.len() >= TableIndex::MAX as usize { + return Err(PartialVMError::new(StatusCode::INDEX_OUT_OF_BOUNDS)); + } + let parameters = self.import_signatures(module, handle.parameters)?; + let return_ = self.import_signatures(module, handle.return_)?; + + self.script.function_handles.push(FunctionHandle { + module: module_id, + name, + parameters, + return_, + type_parameters: handle.type_parameters.clone(), + access_specifiers: handle.access_specifiers.clone(), + }); + self.function_pool.insert((module_id, name), idx); + Ok(idx) + }, + }?; + Ok(FunctionHandleIndex(idx as u16)) + } + + pub fn import_call_by_name( + &mut self, + name: &IdentStr, + module: &CompiledModule, + ) -> PartialVMResult { + for (idx, handle) in module.function_handles().iter().enumerate() { + if module.identifier_at(handle.name) == name { + return self.import_function_by_handle(module, FunctionHandleIndex(idx as u16)); + } + } + Err(PartialVMError::new(StatusCode::LOOKUP_FAILED)) + } + + pub fn into_script(self) -> CompiledScript { + self.script + } + + pub fn as_script(&self) -> &CompiledScript { + &self.script + } +} diff --git a/third_party/move/move-binary-format/src/file_format.rs b/third_party/move/move-binary-format/src/file_format.rs index 1f98c6428c123..8730f84299ecf 100644 --- a/third_party/move/move-binary-format/src/file_format.rs +++ b/third_party/move/move-binary-format/src/file_format.rs @@ -48,7 +48,10 @@ use move_core_types::{ use proptest::{collection::vec, prelude::*, strategy::BoxedStrategy}; use ref_cast::RefCast; use serde::{Deserialize, Serialize}; -use std::{fmt, fmt::Formatter, ops::BitOr}; +use std::{ + fmt::{self, Formatter}, + ops::BitOr, +}; use variant_count::VariantCount; /// Generic index into one of the tables in the binary format. @@ -1426,6 +1429,33 @@ impl SignatureToken { pub fn num_nodes(&self) -> usize { self.preorder_traversal().count() } + + pub fn instantiate(&self, subst_mapping: &[SignatureToken]) -> SignatureToken { + use SignatureToken::*; + match self { + Bool => Bool, + U8 => U8, + U16 => U16, + U32 => U32, + U64 => U64, + U128 => U128, + U256 => U256, + Address => Address, + Signer => Signer, + Vector(ty) => Vector(Box::new(ty.instantiate(subst_mapping))), + Struct(idx) => Struct(*idx), + StructInstantiation(idx, struct_type_args) => StructInstantiation( + *idx, + struct_type_args + .iter() + .map(|ty| ty.instantiate(subst_mapping)) + .collect(), + ), + Reference(ty) => Reference(Box::new(ty.instantiate(subst_mapping))), + MutableReference(ty) => MutableReference(Box::new(ty.instantiate(subst_mapping))), + TypeParameter(idx) => subst_mapping[*idx as usize].clone(), + } + } } /// A `Constant` is a serialized value along with its type. That type will be deserialized by the diff --git a/third_party/move/move-binary-format/src/lib.rs b/third_party/move/move-binary-format/src/lib.rs index 55c65eaeac94a..d9dc260cb1f42 100644 --- a/third_party/move/move-binary-format/src/lib.rs +++ b/third_party/move/move-binary-format/src/lib.rs @@ -14,6 +14,7 @@ pub mod compatibility; pub mod compatibility_legacy; #[macro_use] pub mod errors; +pub mod builders; pub mod check_complexity; pub mod constant; pub mod control_flow_graph; diff --git a/third_party/move/move-core/types/src/language_storage.rs b/third_party/move/move-core/types/src/language_storage.rs index 898fbbcf75506..398caa38ab9ee 100644 --- a/third_party/move/move-core/types/src/language_storage.rs +++ b/third_party/move/move-core/types/src/language_storage.rs @@ -5,7 +5,7 @@ use crate::{ account_address::AccountAddress, identifier::{IdentStr, Identifier}, - parser::{parse_struct_tag, parse_type_tag}, + parser::{parse_module_id, parse_struct_tag, parse_type_tag}, safe_serialize, }; #[cfg(any(test, feature = "fuzzing"))] @@ -226,6 +226,14 @@ impl From for (AccountAddress, Identifier) { } } +impl FromStr for ModuleId { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + parse_module_id(s) + } +} + impl ModuleId { pub fn new(address: AccountAddress, name: Identifier) -> Self { ModuleId { address, name } diff --git a/third_party/move/move-core/types/src/parser.rs b/third_party/move/move-core/types/src/parser.rs index 726c873e10a17..a3bab0ce51e11 100644 --- a/third_party/move/move-core/types/src/parser.rs +++ b/third_party/move/move-core/types/src/parser.rs @@ -5,7 +5,7 @@ use crate::{ account_address::AccountAddress, identifier::{self, Identifier}, - language_storage::{StructTag, TypeTag}, + language_storage::{ModuleId, StructTag, TypeTag}, transaction_argument::TransactionArgument, }; use anyhow::{bail, format_err, Result}; @@ -267,6 +267,22 @@ impl> Parser { }) } + fn parse_module_id(&mut self) -> Result { + Ok(match self.next()? { + Token::Address(addr) => match self.next()? { + Token::ColonColon => match self.next()? { + Token::Name(s) => ModuleId::new( + AccountAddress::from_hex_literal(&addr)?, + Identifier::new(s)?, + ), + tok => bail!("unexpected token {:?}, expected identifier", tok), + }, + tok => bail!("unexpected token {:?}, expected ::", tok), + }, + tok => bail!("unexpected token {:?}, expected address", tok), + }) + } + fn parse_type_tag(&mut self, depth: u8) -> Result { if depth >= crate::safe_serialize::MAX_TYPE_TAG_NESTING { bail!("Exceeded TypeTag nesting limit during parsing: {}", depth); @@ -370,6 +386,10 @@ pub fn parse_type_tags(s: &str) -> Result> { }) } +pub fn parse_module_id(s: &str) -> Result { + parse(s, |parser| parser.parse_module_id()) +} + pub fn parse_type_tag(s: &str) -> Result { parse(s, |parser| parser.parse_type_tag(0)) } diff --git a/third_party/move/move-vm/metrics/Cargo.toml b/third_party/move/move-vm/metrics/Cargo.toml new file mode 100644 index 0000000000000..fe0d169907333 --- /dev/null +++ b/third_party/move/move-vm/metrics/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "move-vm-metrics" +description = "MoveVM metrics" +version = "0.1.0" + +# Workspace inherited keys +authors = { workspace = true } +edition = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } +rust-version = { workspace = true } + +[dependencies] +once_cell = { workspace = true } +prometheus = { workspace = true } diff --git a/third_party/move/move-vm/metrics/src/lib.rs b/third_party/move/move-vm/metrics/src/lib.rs new file mode 100644 index 0000000000000..bc9c62ad29d11 --- /dev/null +++ b/third_party/move/move-vm/metrics/src/lib.rs @@ -0,0 +1,46 @@ +// Copyright (c) The Move Contributors +// SPDX-License-Identifier: Apache-2.0 + +use once_cell::sync::Lazy; +use prometheus::{register_histogram_vec, HistogramTimer, HistogramVec}; + +/// Helper trait to encapsulate [HistogramVec] functionality. Users can use this trait to time +/// different VM parts collecting metrics for different labels. Use wisely as timers do introduce +/// an overhead, so using on a hot path is not recommended. +pub trait Timer { + /// Returns a new timer for the specified label. + fn timer_with_label(&self, label: &str) -> HistogramTimer; +} + +impl Timer for HistogramVec { + fn timer_with_label(&self, label: &str) -> HistogramTimer { + self.with_label_values(&[label]).start_timer() + } +} + +/// Timer that can be used to instrument the VM to collect metrics for different parts of the code. +/// To access and view the metrics, set up where to send them, e.g., `PUSH_METRICS_NAMESPACE` and +/// `PUSH_METRICS_ENDPOINT`. Then, metrics can be seen on Grafana dashboard, for instance. +/// +/// Note: the timer uses "exponential" buckets with a factor of 2. +pub static VM_TIMER: Lazy = Lazy::new(|| { + let factor = 2.0; + let num_buckets = 32; + + let mut next = 1e-9; + let mut buckets = Vec::with_capacity(num_buckets); + for _ in 0..num_buckets { + buckets.push(next); + next *= factor; + } + + register_histogram_vec!( + // Metric name: + "vm_timer_seconds", + // Metric description: + "VM timers", + &["name"], + buckets, + ) + .expect("Registering the histogram should always succeed") +}); diff --git a/third_party/move/move-vm/runtime/Cargo.toml b/third_party/move/move-vm/runtime/Cargo.toml index 260287c2d1ab2..d571a94607332 100644 --- a/third_party/move/move-vm/runtime/Cargo.toml +++ b/third_party/move/move-vm/runtime/Cargo.toml @@ -29,6 +29,7 @@ typed-arena = { workspace = true } move-bytecode-verifier = { path = "../../move-bytecode-verifier" } move-core-types = { path = "../../move-core/types" } +move-vm-metrics = { workspace = true } move-vm-types = { path = "../types" } [dev-dependencies] diff --git a/third_party/move/move-vm/runtime/src/loader/mod.rs b/third_party/move/move-vm/runtime/src/loader/mod.rs index 7ee4d700a8f59..171175aa868cf 100644 --- a/third_party/move/move-vm/runtime/src/loader/mod.rs +++ b/third_party/move/move-vm/runtime/src/loader/mod.rs @@ -65,6 +65,7 @@ use move_binary_format::file_format::{ StructVariantHandleIndex, StructVariantInstantiationIndex, VariantFieldHandleIndex, VariantFieldInstantiationIndex, VariantIndex, }; +use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_types::loaded_data::runtime_types::{StructLayout, TypeBuilder}; pub use script::Script; pub(crate) use script::ScriptCache; @@ -525,6 +526,8 @@ impl LoaderV1 { data_store: &mut TransactionDataCache, module_store: &LegacyModuleStorageAdapter, ) -> VMResult> { + let _timer = VM_TIMER.timer_with_label("Loader::deserialize_and_verify_script"); + let script = data_store.load_compiled_script_to_cache(script, hash_value)?; // Verification: @@ -621,6 +624,8 @@ impl Loader { module_store: &LegacyModuleStorageAdapter, module_storage: &impl ModuleStorage, ) -> VMResult { + let _timer = VM_TIMER.timer_with_label("Loader::load_function"); + let (module, function) = self.load_function_without_type_args( module_id, function_name, @@ -842,6 +847,8 @@ impl LoaderV1 { I: IntoIterator, I::IntoIter: DoubleEndedIterator, { + let _timer = VM_TIMER.timer_with_label("Loader::check_dependencies_and_charge_gas"); + // Initialize the work list (stack) and the map of visited modules. // // TODO: Determine the reserved capacity based on the max number of dependencies allowed. @@ -911,6 +918,8 @@ impl LoaderV1 { return Ok(cached); } + let _timer = VM_TIMER.timer_with_label("Loader::load_module [cache miss]"); + // otherwise, load the transitive closure of the target module let module_ref = self.load_and_verify_module_and_dependencies_and_friends( id, @@ -952,6 +961,9 @@ impl LoaderV1 { // Verify the module if it hasn't been verified before. if VERIFIED_MODULES.lock().get(&hash_value).is_none() { + let _timer = VM_TIMER + .timer_with_label("Loader::load_and_verify_module [verification cache miss]"); + move_bytecode_verifier::verify_module_with_config( &self.vm_config.verifier_config, &module, diff --git a/third_party/move/move-vm/runtime/src/loader/modules.rs b/third_party/move/move-vm/runtime/src/loader/modules.rs index 38619606a66ae..f7faa99f5416d 100644 --- a/third_party/move/move-vm/runtime/src/loader/modules.rs +++ b/third_party/move/move-vm/runtime/src/loader/modules.rs @@ -28,6 +28,7 @@ use move_core_types::{ language_storage::ModuleId, vm_status::StatusCode, }; +use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_types::loaded_data::runtime_types::{ StructIdentifier, StructLayout, StructNameIndex, StructType, Type, }; @@ -289,6 +290,8 @@ impl Module { module: Arc, struct_name_index_map: &StructNameIndexMap, ) -> PartialVMResult { + let _timer = VM_TIMER.timer_with_label("Module::new"); + let id = module.self_id(); let mut structs = vec![]; diff --git a/third_party/move/move-vm/runtime/src/runtime.rs b/third_party/move/move-vm/runtime/src/runtime.rs index e1b67dbc597cb..0ad885bca6c11 100644 --- a/third_party/move/move-vm/runtime/src/runtime.rs +++ b/third_party/move/move-vm/runtime/src/runtime.rs @@ -25,6 +25,7 @@ use move_core_types::{ account_address::AccountAddress, language_storage::TypeTag, value::MoveTypeLayout, vm_status::StatusCode, }; +use move_vm_metrics::{Timer, VM_TIMER}; use move_vm_types::{ gas::GasMeter, loaded_data::runtime_types::Type, @@ -423,6 +424,7 @@ impl VMRuntime { .collect::>>() .map_err(|err| err.finish(Location::Undefined))?; + let timer = VM_TIMER.timer_with_label("Interpreter::entrypoint"); let return_values = Interpreter::entrypoint( function, deserialized_args, @@ -434,6 +436,7 @@ impl VMRuntime { extensions, &self.loader, )?; + drop(timer); let serialized_return_values = self .serialize_return_values(module_store, module_storage, &return_tys, return_values) diff --git a/third_party/move/tools/move-package/src/compilation/compiled_package.rs b/third_party/move/tools/move-package/src/compilation/compiled_package.rs index 22f30d92c00e3..f5a1389ffbb25 100644 --- a/third_party/move/tools/move-package/src/compilation/compiled_package.rs +++ b/third_party/move/tools/move-package/src/compilation/compiled_package.rs @@ -11,7 +11,7 @@ use crate::{ }, Architecture, BuildConfig, CompilerConfig, CompilerVersion, }; -use anyhow::{bail, ensure, Result}; +use anyhow::{bail, ensure, Context, Result}; use colored::Colorize; use itertools::{Either, Itertools}; use move_abigen::{Abigen, AbigenOptions}; @@ -81,6 +81,8 @@ pub struct CompiledPackage { pub root_compiled_units: Vec, /// The output compiled bytecode for dependencies pub deps_compiled_units: Vec<(PackageName, CompiledUnitWithSource)>, + /// Bytecode dependencies of this compiled package + pub bytecode_deps: BTreeMap, // Optional artifacts from compilation // @@ -100,6 +102,7 @@ pub struct OnDiskPackage { pub compiled_package_info: CompiledPackageInfo, /// Dependency names for this package. pub dependencies: Vec, + pub bytecode_deps: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -198,6 +201,8 @@ impl OnDiskCompiledPackage { compiled_package_info: self.package.compiled_package_info.clone(), root_compiled_units, deps_compiled_units, + // TODO: support bytecode deps + bytecode_deps: BTreeMap::new(), compiled_docs, compiled_abis, }) @@ -628,72 +633,75 @@ impl CompiledPackage { let effective_language_version = config.language_version.unwrap_or_default(); effective_compiler_version.check_language_support(effective_language_version)?; - let (file_map, all_compiled_units, optional_global_env) = match config - .compiler_version - .unwrap_or_default() - { - CompilerVersion::V1 => { - let mut paths = src_deps; - paths.push(sources_package_paths.clone()); - let compiler = - Compiler::from_package_paths(paths, bytecode_deps, flags, &known_attributes); - compiler_driver_v1(compiler)? - }, - version @ CompilerVersion::V2_0 | version @ CompilerVersion::V2_1 => { - let to_str_vec = |ps: &[Symbol]| { - ps.iter() - .map(move |s| s.as_str().to_owned()) - .collect::>() - }; - let mut global_address_map = BTreeMap::new(); - for pack in std::iter::once(&sources_package_paths) - .chain(src_deps.iter()) - .chain(bytecode_deps.iter()) - { - for (name, val) in &pack.named_address_map { - if let Some(old) = global_address_map.insert(name.as_str().to_owned(), *val) - { - if old != *val { - let pack_name = pack - .name - .map(|s| s.as_str().to_owned()) - .unwrap_or_else(|| "".to_owned()); - bail!( + let (file_map, all_compiled_units, optional_global_env) = + match config.compiler_version.unwrap_or_default() { + CompilerVersion::V1 => { + let mut paths = src_deps; + paths.push(sources_package_paths.clone()); + let compiler = Compiler::from_package_paths( + paths, + bytecode_deps.clone(), + flags, + &known_attributes, + ); + compiler_driver_v1(compiler)? + }, + version @ CompilerVersion::V2_0 | version @ CompilerVersion::V2_1 => { + let to_str_vec = |ps: &[Symbol]| { + ps.iter() + .map(move |s| s.as_str().to_owned()) + .collect::>() + }; + let mut global_address_map = BTreeMap::new(); + for pack in std::iter::once(&sources_package_paths) + .chain(src_deps.iter()) + .chain(bytecode_deps.iter()) + { + for (name, val) in &pack.named_address_map { + if let Some(old) = + global_address_map.insert(name.as_str().to_owned(), *val) + { + if old != *val { + let pack_name = pack + .name + .map(|s| s.as_str().to_owned()) + .unwrap_or_else(|| "".to_owned()); + bail!( "found remapped address alias `{}` (`{} != {}`) in package `{}`\ , please use unique address aliases across dependencies", name, old, val, pack_name ) + } } } } - } - let mut options = move_compiler_v2::Options { - sources: sources_package_paths - .paths - .iter() - .map(|path| path.as_str().to_owned()) - .collect(), - sources_deps: src_deps.iter().flat_map(|x| to_str_vec(&x.paths)).collect(), - dependencies: bytecode_deps - .iter() - .flat_map(|x| to_str_vec(&x.paths)) - .collect(), - named_address_mapping: global_address_map - .into_iter() - .map(|(k, v)| format!("{}={}", k, v)) - .collect(), - skip_attribute_checks, - known_attributes: known_attributes.clone(), - language_version: Some(effective_language_version), - compiler_version: Some(version), - compile_test_code: flags.keep_testing_functions(), - experiments: config.experiments.clone(), - ..Default::default() - }; - options = options.set_experiment(Experiment::ATTACH_COMPILED_MODULE, true); - compiler_driver_v2(options)? - }, - }; + let mut options = move_compiler_v2::Options { + sources: sources_package_paths + .paths + .iter() + .map(|path| path.as_str().to_owned()) + .collect(), + sources_deps: src_deps.iter().flat_map(|x| to_str_vec(&x.paths)).collect(), + dependencies: bytecode_deps + .iter() + .flat_map(|x| to_str_vec(&x.paths)) + .collect(), + named_address_mapping: global_address_map + .into_iter() + .map(|(k, v)| format!("{}={}", k, v)) + .collect(), + skip_attribute_checks, + known_attributes: known_attributes.clone(), + language_version: Some(effective_language_version), + compiler_version: Some(version), + compile_test_code: flags.keep_testing_functions(), + experiments: config.experiments.clone(), + ..Default::default() + }; + options = options.set_experiment(Experiment::ATTACH_COMPILED_MODULE, true); + compiler_driver_v2(options)? + }, + }; let mut root_compiled_units = vec![]; let mut deps_compiled_units = vec![]; let obtain_package_name = @@ -791,14 +799,24 @@ impl CompiledPackage { }; let compiled_package = CompiledPackage { + root_compiled_units, + deps_compiled_units, + bytecode_deps: bytecode_deps + .iter() + .flat_map(|package| { + let name = package.name.unwrap(); + package.paths.iter().map(move |pkg_path| { + get_addr_from_module_in_package(name, pkg_path.as_str()) + .map(|addr| (name, addr)) + }) + }) + .try_collect()?, compiled_package_info: CompiledPackageInfo { package_name: resolved_package.source_package.package.name, address_alias_instantiation: resolved_package.resolution_table, source_digest: Some(resolved_package.source_digest), build_flags: resolution_graph.build_options.clone(), }, - root_compiled_units, - deps_compiled_units, compiled_docs, compiled_abis, }; @@ -885,6 +903,13 @@ impl CompiledPackage { .collect::>() .into_iter() .collect(), + bytecode_deps: self + .bytecode_deps + .keys() + .copied() + .collect::>() + .into_iter() + .collect(), }, }; @@ -1135,3 +1160,23 @@ pub fn build_and_report_no_exit_v2_driver( Some(env), )) } + +/// Returns the address of the module +fn get_addr_from_module_in_package(pkg_name: Symbol, pkg_path: &str) -> Result { + // Read the bytecode file + let mut bytecode = Vec::new(); + std::fs::File::open(pkg_path) + .context(format!("Failed to open bytecode file for {}", pkg_path)) + .and_then(|mut file| { + // read contents of the file into bytecode + std::io::Read::read_to_end(&mut file, &mut bytecode) + .context(format!("Failed to read bytecode file {}", pkg_path)) + }) + .and_then(|_| { + CompiledModule::deserialize(&bytecode).context(format!( + "Failed to deserialize bytecode file for {}", + pkg_name + )) + }) + .map(|module| NumericalAddress::from_account_address(*module.self_addr())) +} diff --git a/types/src/on_chain_config/aptos_features.rs b/types/src/on_chain_config/aptos_features.rs index e3d3f68b89049..d1297014ad21f 100644 --- a/types/src/on_chain_config/aptos_features.rs +++ b/types/src/on_chain_config/aptos_features.rs @@ -96,7 +96,6 @@ pub enum FeatureFlag { FEDERATED_KEYLESS = 77, TRANSACTION_SIMULATION_ENHANCEMENT = 78, COLLECTION_OWNER = 79, - TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE = 80, ENABLE_LOADER_V2 = 81, } @@ -175,7 +174,6 @@ impl FeatureFlag { FeatureFlag::ENABLE_RESOURCE_ACCESS_CONTROL, FeatureFlag::REJECT_UNSTABLE_BYTECODE_FOR_SCRIPT, FeatureFlag::TRANSACTION_SIMULATION_ENHANCEMENT, - FeatureFlag::TRANSACTION_CONTEXT_HASH_FUNCTION_UPDATE, // TODO(loader_v2): Enable V2 loader. // FeatureFlag::ENABLE_LOADER_V2, ] diff --git a/types/src/transaction/user_transaction_context.rs b/types/src/transaction/user_transaction_context.rs index c43411e74d876..4c9d3f71d3d12 100644 --- a/types/src/transaction/user_transaction_context.rs +++ b/types/src/transaction/user_transaction_context.rs @@ -13,7 +13,6 @@ pub struct UserTransactionContext { chain_id: u8, entry_function_payload: Option, multisig_payload: Option, - raw_transaction_hash: Vec, } impl UserTransactionContext { @@ -26,7 +25,6 @@ impl UserTransactionContext { chain_id: u8, entry_function_payload: Option, multisig_payload: Option, - raw_transaction_hash: Vec, ) -> Self { Self { sender, @@ -37,7 +35,6 @@ impl UserTransactionContext { chain_id, entry_function_payload, multisig_payload, - raw_transaction_hash, } } @@ -72,10 +69,6 @@ impl UserTransactionContext { pub fn multisig_payload(&self) -> Option { self.multisig_payload.clone() } - - pub fn raw_txn_hash(&self) -> Vec { - self.raw_transaction_hash.clone() - } } #[derive(Debug, Clone)]